<?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: Davi Reis Vieira</title>
    <description>The latest articles on Forem by Davi Reis Vieira (@davireisvieira).</description>
    <link>https://forem.com/davireisvieira</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%2F3914219%2F774211b2-6111-4c91-9134-af1c10aa9ce5.jpeg</url>
      <title>Forem: Davi Reis Vieira</title>
      <link>https://forem.com/davireisvieira</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/davireisvieira"/>
    <language>en</language>
    <item>
      <title>I Built an Open-Source AWS Resource Browser Because I Was Tired of Running CLI Commands</title>
      <dc:creator>Davi Reis Vieira</dc:creator>
      <pubDate>Tue, 05 May 2026 16:22:10 +0000</pubDate>
      <link>https://forem.com/davireisvieira/i-built-an-open-source-aws-resource-browser-because-i-was-tired-of-running-cli-commands-476k</link>
      <guid>https://forem.com/davireisvieira/i-built-an-open-source-aws-resource-browser-because-i-was-tired-of-running-cli-commands-476k</guid>
      <description>&lt;h2&gt;
  
  
  The Problem: We Were Flying Blind
&lt;/h2&gt;

&lt;p&gt;At &lt;a href="https://tryrefer.com?utm_source=devto&amp;amp;utm_medium=blog&amp;amp;utm_campaign=stackport" rel="noopener noreferrer"&gt;Refer&lt;/a&gt;, we're on a mission to enable talented individuals to fulfill their professional potential by helping them pursue their ideal job. Behind the scenes, that means a lot of microservices, and recently we decided to consolidate everything into a mono-repository.&lt;/p&gt;

&lt;p&gt;If you've ever migrated dozens of microservices into a monorepo, you know the drill: contracts between services need to be explicit, testing needs to be fast, and the dev experience has to be smooth enough that nobody reaches for &lt;code&gt;git blame&lt;/code&gt; to figure out who broke what (that's a story for another post).&lt;/p&gt;

&lt;p&gt;As part of this process, I started using &lt;a href="https://ministack.org?utm_source=devto&amp;amp;utm_medium=blog&amp;amp;utm_campaign=stackport" rel="noopener noreferrer"&gt;MiniStack&lt;/a&gt; to emulate AWS services locally. The idea was simple: instead of deploying to AWS every time we wanted to test an integration (which costs time and money), we'd run everything locally.&lt;/p&gt;

&lt;p&gt;It worked great. Until it didn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  "What's Actually in That Queue?"
&lt;/h2&gt;

&lt;p&gt;Here's what my typical debugging session looked like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws &lt;span class="nt"&gt;--endpoint-url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:4566 sqs list-queues
aws &lt;span class="nt"&gt;--endpoint-url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:4566 sqs receive-message &lt;span class="nt"&gt;--queue-url&lt;/span&gt; http://localhost:4566/000000000000/my-queue
aws &lt;span class="nt"&gt;--endpoint-url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:4566 s3 &lt;span class="nb"&gt;ls
&lt;/span&gt;aws &lt;span class="nt"&gt;--endpoint-url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:4566 dynamodb scan &lt;span class="nt"&gt;--table-name&lt;/span&gt; &lt;span class="nb"&gt;users&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Over. And over. And over.&lt;/p&gt;

&lt;p&gt;Some developers on my team aren't CLI people. They wanted to &lt;em&gt;see&lt;/em&gt; the resources. "Is the message in the queue?" "What's in that S3 bucket?" "Did the Lambda actually create the DynamoDB item?"&lt;/p&gt;

&lt;p&gt;These are visual questions. They deserve visual answers.&lt;/p&gt;

&lt;h2&gt;
  
  
  The First Attempt: A PR to MiniStack
&lt;/h2&gt;

&lt;p&gt;My initial instinct was to build a UI directly into MiniStack. I opened a PR, built a basic resource browser, and started a discussion with the maintainers.&lt;/p&gt;

&lt;p&gt;After some back-and-forth, we reached a conclusion: this should be its own project. The reasoning made sense: it shouldn't be tied to a single emulator. It should work with LocalStack, MiniStack, Moto, or even real AWS. A standalone tool could serve a broader community and evolve independently with its own release cadence.&lt;/p&gt;

&lt;p&gt;And so, StackPort was born.&lt;/p&gt;

&lt;h2&gt;
  
  
  What StackPort Does
&lt;/h2&gt;

&lt;p&gt;StackPort is a universal AWS resource browser. You point it at any AWS-compatible endpoint and it gives you a visual dashboard for all your resources.&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%2Fraw.githubusercontent.com%2FDaviReisVieira%2Fstackport%2Fmain%2Fdocs%2Fimages%2Fdashboard.jpeg" 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%2Fraw.githubusercontent.com%2FDaviReisVieira%2Fstackport%2Fmain%2Fdocs%2Fimages%2Fdashboard.jpeg" alt="StackPort Dashboard" width="800" height="528"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;One command to run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;stackport
&lt;span class="nv"&gt;AWS_ENDPOINT_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:4566 stackport
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or with Docker:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:8080 &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nv"&gt;AWS_ENDPOINT_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://host.docker.internal:4566 davireis/stackport
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Open &lt;code&gt;localhost:8080&lt;/code&gt; and you're browsing your AWS resources visually.&lt;/p&gt;

&lt;h3&gt;
  
  
  35+ Services and Growing
&lt;/h3&gt;

&lt;p&gt;StackPort auto-discovers resources across more than 35 AWS services: S3, SQS, DynamoDB, Lambda, EC2, ECS, RDS, Secrets Manager, IAM, CloudWatch Logs, Step Functions, EventBridge, SNS, KMS, and the list keeps growing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Custom Service Browsers
&lt;/h3&gt;

&lt;p&gt;For the services you interact with most, we built dedicated UIs (8 so far, more coming) that go way beyond a simple table:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;S3 Browser&lt;/strong&gt; lets you navigate buckets and folders, preview objects, upload and download files. &lt;strong&gt;SQS Browser&lt;/strong&gt; shows messages, lets you send new ones, purge queues. &lt;strong&gt;DynamoDB Browser&lt;/strong&gt; gives you scan/query with a JSON editor for creating and editing items. &lt;strong&gt;Lambda Browser&lt;/strong&gt; lets you invoke functions with custom payloads and see the results right there. &lt;strong&gt;IAM&lt;/strong&gt;, &lt;strong&gt;EC2&lt;/strong&gt;, &lt;strong&gt;CloudWatch Logs&lt;/strong&gt;, and &lt;strong&gt;Secrets Manager&lt;/strong&gt; all have their own dedicated views too. And this number keeps increasing with every release.&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%2Fraw.githubusercontent.com%2FDaviReisVieira%2Fstackport%2Fmain%2Fdocs%2Fimages%2Fs3.jpeg" 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%2Fraw.githubusercontent.com%2FDaviReisVieira%2Fstackport%2Fmain%2Fdocs%2Fimages%2Fs3.jpeg" alt="S3 Browser" width="800" height="528"&gt;&lt;/a&gt;&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%2Fraw.githubusercontent.com%2FDaviReisVieira%2Fstackport%2Fmain%2Fdocs%2Fimages%2Flambda.jpeg" 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%2Fraw.githubusercontent.com%2FDaviReisVieira%2Fstackport%2Fmain%2Fdocs%2Fimages%2Flambda.jpeg" alt="Lambda Browser" width="800" height="528"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Works With Everything
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Emulator&lt;/th&gt;
&lt;th&gt;Works?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MiniStack&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;LocalStack&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Moto&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Real AWS&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Any S3-compatible storage&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You can even connect to multiple endpoints simultaneously and switch between them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Open Source?
&lt;/h2&gt;

&lt;p&gt;I could've kept this as an internal tool at Refer. But making it open source was a deliberate choice.&lt;/p&gt;

&lt;p&gt;First, &lt;strong&gt;speed&lt;/strong&gt;. Contributors bring features I wouldn't prioritize myself. Someone added DynamoDB item editing. Another person improved S3 operations. These happened in parallel with my own work.&lt;/p&gt;

&lt;p&gt;Second, &lt;strong&gt;quality&lt;/strong&gt;. More eyes, more edge cases caught. The emulator ecosystem is diverse. People testing with LocalStack find issues I'd never hit with MiniStack alone.&lt;/p&gt;

&lt;p&gt;Third, &lt;strong&gt;community&lt;/strong&gt;. Local AWS development is a shared pain. Every team running LocalStack or MiniStack has the same "what's in my queue?" moment. A shared tool benefits everyone.&lt;/p&gt;

&lt;p&gt;In just one month, we've shipped 10 releases, merged PRs from external contributors, and reached a point where the tool covers most of what a team needs for daily local development.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Tech Stack
&lt;/h2&gt;

&lt;p&gt;I kept it simple on purpose. I wanted contributors to jump in without a steep learning curve.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;backend&lt;/strong&gt; is Python with FastAPI and boto3. Sync route handlers (FastAPI auto-threadpools them). Registry pattern for service discovery. The &lt;strong&gt;frontend&lt;/strong&gt; is React, TypeScript, Vite, Tailwind CSS and shadcn/ui. Dark theme only because we're not monsters. &lt;strong&gt;Deployment&lt;/strong&gt; is a single Docker image where the backend serves the frontend as static files. No nginx, no reverse proxy, no drama.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;stackport/
├── backend/          # FastAPI + boto3
│   ├── routes/       # One file per service
│   └── schemas/      # Pydantic models
├── ui/src/           # React + TypeScript
│   ├── components/   # Service browsers
│   └── lib/          # API client, types
└── Dockerfile        # Two-stage build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adding a new service to the generic browser is literally adding entries to a Python dictionary. Adding a custom UI follows a clear, documented pattern.&lt;/p&gt;

&lt;h2&gt;
  
  
  Want to Contribute?
&lt;/h2&gt;

&lt;p&gt;We've tagged several issues as &lt;code&gt;good first issue&lt;/code&gt; that cover different skill sets:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Python/Backend&lt;/strong&gt;: &lt;a href="https://github.com/DaviReisVieira/stackport/issues/74" rel="noopener noreferrer"&gt;CloudWatch Logs write operations&lt;/a&gt; for adding create/delete to log groups.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Full-Stack&lt;/strong&gt;: &lt;a href="https://github.com/DaviReisVieira/stackport/issues/77" rel="noopener noreferrer"&gt;KMS Browser&lt;/a&gt; to build a read-only key browser, and &lt;a href="https://github.com/DaviReisVieira/stackport/issues/66" rel="noopener noreferrer"&gt;Route 53 Browser&lt;/a&gt; for DNS record management.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DevOps&lt;/strong&gt;: &lt;a href="https://github.com/DaviReisVieira/stackport/issues/22" rel="noopener noreferrer"&gt;Helm Chart&lt;/a&gt; for Kubernetes deployment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Docs/Backend&lt;/strong&gt;: &lt;a href="https://github.com/DaviReisVieira/stackport/issues/25" rel="noopener noreferrer"&gt;OpenAPI spec&lt;/a&gt; to auto-generate API documentation.&lt;/p&gt;

&lt;p&gt;Each issue has a detailed implementation plan, acceptance criteria, and testing requirements. The &lt;a href="https://github.com/DaviReisVieira/stackport/blob/main/CONTRIBUTING.md" rel="noopener noreferrer"&gt;CONTRIBUTING.md&lt;/a&gt; has the full dev setup guide.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get Started in 30 Seconds
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;stackport

&lt;span class="c"&gt;# Start your emulator (pick one)&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;ministack &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; ministack
&lt;span class="c"&gt;# or: docker run -p 4566:4566 localstack/localstack&lt;/span&gt;

&lt;span class="c"&gt;# Run StackPort&lt;/span&gt;
&lt;span class="nv"&gt;AWS_ENDPOINT_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://localhost:4566 stackport
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;a href="http://localhost:8080" rel="noopener noreferrer"&gt;localhost:8080&lt;/a&gt; and start browsing.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/DaviReisVieira/stackport" rel="noopener noreferrer"&gt;github.com/DaviReisVieira/stackport&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If this solves a problem you have, give it a star. If you want to make it better, check out the issues. And if you just want to say hi, open an issue. I read every single one.&lt;/p&gt;

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

</description>
      <category>opensource</category>
      <category>aws</category>
      <category>python</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
