<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Nico Wickersheim</title>
    <description>The latest articles on Forem by Nico Wickersheim (@wickenico).</description>
    <link>https://forem.com/wickenico</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%2F625357%2Fda1af720-85c0-42d7-bc26-a10cce9f9717.JPG</url>
      <title>Forem: Nico Wickersheim</title>
      <link>https://forem.com/wickenico</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/wickenico"/>
    <language>en</language>
    <item>
      <title>How to develop a MacOS App easily with Wails</title>
      <dc:creator>Nico Wickersheim</dc:creator>
      <pubDate>Sun, 13 Jul 2025 22:11:58 +0000</pubDate>
      <link>https://forem.com/wickenico/how-to-develop-a-macos-app-easily-with-wails-19eb</link>
      <guid>https://forem.com/wickenico/how-to-develop-a-macos-app-easily-with-wails-19eb</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/wickenico/i-solved-every-mac-developers-homebrew-frustration-with-this-open-source-tool-4f7n" class="crayons-story__hidden-navigation-link"&gt;I Solved Every Mac Developer's Homebrew Frustration with This Open Source Tool&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="/wickenico" 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%2F625357%2Fda1af720-85c0-42d7-bc26-a10cce9f9717.JPG" alt="wickenico profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/wickenico" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Nico Wickersheim
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Nico Wickersheim
                
              
              &lt;div id="story-author-preview-content-2684737" 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="/wickenico" 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%2F625357%2Fda1af720-85c0-42d7-bc26-a10cce9f9717.JPG" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Nico Wickersheim&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/wickenico/i-solved-every-mac-developers-homebrew-frustration-with-this-open-source-tool-4f7n" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 13 '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/wickenico/i-solved-every-mac-developers-homebrew-frustration-with-this-open-source-tool-4f7n" id="article-link-2684737"&gt;
          I Solved Every Mac Developer's Homebrew Frustration with This Open Source Tool
        &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/react"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;react&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/homebrew"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;homebrew&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/wickenico/i-solved-every-mac-developers-homebrew-frustration-with-this-open-source-tool-4f7n#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>go</category>
      <category>react</category>
      <category>homebrew</category>
      <category>programming</category>
    </item>
    <item>
      <title>I Solved Every Mac Developer's Homebrew Frustration with This Open Source Tool</title>
      <dc:creator>Nico Wickersheim</dc:creator>
      <pubDate>Sun, 13 Jul 2025 22:06:22 +0000</pubDate>
      <link>https://forem.com/wickenico/i-solved-every-mac-developers-homebrew-frustration-with-this-open-source-tool-4f7n</link>
      <guid>https://forem.com/wickenico/i-solved-every-mac-developers-homebrew-frustration-with-this-open-source-tool-4f7n</guid>
      <description>&lt;p&gt;I Built a Modern GUI for Homebrew in Go + React - Here's What I Learned&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"brew list | grep something... brew info package... brew doctor... brew update..."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Sound familiar? If you're a Mac developer, you've probably typed these commands thousands of times. While I love the terminal, managing 50+ Homebrew packages through CLI got tedious. So I built &lt;strong&gt;WailBrew&lt;/strong&gt; - a modern desktop GUI that makes Homebrew management actually enjoyable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The result?&lt;/strong&gt; A sleek desktop app that's already helping developers worldwide manage their packages with zero command-line friction.&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%2Fqxwai620kbawo07otswz.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%2Fqxwai620kbawo07otswz.png" alt="WailBrew Screenshot" width="800" height="639"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem Every Mac Developer Faces
&lt;/h2&gt;

&lt;p&gt;Let's be honest - Homebrew's CLI is powerful but not always convenient:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Forgetting commands&lt;/strong&gt;: Was it &lt;code&gt;brew list&lt;/code&gt; or &lt;code&gt;brew ls&lt;/code&gt;?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Package discovery&lt;/strong&gt;: No easy way to browse what's installed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Update management&lt;/strong&gt;: Checking outdated packages is a multi-step process&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Information overload&lt;/strong&gt;: &lt;code&gt;brew info&lt;/code&gt; dumps everything in terminal format&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No visual feedback&lt;/strong&gt;: Is that update still running?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Enter WailBrew: Modern Desktop App Architecture
&lt;/h2&gt;

&lt;p&gt;I chose an interesting tech stack that's perfect for desktop apps in 2024:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Backend: Go&lt;/strong&gt; 🐹&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Wails v2 framework for desktop app development&lt;/li&gt;
&lt;li&gt;Direct system calls to Homebrew CLI&lt;/li&gt;
&lt;li&gt;Efficient package management and system diagnostics&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Frontend: React + TypeScript&lt;/strong&gt; ⚛️&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Modern React 19 with hooks&lt;/li&gt;
&lt;li&gt;Vite for lightning-fast development&lt;/li&gt;
&lt;li&gt;Clean, responsive UI that feels native&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why Wails?&lt;/strong&gt; Unlike Electron, Wails uses the system's native webview, resulting in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Smaller bundle size&lt;/strong&gt; (5MB vs 150MB+ for Electron)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better performance&lt;/strong&gt; (no Chrome overhead)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Native OS integration&lt;/strong&gt; (menus, dialogs, etc.)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Building Challenges &amp;amp; Solutions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Challenge 1: Real-time Package Updates
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: Homebrew operations can take minutes. Users need feedback.&lt;br&gt;
&lt;strong&gt;Solution&lt;/strong&gt;: Implemented streaming command output with Go channels and WebSocket-like communication.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;UpdateBrewPackage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;packageName&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;exec&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;brewPath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"upgrade"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;packageName&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;// Stream output in real-time&lt;/span&gt;
    &lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StdoutPipe&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;scanner&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;bufio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewScanner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;scanner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Scan&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c"&gt;// Send progress to frontend&lt;/span&gt;
        &lt;span class="n"&gt;rt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;EventsEmit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"update-progress"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;scanner&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Update completed"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Challenge 2: Cross-platform Homebrew Detection
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: Homebrew installs in different locations (Intel vs Apple Silicon).&lt;br&gt;
&lt;strong&gt;Solution&lt;/strong&gt;: Dynamic path detection with fallbacks.&lt;/p&gt;

&lt;h3&gt;
  
  
  Challenge 3: Package Information Parsing
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem&lt;/strong&gt;: Homebrew outputs aren't always JSON-friendly.&lt;br&gt;
&lt;strong&gt;Solution&lt;/strong&gt;: Built robust parsers that handle edge cases and malformed data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design Philosophy: Familiar Yet Modern
&lt;/h2&gt;

&lt;p&gt;I studied popular Mac apps like Finder, System Preferences, and even Cakebrew (the inspiration) to create something that feels native:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Design Decisions:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sidebar navigation&lt;/strong&gt;: Familiar pattern for Mac users&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Table-based package listing&lt;/strong&gt;: Sortable, searchable, scannable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Confirmation dialogs&lt;/strong&gt;: Prevent accidental deletions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-time status updates&lt;/strong&gt;: Progress bars and live logs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The entire UI is built with React - no heavy UI frameworks needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code Architecture &amp;amp; Patterns
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Frontend State Management
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;packages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setPackages&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;PackageEntry&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;([]);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;selectedPackage&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setSelectedPackage&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;PackageEntry&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;currentView&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setCurrentView&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;packages&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Real-time updates from Go backend&lt;/span&gt;
&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;EventsOn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;package-updated&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;setPackages&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prev&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;prev&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pkg&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 
            &lt;span class="nx"&gt;pkg&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;pkg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;pkg&lt;/span&gt;
        &lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Backend API Design
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// Clean, typed interfaces for frontend communication&lt;/span&gt;
&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;PackageEntry&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Name&lt;/span&gt;             &lt;span class="kt"&gt;string&lt;/span&gt;   &lt;span class="s"&gt;`json:"name"`&lt;/span&gt;
    &lt;span class="n"&gt;InstalledVersion&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;   &lt;span class="s"&gt;`json:"installedVersion"`&lt;/span&gt;
    &lt;span class="n"&gt;LatestVersion&lt;/span&gt;    &lt;span class="kt"&gt;string&lt;/span&gt;   &lt;span class="s"&gt;`json:"latestVersion,omitempty"`&lt;/span&gt;
    &lt;span class="n"&gt;Description&lt;/span&gt;      &lt;span class="kt"&gt;string&lt;/span&gt;   &lt;span class="s"&gt;`json:"desc,omitempty"`&lt;/span&gt;
    &lt;span class="n"&gt;Homepage&lt;/span&gt;         &lt;span class="kt"&gt;string&lt;/span&gt;   &lt;span class="s"&gt;`json:"homepage,omitempty"`&lt;/span&gt;
    &lt;span class="n"&gt;Dependencies&lt;/span&gt;     &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="s"&gt;`json:"dependencies,omitempty"`&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;GetBrewPackages&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;[][]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// Efficient package listing with caching&lt;/span&gt;
    &lt;span class="c"&gt;// Returns structured data for frontend consumption&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Results
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Development Stats:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lines of code&lt;/strong&gt;: ~2,000 Go, ~1,500 TypeScript&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bundle size&lt;/strong&gt;: 5.2MB (vs 150MB+ typical Electron app)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Startup time&lt;/strong&gt;: &amp;lt;1 second&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Performance Improvements for Users:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🎯 &lt;strong&gt;Zero command memorization&lt;/strong&gt; needed&lt;/li&gt;
&lt;li&gt;📊 &lt;strong&gt;Visual progress tracking&lt;/strong&gt; for long operations&lt;/li&gt;
&lt;li&gt;🔍 &lt;strong&gt;Instant search&lt;/strong&gt; through installed packages&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I Learned Building WailBrew
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. &lt;strong&gt;Wails is Underrated&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Perfect sweet spot between Electron and native development&lt;/li&gt;
&lt;li&gt;Go's concurrency model is ideal for system operations&lt;/li&gt;
&lt;li&gt;Native OS integration without the bloat&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. &lt;strong&gt;Desktop App UX is Different&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Users expect native behavior (keyboard shortcuts, drag-drop)&lt;/li&gt;
&lt;li&gt;System integration matters (menu bars, notifications)&lt;/li&gt;
&lt;li&gt;Performance expectations are higher than web apps&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. &lt;strong&gt;Open Source Community Power&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Early feedback shaped crucial features&lt;/li&gt;
&lt;li&gt;Contributors helped with edge cases I missed&lt;/li&gt;
&lt;li&gt;Documentation is as important as code&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. &lt;strong&gt;Cross-platform Considerations&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Even "Mac-only" apps need to handle system variations&lt;/li&gt;
&lt;li&gt;Apple Silicon vs Intel differences matter&lt;/li&gt;
&lt;li&gt;Homebrew installation paths vary more than expected&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What's Next for WailBrew
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Immediate Roadmap:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🍺 &lt;strong&gt;Homebrew Cask support&lt;/strong&gt; (GUI app management)&lt;/li&gt;
&lt;li&gt;🔄 &lt;strong&gt;Auto-update mechanism&lt;/strong&gt; (currently manual)&lt;/li&gt;
&lt;li&gt;📊 &lt;strong&gt;Package analytics&lt;/strong&gt; (usage tracking, recommendations)&lt;/li&gt;
&lt;li&gt;🎨 &lt;strong&gt;Themes and customization&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Community Requests:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔗 &lt;strong&gt;Package dependency visualization&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;📱 &lt;strong&gt;Menu bar widget&lt;/strong&gt; for quick access&lt;/li&gt;
&lt;li&gt;🤖 &lt;strong&gt;Automated maintenance tasks&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Technical Improvements:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⚡ &lt;strong&gt;Better caching strategies&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;📈 &lt;strong&gt;Performance monitoring&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;🧪 &lt;strong&gt;Automated testing suite&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try WailBrew Today!
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/wickenico/WailBrew/releases/latest" rel="noopener noreferrer"&gt;⬇️ Download WailBrew v0.6.0&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For Developers:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🌟 &lt;strong&gt;Star the repo&lt;/strong&gt;: &lt;a href="https://github.com/wickenico/WailBrew" rel="noopener noreferrer"&gt;github.com/wickenico/WailBrew&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🐛 &lt;strong&gt;Report issues&lt;/strong&gt;: Help improve the app&lt;/li&gt;
&lt;li&gt;🔧 &lt;strong&gt;Contribute&lt;/strong&gt;: PRs welcome!&lt;/li&gt;
&lt;li&gt;💬 &lt;strong&gt;Share feedback&lt;/strong&gt;: What features do you need?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Tech Stack Curious?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📖 &lt;strong&gt;Full source code&lt;/strong&gt; available on GitHub&lt;/li&gt;
&lt;li&gt;🏗️ &lt;strong&gt;Wails framework&lt;/strong&gt;: &lt;a href="https://wails.io" rel="noopener noreferrer"&gt;wails.io&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🎯 &lt;strong&gt;Build your own&lt;/strong&gt;: Use this as a starting point&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;What's your biggest Homebrew pain point? Let me know in the comments - it might become the next WailBrew feature!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; #go #react #typescript #wails #homebrew #macos #desktop #opensource #gui #packagemanager&lt;/p&gt;

</description>
      <category>go</category>
      <category>react</category>
      <category>homebrew</category>
      <category>programming</category>
    </item>
    <item>
      <title>Setting up a React Project with TailwindCSS</title>
      <dc:creator>Nico Wickersheim</dc:creator>
      <pubDate>Sun, 22 Sep 2024 22:17:36 +0000</pubDate>
      <link>https://forem.com/wickenico/setting-up-a-react-project-with-tailwindcss-30me</link>
      <guid>https://forem.com/wickenico/setting-up-a-react-project-with-tailwindcss-30me</guid>
      <description>&lt;p&gt;TailwindCSS is a popular utility-first CSS framework that allows developers to build modern and responsive designs directly in their markup. When combined with React, it provides a powerful way to create interactive, stylish UIs with minimal effort. In this article, I'll walk you through how to set up a new React project with TailwindCSS from scratch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To follow along, you should have the following installed on your machine:&lt;/p&gt;

&lt;p&gt;Node.js (at least version 14.x)&lt;br&gt;
npm or Yarn as your package manager (here we will use npm)&lt;br&gt;
If you don't have Node.js installed, you can download it from the official website. Once you have Node.js installed, npm comes bundled with it, so you're good to go!&lt;/p&gt;

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

&lt;p&gt;First, let's create a new React project. Open your terminal and run the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx create-react-app my-tailwind-react-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will create a new React app in a folder called my-tailwind-react-app. You can replace this with your preferred project name.&lt;/p&gt;

&lt;p&gt;Once the installation is complete, navigate into your project folder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd my-tailwind-react-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can test if everything works by running:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;This will start the development server and open your project in the browser.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Install TailwindCSS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now that we have a basic React project set up, it's time to install TailwindCSS. To do that, we need to install Tailwind and its dependencies.&lt;/p&gt;

&lt;p&gt;In your project directory, run the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install -D tailwindcss postcss autoprefixer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After that, generate a TailwindCSS configuration file by running:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;This will create a tailwind.config.js file in your project directory. The default file will look something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/** @type {import('tailwindcss').Config} */
module.exports = {
  content: [],
  theme: {
    extend: {},
  },
  plugins: [],
}

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 3: Configure Tailwind to Remove Unused Styles&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;By default, TailwindCSS comes with all of its styles, which can make your CSS files quite large. To optimize the bundle size, we need to configure it to purge unused styles in production. This is done by adding the paths to all of your template files (like your React components) in the content array of tailwind.config.js.&lt;/p&gt;

&lt;p&gt;Modify the tailwind.config.js to include all your React files:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;module.exports = {
  content: [
    "./src/**/*.{js,jsx,ts,tsx}",
  ],
  theme: {
    extend: {},
  },
  plugins: [],
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This configuration tells Tailwind to scan all the files inside the src directory with .js, .jsx, .ts, or .tsx extensions for Tailwind classes and remove the unused ones in production builds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Add Tailwind to Your CSS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Next, we need to import TailwindCSS into our project’s CSS file. Open the src/index.css file and replace everything with the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@tailwind base;
@tailwind components;
@tailwind utilities;

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

&lt;/div&gt;



&lt;p&gt;This imports Tailwind's base, component, and utility styles into your project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Start Using TailwindCSS in Your React Components&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now that TailwindCSS is set up, you can start using its utility classes in your React components!&lt;/p&gt;

&lt;p&gt;For example, open src/App.js and update it like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function App() {
  return (
    &amp;lt;div className="min-h-screen bg-gray-100 flex items-center justify-center"&amp;gt;
      &amp;lt;div className="bg-white p-8 rounded shadow-md text-center"&amp;gt;
        &amp;lt;h1 className="text-2xl font-bold text-gray-900"&amp;gt;Hello, TailwindCSS!&amp;lt;/h1&amp;gt;
        &amp;lt;p className="mt-4 text-gray-600"&amp;gt;Start building your awesome React app now 🚀&amp;lt;/p&amp;gt;
      &amp;lt;/div&amp;gt;
    &amp;lt;/div&amp;gt;
  );
}

export default App;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In this example, we've used several TailwindCSS utility classes to style our component without writing any custom CSS. You can quickly adjust the layout and appearance just by changing the classes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 6: Build and Deploy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once you're happy with your project and want to build it for production, simply run:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;React will generate optimized static files, and Tailwind will remove all unused CSS classes, ensuring your bundle is as small as possible.&lt;/p&gt;

&lt;p&gt;You can then deploy your project to any hosting platform like Vercel, Netlify, or GitHub Pages.&lt;/p&gt;

&lt;p&gt;Conclusion&lt;/p&gt;

&lt;p&gt;Setting up React with TailwindCSS is quick and easy, and it allows you to build clean, responsive UIs without writing much custom CSS. With Tailwind’s utility-first approach, you can focus on designing your app’s interface directly in your JSX without leaving your code.&lt;/p&gt;

&lt;p&gt;Happy coding!&lt;/p&gt;

</description>
      <category>react</category>
      <category>tailwindcss</category>
      <category>webdev</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Simplifying AWS SSO Setup: The effortless way</title>
      <dc:creator>Nico Wickersheim</dc:creator>
      <pubDate>Wed, 29 May 2024 09:29:23 +0000</pubDate>
      <link>https://forem.com/wickenico/simplifying-aws-sso-setup-the-effortless-way-4g18</link>
      <guid>https://forem.com/wickenico/simplifying-aws-sso-setup-the-effortless-way-4g18</guid>
      <description>&lt;p&gt;Are you struggling with the complexities of configuring AWS SSO profiles for your projects involving data storage in S3 or similar services? In this blog post, we'll guide you through the seamless and effortless process of setting up AWS SSO profiles within AWS Config to get you up and running quickly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding AWS Profiles
&lt;/h2&gt;

&lt;p&gt;AWS profiles are configurations that define how your AWS CLI commands interact with AWS services. They centralise authentication credentials, region settings, and other parameters to streamline access to AWS resources. By creating different profiles for different purposes or roles, you can provide granular access control and maintain organisational segregation of duties. Understanding AWS profiles enables seamless integration of AWS CLI commands into your workflow, promoting agile development, efficient resource management, and robust security practices.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;AWS Account: You must have an active AWS account with appropriate permissions to configure AWS services and manage IAM roles.&lt;/li&gt;
&lt;li&gt;AWS CLI: Install the AWS Command Line Interface (CLI) tool on your local machine. AWS CLI allows you to interact with AWS services from the command line, simplifying configuration and management tasks.
Install the AWS CLI using brew: &lt;code&gt;brew install awscli&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;AWS IAM privileges: Ensure that your IAM user or role has the necessary permissions to create and manage AWS Config rules and AWS SSO configurations. This includes permissions to access the AWS Management Console and make changes to IAM policies and roles.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Setting Up AWS SSO Profiles in AWS Config: A Step-by-Step Guide
&lt;/h2&gt;

&lt;p&gt;The AWS CLI provides a built-in step-by-step guide for setting up SSO profiles. You can invoke it with `aws configure sso'.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;SSO Session Name (Recommended)&lt;/code&gt;: Choose a descriptive name, ideally with a reference to the environment or stage like dev, prod or staging.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;SSO Start URL [None]&lt;/code&gt;: Specify the URL where the process of selecting a profile begins within the AWS Management Console.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;SSO Region [None]&lt;/code&gt;: Indicate the region associated with your AWS account.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;SSO Registration Scopes [sso:account:access]&lt;/code&gt;: This initiates a browser window for granting access to your AWS profiles. Upon confirmation, you can proceed to select accounts and roles via the terminal.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;CLI Default Client Region [eu-central-1]&lt;/code&gt;: Reiterate your preferred region setting.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;CLI Default Output Format [None]&lt;/code&gt;: Simply press Enter to confirm.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once configured, you can verify your profile by executing:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;aws s3 ls --profile dev-admin&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This command will list the contents of your S3 bucket using the specified profile, in this case, "dev-admin".&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up AWS SSO Profile directly in Configuration File
&lt;/h2&gt;

&lt;p&gt;Another effective method for adding a profile is by directly modifying the config file.&lt;/p&gt;

&lt;p&gt;To access the file in the terminal, use the command cat ~/.aws/config.&lt;br&gt;
Within this file, you can insert a profile block resembling the following example:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3zai0z2ixxeaz4mwr31v.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3zai0z2ixxeaz4mwr31v.jpg" alt="AWS SSO Profile" width="800" height="264"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After adding the block and saving the file, you can seamlessly utilize the profile.&lt;/p&gt;

&lt;h2&gt;
  
  
  Logging in with AWS SSO Profiles
&lt;/h2&gt;

&lt;p&gt;First, export the AWS profile in the terminal where you want to use AWS CLI commands:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;export AWS_PROFILE=dev-admin&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Next, log in to your profile with the following command:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;aws sso login&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;A new browser window will open, prompting you to confirm your login attempt.&lt;/p&gt;

&lt;p&gt;Great! You are now logged in with your dev-admin profile.&lt;/p&gt;

&lt;p&gt;To check which profile you are currently logged in with, use the command:  &lt;/p&gt;

&lt;p&gt;&lt;code&gt;aws sts get-caller-identity&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;For a deeper view you can visit the AWS documentation: &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/sso-using-profile.html"&gt;https://docs.aws.amazon.com/cli/latest/userguide/sso-using-profile.html&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>sso</category>
      <category>terminal</category>
      <category>cli</category>
    </item>
  </channel>
</rss>
