<?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: Tobiloba Ogundiyan</title>
    <description>The latest articles on DEV Community by Tobiloba Ogundiyan (@tobilobaogundiyan).</description>
    <link>https://dev.to/tobilobaogundiyan</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3020281%2F3a3f3dbd-2a67-4cf3-bae2-615a33199db8.jpeg</url>
      <title>DEV Community: Tobiloba Ogundiyan</title>
      <link>https://dev.to/tobilobaogundiyan</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tobilobaogundiyan"/>
    <language>en</language>
    <item>
      <title>[Boost]</title>
      <dc:creator>Tobiloba Ogundiyan</dc:creator>
      <pubDate>Thu, 06 Nov 2025 20:44:39 +0000</pubDate>
      <link>https://dev.to/tobilobaogundiyan/-15ln</link>
      <guid>https://dev.to/tobilobaogundiyan/-15ln</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/tobilobaogundiyan" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3020281%2F3a3f3dbd-2a67-4cf3-bae2-615a33199db8.jpeg" alt="tobilobaogundiyan"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/tobilobaogundiyan/rethinking-my-aws-admin-access-lessons-learned-from-moving-to-single-sign-on-42gd" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Rethinking My AWS Admin Access: Lessons Learned From Moving to Single-Sign-On&lt;/h2&gt;
      &lt;h3&gt;Tobiloba Ogundiyan ・ Nov 6&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#aws&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>aws</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Tobiloba Ogundiyan</dc:creator>
      <pubDate>Thu, 06 Nov 2025 20:44:39 +0000</pubDate>
      <link>https://dev.to/tobilobaogundiyan/-2eah</link>
      <guid>https://dev.to/tobilobaogundiyan/-2eah</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/tobilobaogundiyan" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3020281%2F3a3f3dbd-2a67-4cf3-bae2-615a33199db8.jpeg" alt="tobilobaogundiyan"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/tobilobaogundiyan/rethinking-my-aws-admin-access-lessons-learned-from-moving-to-single-sign-on-42gd" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Rethinking My AWS Admin Access: Lessons Learned From Moving to Single-Sign-On&lt;/h2&gt;
      &lt;h3&gt;Tobiloba Ogundiyan ・ Nov 6&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#aws&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>aws</category>
    </item>
    <item>
      <title>Rethinking My AWS Admin Access: Lessons Learned From Moving to Single-Sign-On</title>
      <dc:creator>Tobiloba Ogundiyan</dc:creator>
      <pubDate>Thu, 06 Nov 2025 20:41:00 +0000</pubDate>
      <link>https://dev.to/tobilobaogundiyan/rethinking-my-aws-admin-access-lessons-learned-from-moving-to-single-sign-on-42gd</link>
      <guid>https://dev.to/tobilobaogundiyan/rethinking-my-aws-admin-access-lessons-learned-from-moving-to-single-sign-on-42gd</guid>
      <description>&lt;p&gt;Recently, I began auditing my AWS account and I saw how secure I had made it when deploying applications and managing external access. I even wrote a blog post recently on how people should adopt OpenID Connect to authenticate in CI/CD pipelines and deploy their applications to AWS.Recently, I was deploying a Terraform script locally and I could not authenticate to AWS. I figured out my static keys were expired and I needed to generate another. That was when I realized my real admin access wasn’t secure at all. I was still moving static keys around for admin access, and they were permanent.&lt;/p&gt;

&lt;p&gt;I checked the IAM portal to see if I could find a solution to eliminate this completely, and I found a much better approach by using a federated identity through IAM Identity Center. I always thought only organizations should use this since they manage a lot of users, but now I can see why those orgs use this approach. Authenticating with a federated identity can be complex when setting up, but AWS identity center has made it easy and high-level enough to implement even for personal accounts.&lt;/p&gt;

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

&lt;p&gt;I knew I wanted simplicity, traceability, and the ability to eliminate static keys completely. Only a federated identity with Single Sign-On can provide that access, so I decided to implement it. I went deep into IAM Identity Center. I saw that I could create a user that authenticates through AWS’s identity provider, give it some permission sets, and time its permissions for limited access. In this setup, MFA can be enforced on all users with a single click, which is much better than IAM users authenticating with just a username and password.I also saw how I could integrate added extras like creating a separate account for the admin and using SCPs to manage the accounts and also limiting admin privileges with policies, such as blocking the creation of new IAM users. Then I came up with my own flow.&lt;/p&gt;

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

&lt;p&gt;I experimented with a lot of things. I gave myself no permissions and created another role to elevate only when i need to perform admin tasks. Logged in as admin and saw I couldn’t access anything. All console dashboards were showing “access denied,” and I realized that was too extreme. That was when I started seeing how zero trust actually works.&lt;/p&gt;

&lt;p&gt;I tried again, increased little privileges, and switched to read-only access. Everything worked, but the admin couldn’t still create anything. Then I logged in to the console CloudShell and assumed the AdministratorAccess role which i created alongside to elevate priviledges when i need to perform admin tasks. Now the temporary tokens came into play which is valid for only 1 hour. I had to put them in manually to access any resource, and that’s when I realized how critical it is to balance security and ease of use.&lt;/p&gt;

&lt;p&gt;Checking the roles, I saw the permissions assigned by the identity provider were also short-lived, and there was no need to limit them further since they would be rotated automatically. That’s when I saw it was AWS Security Token Service (STS) still giving access behind the scenes to the SSO.&lt;/p&gt;

&lt;h3&gt;
  
  
  What I Eventually Arrived At
&lt;/h3&gt;

&lt;p&gt;I eliminated the extra admin role I created for admin to assume because that was redundant. I went back to IAM Identity Center permissions and changed access from read-only to admin, but limited the session to 1 hour. This isn’t fully zero trust, but the admin still has to verify every hour if they are truly admin. It’s better than IAM users that give implicit trust. This setup is different because admin is never trusted it’s always verified.the fact that the sessions are logged through cloudtrail means the administrator actions can also be audited if warranted.&lt;/p&gt;

&lt;p&gt;It’s like asking a police officer to always identify who he is by showing his badge. If he can’t, he doesn’t get access. So here’s the high-level overview I arrived at.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo53ajg0u4910xpxd7y30.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo53ajg0u4910xpxd7y30.png" alt="Tobiloba Ogundiyan  diagram showing modern authentication flow in AWS IAM&amp;lt;br&amp;gt;
this flow is what i ended up building for my admin access using aws identity center instead of iam users." width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;everything starts with the cloud admin logging in through the sso portal. mfa is enforced first thing so no one just walks in without verification. once i’m in, aws identity center takes over, assigns the right permission set and handles federation internally using saml. i don’t manage any credentials or keys myself anymore, aws does it all behind the scenes.&lt;/p&gt;

&lt;p&gt;after that, sts kicks in and gives me temporary credentials. these are short lived, valid for just about an hour. once they expire, i have to re-authenticate again through sso. that’s where the zero trust idea really comes in. the admin role i assume is AWSReservedSSO_AdministratorAccess, and it only gives me access for that short window. when the session ends, that access disappears.&lt;/p&gt;

&lt;p&gt;on the governance side, scps are set to restrict what even admin can do, like creating another identity center instance. cloudtrail logs every single action i take so i can trace anything later. cloudwatch helps with visualizing and alerting on those logs when something unusual happens.&lt;/p&gt;

&lt;p&gt;so at the end of the day, this flow gives me full control when i need it, but zero standing privileges when i don’t.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Realization Moment
&lt;/h3&gt;

&lt;p&gt;Coming back to my failed Terraform script, I checked AWS docs, configured local SSO, created an admin profile, and was able to authenticate using the single-sign-on from the browser to the CLI and that was it. No access keys, sessions are timed. Now I have one hour to do what I need before I’m asked to show my badge again.&lt;/p&gt;

&lt;p&gt;If you still think IAM users are enough or still moving static keys , and you’re still using them because your personal AWS account is “just for labs,” think about security, reliability, and how things are done the modern way. When the newer route is clearly better than the old one, take it ,no matter the complexity.&lt;/p&gt;

</description>
      <category>aws</category>
    </item>
    <item>
      <title>if you are still using static keys in your github actions pipeline to access AWS. then you need to read this to fix your workflows</title>
      <dc:creator>Tobiloba Ogundiyan</dc:creator>
      <pubDate>Thu, 06 Nov 2025 18:48:48 +0000</pubDate>
      <link>https://dev.to/tobilobaogundiyan/if-you-are-still-using-static-keys-in-your-github-actions-pipeline-to-access-aws-then-you-need-to-ood</link>
      <guid>https://dev.to/tobilobaogundiyan/if-you-are-still-using-static-keys-in-your-github-actions-pipeline-to-access-aws-then-you-need-to-ood</guid>
      <description>&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/tobilobaogundiyan/accessing-aws-in-github-actions-using-oidc-h72" class="crayons-story__hidden-navigation-link"&gt;Accessing AWS in Github Actions Using OIDC&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="/tobilobaogundiyan" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3020281%2F3a3f3dbd-2a67-4cf3-bae2-615a33199db8.jpeg" alt="tobilobaogundiyan profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/tobilobaogundiyan" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Tobiloba Ogundiyan
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Tobiloba Ogundiyan
                
              
              &lt;div id="story-author-preview-content-2998717" 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="/tobilobaogundiyan" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3020281%2F3a3f3dbd-2a67-4cf3-bae2-615a33199db8.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Tobiloba Ogundiyan&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/tobilobaogundiyan/accessing-aws-in-github-actions-using-oidc-h72" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Nov 6 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/tobilobaogundiyan/accessing-aws-in-github-actions-using-oidc-h72" id="article-link-2998717"&gt;
          Accessing AWS in Github Actions Using OIDC
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/tobilobaogundiyan"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;tobilobaogundiyan&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/aws"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;aws&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/githubactions"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;githubactions&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/cicd"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;cicd&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/tobilobaogundiyan/accessing-aws-in-github-actions-using-oidc-h72" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.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;5&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/tobilobaogundiyan/accessing-aws-in-github-actions-using-oidc-h72#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add 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;
            6 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

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

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

&lt;/div&gt;




</description>
      <category>tobilobaogundiyan</category>
      <category>aws</category>
      <category>githubactions</category>
      <category>cicd</category>
    </item>
    <item>
      <title>Accessing AWS in Github Actions Using OIDC</title>
      <dc:creator>Tobiloba Ogundiyan</dc:creator>
      <pubDate>Thu, 06 Nov 2025 18:47:36 +0000</pubDate>
      <link>https://dev.to/tobilobaogundiyan/accessing-aws-in-github-actions-using-oidc-h72</link>
      <guid>https://dev.to/tobilobaogundiyan/accessing-aws-in-github-actions-using-oidc-h72</guid>
      <description>&lt;p&gt;In CI/CD pipelines, the normal way to access AWS resources for deployment is to generate long-lived access keys in IAM and store those keys in the repository, but this approach has the following flaws:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;The keys are long-lived and if they ever leak, an attacker can use them to access your AWS account.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The same static keys get reused across many jobs and branches, so it is hard to trace which workflow actually did what.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rotating or expiring those keys requires a manual process, so they usually stay active way longer than they should.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;OpenID Connect (OIDC), an identity layer on top of OAuth 2.0, solves this by letting GitHub Actions request short-lived, on-demand credentials from AWS using a trusted federation instead of storing static keys. This approach gives the following benefits:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;No long-lived secrets in the repo. There are no hardcoded AWS access keys in GitHub at all.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Short-lived credentials. AWS only issues temporary credentials for that specific job, and they expire automatically after the job finishes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fine-grained access. You can scope which repo, branch, or even workflow is allowed to assume a specific IAM role.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Auditability. In CloudTrail, you can see exactly which workflow assumed which role, so it’s easier to trace changes.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Lower blast radius. If one repo is compromised, it can’t reuse credentials from another repo or environment.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Prerequisites&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;In this article, we will configure AWS to trust GitHub via OIDC, create an IAM role with read-only access to S3, and let a GitHub Actions workflow assume that role. You will need these resources to proceed:&lt;/p&gt;

&lt;p&gt;An AWS account with the following permissions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
 iam:CreateOpenIDconnectProvider
 iam:CreateRole
 iam:PutRolePolicy or attached managed policies
For less hassle, a root account should do.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Create a new GitHub repository in your account and name it aws-oidc. Leave it empty for now with no code and no workflow. I also created a repo for this article here: github.com/t0gun/aws-oidc. We will add the workflow file later after we configure AWS.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  High-Level Architecture
&lt;/h4&gt;

&lt;p&gt;Below is the high-level flow of how GitHub uses OIDC to get temporary credentials for our Actions runner.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fin4ug1cxgqq2sewkw9wn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fin4ug1cxgqq2sewkw9wn.png" alt="Tobiloba Ogundiyan High level overview of OIDC with github actions and AWS" width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At a high level, the workflow runner requests an OIDC token, AWS STS verifies it against the trust policy, and then returns short-lived credentials that match the IAM role we created. Now let’s build this step by step.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 1: Add GitHub as an OIDC identity provider in AWS
&lt;/h4&gt;

&lt;p&gt;You can either use the management console or the AWS CloudShell (CLI) to do this.&lt;/p&gt;

&lt;p&gt;Using the AWS Management Console:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Open the IAM console and in the left navigation choose Identity Providers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once you are in that pane, proceed to add a provider, for the provider type choose OpenID connect.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For the provider URL: Use &lt;a href="https://token.actions.githubusercontent.com" rel="noopener noreferrer"&gt;https://token.actions.githubusercontent.com&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For the "Audience": Use sts.amazonaws.com&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Save&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At this point, AWS now trusts the GitHub OIDC provider.&lt;/p&gt;

&lt;p&gt;Using the AWS CLI:&lt;/p&gt;

&lt;p&gt;Paste this in the CloudShell:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws iam create-open-id-connect-provider \
  --url "https://token.actions.githubusercontent.com" \
  --client-id-list "sts.amazonaws.com" \
  --thumbprint-list "6938fd4d98bab03faadb97b34396831e3780aea1"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The --client-id-list value is what the audience must be, and the thumbprint is GitHub’s root CA fingerprint. We can also confirm if it has been added using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws iam list-open-id-connect-providers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should receive a response of your ARN (Amazon Resource Name) similar to this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    "OpenIDConnectProviderList": [
        {
            "Arn": "arn:aws:iam::555055555555:oidc-provider/token.actions.githubusercontent.com"
        }
    ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Step 2: Create the IAM Role for GitHub Actions
&lt;/h4&gt;

&lt;p&gt;Now that AWS trusts GitHub as an OIDC identity provider, we need to create an IAM role that GitHub Actions can assume. This role does two things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Defines the trust policy: which repo and branch are allowed to assume it &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Defines the permissions: what that workflow is actually allowed to do in AWS&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For this demo, we will give only S3 ReadOnly access so we can test the setup. For simplicity we will only use the AWS management console to create this role.&lt;/p&gt;

&lt;p&gt;Using the AWS Console:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;In the IAM console, go to “Roles” and click “Create role.”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For trusted entity type, choose “Web identity.”&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For identity provider, select the GitHub provider you created in Step 1 token.actions.githubusercontent.com and the audience sts.amazonaws.com&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For GitHub organization / user: set this to your GitHub username (for example, t0gun).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For Github Respository: Use the repo you created for this, aws-oidc.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We should leave the branch as is *, this gives us flexibility to run our jobs from any branch.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Attach permissions. For demo, attach AmazonS3ReadOnlyAccess.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Name the role something like github-oidc-deploy-role and save it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Copy the Role ARN. We will use that in the GitHub Actions workflow.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now open the role, check trust relationships and open the trust policy it should look this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::555066115752:oidc-provider/token.actions.githubusercontent.com"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringEquals": {
                    "token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
                },
                "StringLike": {
                    "token.actions.githubusercontent.com:sub": [
                        "repo:t0gun/aws-oidc:*"
                    ]
                }
            }
        }
    ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Principal.Federated is the OIDC provider we created in Step 1.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Action is sts:AssumeRoleWithWebIdentity, which is how GitHub asks AWS for short-lived credentials.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;aud must match sts.amazonaws.com, so AWS knows this request is meant for STS.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;sub is basically “who is calling.” In this case we’re allowing any branch from the repo t0gun/aws-oidc.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example, if you only want to allow the main branch to assume this role, you can tighten the trust policy by replacing the sub condition with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"token.actions.githubusercontent.com:sub": "repo:t0gun/aws-oidc:ref:refs/heads/main"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means only workflows running from the main branch of t0gun/aws-oidc will get credentials. All other branches will be denied.&lt;/p&gt;

&lt;h4&gt;
  
  
  Step 3: Create the Github Actions Workflow
&lt;/h4&gt;

&lt;p&gt;Now we will create a Github Actions workflow in the aws-oidc repo that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Requests temporary credentials from AWS using OIDC&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Assumes the IAM role we just created&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Runs an AWS command to prove it works&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Clone your repo locally, create a file inside the repo at .github/workflows/oidc-test.yml with this content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: oidc-test

on:  
  workflow_dispatch  

permissions:
  id-token: write    # required for OIDC
  contents: read     # allow checkout

jobs:
  aws-access-test:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repo
        uses: actions/checkout@v4

      - name: Configure AWS credentials using OIDC
        uses: aws-actions/configure-aws-credentials@v4
        with:
          role-to-assume: {your own arn role here}
          role-session-name: github-actions-session
          aws-region: us-east-1 # or any region you work in

      - name: Verify AWS identity
        run: |
          aws sts get-caller-identity
          aws s3 ls
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here are the important parts:&lt;/p&gt;

&lt;p&gt;permission.id-token: write (this is what allows the workflow to request the OIDC token from github).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;configure-aws-credentials@v4: This action calls sts:AssumeRoleWithWebIdentity behind the scenes. It uses the trust policy you defined in IAM&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;role-to-assume: This must match the Role ARN from the role you just created in Step 2.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;aws sts get-caller-identity: This prints which IAM role the job is currently using. You should see your role name here, not root and not an IAM user.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;aws s3 ls: This should work because you attached AmazonS3ReadOnlyAccess. If STS or the trust policy is broken, this will fail.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After you commit this file, push it to GitHub. Since the workflow is triggered with workflow_dispatch, you need to run it manually in the Actions tab.When it finishes successfully, you’ve proved OIDC is working and GitHub Actions got temporary AWS credentials with no long-lived access keys stored in the repo.after running mine here are the results from the image below&lt;/p&gt;

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

&lt;p&gt;If pipeline fails please feel free to review the steps and also check out my own aws-oidc public repo.&lt;/p&gt;

&lt;h4&gt;
  
  
  Conclusion
&lt;/h4&gt;

&lt;p&gt;This setup removes long-lived AWS keys from your CI/CD pipeline and replaces them with short-lived, scoped credentials issued on demand through OIDC. You get least privilege, auditability, and no shared secrets across repos. This is the baseline for doing secure delivery in AWS with GitHub Actions, and it’s what I expect teams to be doing in 2025.&lt;/p&gt;

</description>
      <category>tobilobaogundiyan</category>
      <category>aws</category>
      <category>githubactions</category>
      <category>cicd</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Tobiloba Ogundiyan</dc:creator>
      <pubDate>Wed, 29 Oct 2025 22:31:28 +0000</pubDate>
      <link>https://dev.to/tobilobaogundiyan/-3p0h</link>
      <guid>https://dev.to/tobilobaogundiyan/-3p0h</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/tobilobaogundiyan" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3020281%2F3a3f3dbd-2a67-4cf3-bae2-615a33199db8.jpeg" alt="tobilobaogundiyan"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/tobilobaogundiyan/the-sender-policy-framework-bare-bone-essentials-3j24" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;The Sender Policy Framework: Bare Bone Essentials&lt;/h2&gt;
      &lt;h3&gt;Tobiloba Ogundiyan ・ May 20&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#cybersecurity&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#security&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#networking&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#network&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>cybersecurity</category>
      <category>security</category>
      <category>networking</category>
      <category>network</category>
    </item>
    <item>
      <title>For anyone new to testing in Go. This article will take give you a solid foundation on your testing journey 

#golang #tdd</title>
      <dc:creator>Tobiloba Ogundiyan</dc:creator>
      <pubDate>Wed, 29 Oct 2025 22:14:45 +0000</pubDate>
      <link>https://dev.to/tobilobaogundiyan/for-anyone-new-to-testing-in-go-this-article-will-take-give-you-a-solid-foundation-on-your-testing-16h8</link>
      <guid>https://dev.to/tobilobaogundiyan/for-anyone-new-to-testing-in-go-this-article-will-take-give-you-a-solid-foundation-on-your-testing-16h8</guid>
      <description>&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/tobilobaogundiyan/testing-real-world-go-code-table-driven-tests-subtests-and-coverage-n45" class="crayons-story__hidden-navigation-link"&gt;Testing Real-World Go Code: Table-Driven Tests, Subtests and Coverage&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="/tobilobaogundiyan" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3020281%2F3a3f3dbd-2a67-4cf3-bae2-615a33199db8.jpeg" alt="tobilobaogundiyan profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/tobilobaogundiyan" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Tobiloba Ogundiyan
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Tobiloba Ogundiyan
                
              
              &lt;div id="story-author-preview-content-2452051" 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="/tobilobaogundiyan" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3020281%2F3a3f3dbd-2a67-4cf3-bae2-615a33199db8.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Tobiloba Ogundiyan&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/tobilobaogundiyan/testing-real-world-go-code-table-driven-tests-subtests-and-coverage-n45" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 1 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/tobilobaogundiyan/testing-real-world-go-code-table-driven-tests-subtests-and-coverage-n45" id="article-link-2452051"&gt;
          Testing Real-World Go Code: Table-Driven Tests, Subtests and Coverage
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/testing"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;testing&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/go"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;go&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/tdd"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;tdd&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/tobilobaogundiyan/testing-real-world-go-code-table-driven-tests-subtests-and-coverage-n45" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.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;7&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/tobilobaogundiyan/testing-real-world-go-code-table-driven-tests-subtests-and-coverage-n45#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


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

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

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

&lt;/div&gt;




</description>
      <category>testing</category>
      <category>go</category>
      <category>tdd</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Insightful Post on regaining back your focus in this current AI age</title>
      <dc:creator>Tobiloba Ogundiyan</dc:creator>
      <pubDate>Sat, 24 May 2025 04:49:30 +0000</pubDate>
      <link>https://dev.to/tobilobaogundiyan/insightful-post-on-regaining-back-your-focus-in-this-current-ai-age-12p1</link>
      <guid>https://dev.to/tobilobaogundiyan/insightful-post-on-regaining-back-your-focus-in-this-current-ai-age-12p1</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/teamcamp" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F10233%2Fa214d929-4a86-43e3-8a25-ba25c166bdae.png" alt="Teamcamp" width="800" height="800"&gt;
      &lt;div class="ltag__link__user__pic"&gt;
        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2667579%2Feca818ae-fd03-4e29-8782-cc78cc40a86e.jpg" alt="" width="800" height="800"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/teamcamp/the-developers-guide-to-focus-in-the-age-of-ai-distraction-3k18" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;The Developer’s Guide to Focus in the Age of AI Distraction&lt;/h2&gt;
      &lt;h3&gt;Pratham naik for Teamcamp ・ May 19&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#programming&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#beginners&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#productivity&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>webdev</category>
      <category>programming</category>
      <category>beginners</category>
      <category>productivity</category>
    </item>
    <item>
      <title>A good post on evil twin attacks</title>
      <dc:creator>Tobiloba Ogundiyan</dc:creator>
      <pubDate>Tue, 20 May 2025 12:19:35 +0000</pubDate>
      <link>https://dev.to/tobilobaogundiyan/a-good-post-on-evil-twin-attacks-70c</link>
      <guid>https://dev.to/tobilobaogundiyan/a-good-post-on-evil-twin-attacks-70c</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/tanyonghe/beware-the-evil-twin-exploring-wi-fi-impersonation-attacks-4chd" class="crayons-story__hidden-navigation-link"&gt;Beware the Evil Twin: Exploring Wi-Fi Impersonation Attacks&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="/tanyonghe" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F243440%2F446ec57f-4a50-4e2a-bdcd-3453f93cd951.jpeg" alt="tanyonghe profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/tanyonghe" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Tan Yong He
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Tan Yong He
                
              
              &lt;div id="story-author-preview-content-2504495" 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="/tanyonghe" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F243440%2F446ec57f-4a50-4e2a-bdcd-3453f93cd951.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Tan Yong He&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/tanyonghe/beware-the-evil-twin-exploring-wi-fi-impersonation-attacks-4chd" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 20 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/tanyonghe/beware-the-evil-twin-exploring-wi-fi-impersonation-attacks-4chd" id="article-link-2504495"&gt;
          Beware the Evil Twin: Exploring Wi-Fi Impersonation Attacks
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/cybersecurity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;cybersecurity&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/security"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;security&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/networking"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;networking&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/privacy"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;privacy&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/tanyonghe/beware-the-evil-twin-exploring-wi-fi-impersonation-attacks-4chd" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.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;12&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/tanyonghe/beware-the-evil-twin-exploring-wi-fi-impersonation-attacks-4chd#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              3&lt;span class="hidden s:inline"&gt; comments&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"&gt;
                

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

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

&lt;/div&gt;


</description>
      <category>cybersecurity</category>
      <category>security</category>
      <category>networking</category>
      <category>privacy</category>
    </item>
    <item>
      <title>Solid write-up on calling gRPC methods dynamically</title>
      <dc:creator>Tobiloba Ogundiyan</dc:creator>
      <pubDate>Tue, 20 May 2025 04:02:04 +0000</pubDate>
      <link>https://dev.to/tobilobaogundiyan/solid-write-up-on-calling-grpc-methods-dynamically-4cfi</link>
      <guid>https://dev.to/tobilobaogundiyan/solid-write-up-on-calling-grpc-methods-dynamically-4cfi</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/dmo2000/how-to-call-grpc-methods-dynamically-in-go-2h7f" class="crayons-story__hidden-navigation-link"&gt;How to Call gRPC Methods Dynamically in Go&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="/dmo2000" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1499363%2F2a1eff26-cc5b-49ff-993c-822c6e81a2d0.jpeg" alt="dmo2000 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/dmo2000" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Daniel Marques
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Daniel Marques
                
              
              &lt;div id="story-author-preview-content-2475890" 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="/dmo2000" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1499363%2F2a1eff26-cc5b-49ff-993c-822c6e81a2d0.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Daniel Marques&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/dmo2000/how-to-call-grpc-methods-dynamically-in-go-2h7f" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 10 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/dmo2000/how-to-call-grpc-methods-dynamically-in-go-2h7f" id="article-link-2475890"&gt;
          How to Call gRPC Methods Dynamically in Go
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/grpc"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;grpc&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/go"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;go&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/dynamic"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;dynamic&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/apitesting"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;apitesting&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/dmo2000/how-to-call-grpc-methods-dynamically-in-go-2h7f" 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;1&lt;span class="hidden s:inline"&gt; reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/dmo2000/how-to-call-grpc-methods-dynamically-in-go-2h7f#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add 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"&gt;
                

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

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

&lt;/div&gt;


</description>
      <category>grpc</category>
      <category>go</category>
      <category>dynamic</category>
      <category>apitesting</category>
    </item>
    <item>
      <title>For anyone new to benchmarking in Go</title>
      <dc:creator>Tobiloba Ogundiyan</dc:creator>
      <pubDate>Tue, 20 May 2025 03:44:51 +0000</pubDate>
      <link>https://dev.to/tobilobaogundiyan/for-anyone-new-to-benchmarking-in-go-4d8e</link>
      <guid>https://dev.to/tobilobaogundiyan/for-anyone-new-to-benchmarking-in-go-4d8e</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/ankitmalikg/golang-how-to-do-benchmarking-4h20" class="crayons-story__hidden-navigation-link"&gt;Golang - How to do Benchmarking&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="/ankitmalikg" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F697325%2Fb7604217-a4e4-4b07-9ae5-cac52846f252.png" alt="ankitmalikg profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/ankitmalikg" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Ankit malik
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Ankit malik
                
              
              &lt;div id="story-author-preview-content-2490972" 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="/ankitmalikg" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F697325%2Fb7604217-a4e4-4b07-9ae5-cac52846f252.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Ankit malik&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/ankitmalikg/golang-how-to-do-benchmarking-4h20" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 15 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/ankitmalikg/golang-how-to-do-benchmarking-4h20" id="article-link-2490972"&gt;
          Golang - How to do Benchmarking
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/go"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;go&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/benchmarking"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;benchmarking&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/ankitmalikg/golang-how-to-do-benchmarking-4h20" 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/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.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;9&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/ankitmalikg/golang-how-to-do-benchmarking-4h20#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


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

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

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

&lt;/div&gt;


</description>
      <category>go</category>
      <category>benchmarking</category>
    </item>
    <item>
      <title>Insightful</title>
      <dc:creator>Tobiloba Ogundiyan</dc:creator>
      <pubDate>Tue, 20 May 2025 03:40:37 +0000</pubDate>
      <link>https://dev.to/tobilobaogundiyan/insightful-1fog</link>
      <guid>https://dev.to/tobilobaogundiyan/insightful-1fog</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/shrsv/5-golang-libraries-youll-wish-you-knew-sooner-4bmj" class="crayons-story__hidden-navigation-link"&gt;5 Golang Libraries You’ll Wish You Knew Sooner&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="/shrsv" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1001514%2F17b7d334-44b1-417a-9268-346e6a34988a.jpg" alt="shrsv profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/shrsv" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Shrijith Venkatramana
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Shrijith Venkatramana
                
              
              &lt;div id="story-author-preview-content-2499851" 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="/shrsv" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1001514%2F17b7d334-44b1-417a-9268-346e6a34988a.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Shrijith Venkatramana&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/shrsv/5-golang-libraries-youll-wish-you-knew-sooner-4bmj" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 18 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/shrsv/5-golang-libraries-youll-wish-you-knew-sooner-4bmj" id="article-link-2499851"&gt;
          5 Golang Libraries You’ll Wish You Knew Sooner
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&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;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/go"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;go&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/productivity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;productivity&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/shrsv/5-golang-libraries-youll-wish-you-knew-sooner-4bmj" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.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;23&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/shrsv/5-golang-libraries-youll-wish-you-knew-sooner-4bmj#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


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

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

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

&lt;/div&gt;


</description>
      <category>programming</category>
      <category>beginners</category>
      <category>go</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
