<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Cli on Mats Estensen · Personal Website · www.mxe.no</title>
    <link>https://www.mxe.no/tags/cli/</link>
    <description>Recent content in Cli on Mats Estensen · Personal Website · www.mxe.no</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Tue, 31 Mar 2026 15:19:00 +0000</lastBuildDate>
    
        <atom:link href="https://www.mxe.no/tags/cli/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>LazyAzure: the lazy way to view your Azure resources</title>
      <link>https://www.mxe.no/posts/lazyazure/</link>
      <pubDate>Tue, 31 Mar 2026 15:19:00 +0000</pubDate>
      
      <guid>https://www.mxe.no/posts/lazyazure/</guid>
      <description>&lt;p&gt;I spend most of my working day in a terminal/editor, and increasingly with a coding agent running next to me. The exception is Azure, where my primary interface is usually the portal. Looking up a resource or checking one of its properties usually means leaving the terminal, opening the portal and clicking around until I find the right blade.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/matsest/lazyazure&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;LazyAzure&lt;/a&gt; is my attempt to make that loop shorter. It is a terminal UI inspired by &lt;a href=&#34;https://github.com/jesseduffield/lazydocker&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;lazydocker&lt;/a&gt; that browses Azure resources in the same hierarchy as the portal: subscriptions, resource groups and resources.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;https://www.mxe.no/images/lazyazure-demo.gif&#34; alt=&#34;LazyAzure demo&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;what-it-does&#34;&gt;
  What it does
  &lt;a class=&#34;heading-link&#34; href=&#34;#what-it-does&#34;&gt;
    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;
    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;
  &lt;/a&gt;
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Navigate subscriptions, resource groups and resources with keyboard (or mouse!)&lt;/li&gt;
&lt;li&gt;Inspect a resource as a formatted summary or raw JSON&lt;/li&gt;
&lt;li&gt;Expand details to fetch all properties&lt;/li&gt;
&lt;li&gt;Search and filter within each panel&lt;/li&gt;
&lt;li&gt;Open the selected scope in the Azure Portal, or copy the link&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;how-it-works&#34;&gt;
  How it works
  &lt;a class=&#34;heading-link&#34; href=&#34;#how-it-works&#34;&gt;
    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;
    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;
  &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;LazyAzure is written in Go on top of &lt;a href=&#34;https://github.com/jesseduffield/gocui&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;gocui&lt;/a&gt;, the TUI library also used by lazydocker. Azure access goes through the &lt;a href=&#34;https://github.com/Azure/azure-sdk-for-go&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Azure SDK for Go&lt;/a&gt;, and authentication uses &lt;code&gt;DefaultAzureCredential&lt;/code&gt;. In practice that means it picks up an existing &lt;code&gt;az login&lt;/code&gt; session, Azure PowerShell, a managed identity or environment credentials and requires no separate login flow or stored secrets.&lt;/p&gt;
&lt;p&gt;Resource details are loaded with provider-specific API versions, so the JSON view shows the same shape as the Azure REST API. Resource groups and resources are also preloaded in the background and held in a multi-tier cache, which means returning to a previously visited scope is instant instead of another round trip to Azure. There is no telemetry, and nothing is written to disk apart from an optional local debug log.&lt;/p&gt;
&lt;h2 id=&#34;built-with-ai&#34;&gt;
  Built with AI
  &lt;a class=&#34;heading-link&#34; href=&#34;#built-with-ai&#34;&gt;
    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;
    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;
  &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;This is one of the first projects where I leaned heavily on AI from the start &amp;ndash; with &lt;a href=&#34;https://opencode.ai&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;OpenCode&lt;/a&gt; and mostly open-weight models &amp;ndash; working from carefully written initial specifications. The repository keeps an &lt;a href=&#34;https://github.com/matsest/lazyazure/blob/main/AGENTS.md&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;code&gt;AGENTS.md&lt;/code&gt;&lt;/a&gt; with build, test and review conventions, which made it easier to keep the scope tight and the generated code reviewable.&lt;/p&gt;
&lt;p&gt;Although Go is a language I know fairly well, it quickly became clear that AI agents let me expand the feature set into areas I wasn&amp;rsquo;t familiar with. To be fair, this project probably wouldn&amp;rsquo;t have been finished if I hadn&amp;rsquo;t used agents!&lt;/p&gt;
&lt;h2 id=&#34;try-it-out&#34;&gt;
  Try it out
  &lt;a class=&#34;heading-link&#34; href=&#34;#try-it-out&#34;&gt;
    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;
    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;
  &lt;/a&gt;
&lt;/h2&gt;
&lt;p&gt;Prebuilt binaries for Linux, macOS and Windows are available on the &lt;a href=&#34;https://github.com/matsest/lazyazure/releases&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;releases page&lt;/a&gt;, and the release notes include installation instructions.&lt;/p&gt;
&lt;p&gt;If you just want to try the interface, &lt;code&gt;LAZYAZURE_DEMO=1 lazyazure&lt;/code&gt; runs it against mock data; &lt;code&gt;LAZYAZURE_DEMO=2&lt;/code&gt; uses a larger dataset.&lt;/p&gt;
&lt;p&gt;Feedback, bug reports and feature requests are welcome as &lt;a href=&#34;https://github.com/matsest/lazyazure&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;GitHub issues&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;The project was &lt;a href=&#34;https://www.linkedin.com/posts/matsest_opencode-azure-github-activity-7444735005018251265-Imf-&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;originally announced on LinkedIn&lt;/a&gt;. This post was created as an expanded version of that post in November 2026.&lt;/p&gt;
&lt;p&gt;You can also find &lt;a href=&#34;https://www.tinytooltown.com/tools/lazyazure/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;this project listed&lt;/a&gt; on &lt;a href=&#34;https://hanselman.com/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Scott Hanselman&amp;rsquo;s&lt;/a&gt; awesome &lt;a href=&#34;https://www.tinytooltown.com/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Tiny Tool Town&lt;/a&gt;.&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
