<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>alexmiranda</title>
		<link>https://ammiranda.com/</link>
		<description>Recent content on alexmiranda</description>
		<generator>Hugo</generator>
		<language>en-us</language>
		
		
		
		
			<lastBuildDate>Thu, 07 Aug 2025 00:00:00 +0000</lastBuildDate>
		
			<atom:link href="https://ammiranda.com/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>From Meetup to Mailbox: A Kubernetes-Powered AI Workflow (Part 3)</title>
				<link>https://ammiranda.com/posts/from-meetup-to-mailbox-3/</link>
				<pubDate>Thu, 07 Aug 2025 00:00:00 +0000</pubDate>
				<guid>https://ammiranda.com/posts/from-meetup-to-mailbox-3/</guid>
				<description>&lt;h1 id=&#34;turning-event-data-into-action-how-i-built-an-ai-powered-email-digest-with-go-and-openai&#34;&gt;&#xA;  Turning Event Data into Action: How I Built an AI-Powered Email Digest with Go and OpenAI&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#turning-event-data-into-action-how-i-built-an-ai-powered-email-digest-with-go-and-openai&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;p&gt;In &lt;a href=&#34;https://your-blog.com/posts/k8s-meetup-scraper&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Part 2&lt;/a&gt; of this series, I shared how I built a respectful, containerized web scraper to collect dynamic event data from Meetup.com using Python and Selenium. But scraping data is only half the journey.&lt;/p&gt;&#xA;&lt;p&gt;In this post, I’ll break down the second half of the pipeline: the &lt;strong&gt;Meetup Emailer&lt;/strong&gt;, a Go-based service that transforms raw event JSON into a &lt;strong&gt;professional, friendly HTML email digest&lt;/strong&gt; using OpenAI’s GPT API—then sends it to a configurable list of recipients over SMTP.&lt;/p&gt;</description>
			</item>
			<item>
				<title>From Meetup to Mailbox: A Kubernetes-Powered AI Workflow (Part 2)</title>
				<link>https://ammiranda.com/posts/from-meetup-to-mailbox-2/</link>
				<pubDate>Tue, 05 Aug 2025 00:00:00 +0000</pubDate>
				<guid>https://ammiranda.com/posts/from-meetup-to-mailbox-2/</guid>
				<description>&lt;h1 id=&#34;building-a-respectful-web-scraper-lessons-from-scraping-meetup-events&#34;&gt;&#xA;  Building a Respectful Web Scraper: Lessons from Scraping Meetup Events&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#building-a-respectful-web-scraper-lessons-from-scraping-meetup-events&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;p&gt;Web scraping often gets a bad reputation in the developer community—and for good reason. Too many scrapers are built without consideration for the target site&amp;rsquo;s resources, terms of service, or basic web etiquette. When I needed to gather event data from Meetup.com for a personal project, I decided to build a scraper that would be both effective and respectful. Here&amp;rsquo;s what I learned along the way.&lt;/p&gt;</description>
			</item>
			<item>
				<title>From Meetup to Mailbox: A Kubernetes-Powered AI Workflow (Part 1)</title>
				<link>https://ammiranda.com/posts/from-meetup-to-mailbox-1/</link>
				<pubDate>Fri, 01 Aug 2025 00:00:00 +0000</pubDate>
				<guid>https://ammiranda.com/posts/from-meetup-to-mailbox-1/</guid>
				<description>&lt;h1 id=&#34;from-meetup-to-mailbox-a-kubernetes-powered-ai-workflow-part-1&#34;&gt;&#xA;  From Meetup to Mailbox: A Kubernetes-Powered AI Workflow (Part 1)&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#from-meetup-to-mailbox-a-kubernetes-powered-ai-workflow-part-1&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h1&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;em&gt;Automating web scraping and email delivery with Kubernetes CronJobs, containerized tools, and shared data pipelines.&lt;/em&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;This blog series documents a workflow I built to periodically scrape events from Meetup.com, summarize them using OpenAI, and send an email digest — all running on Kubernetes.&lt;br&gt;&#xA;This first post focuses on &lt;strong&gt;scheduling and running the workflow&lt;/strong&gt; using a Kubernetes CronJob.&lt;/p&gt;</description>
			</item>
			<item>
				<title>From Dust to Clusters: Building a $0/Month Kubernetes Lab on Apple Silicon</title>
				<link>https://ammiranda.com/posts/setting-up-k3d-homelab/</link>
				<pubDate>Tue, 29 Jul 2025 00:00:00 +0000</pubDate>
				<guid>https://ammiranda.com/posts/setting-up-k3d-homelab/</guid>
				<description>&lt;h2 id=&#34;from-cloud-bills-to-homelab-why-i-repurposed-my-m1-macbook-air&#34;&gt;&#xA;  From Cloud Bills to Homelab: Why I Repurposed My M1 MacBook Air&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#from-cloud-bills-to-homelab-why-i-repurposed-my-m1-macbook-air&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;I wanted to experiment with &lt;a href=&#34;https://kubernetes.io/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Kubernetes&lt;/a&gt; but quickly ran into a common roadblock: cloud costs. For something as hands-on and experimental as Kubernetes, paying by the hour for clusters I wasn&amp;rsquo;t using 24/7 didn’t make sense.&lt;/p&gt;&#xA;&lt;p&gt;That&amp;rsquo;s when I discovered the homelab community—and realized my unused M1 MacBook Air could become a zero-cost Kubernetes sandbox.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Contributing to Open Source (Hugo Theme)</title>
				<link>https://ammiranda.com/posts/contributing-to-open-source-hugo/</link>
				<pubDate>Fri, 27 Aug 2021 00:00:00 +0000</pubDate>
				<guid>https://ammiranda.com/posts/contributing-to-open-source-hugo/</guid>
				<description>&lt;h2 id=&#34;background&#34;&gt;&#xA;  Background&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#background&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;When creating this site (ammiranda.com) I needed to pick an existing theme (or create my own). I chose the &lt;a href=&#34;https://gohugo.io/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Hugo&lt;/a&gt; static site generator as the technology backing the site so I looked at available &lt;a href=&#34;https://themes.gohugo.io/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Hugo Themes&lt;/a&gt;. After a quick review, I picked the &lt;a href=&#34;https://github.com/luizdepra/hugo-coder/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Hugo Coder&lt;/a&gt; theme. I ran a security scan via &lt;a href=&#34;https://observatory.mozilla.org/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Mozilla Observatory&lt;/a&gt; once I deployed my website. The results revealed a shocking hole because the generated HTML lacked a &lt;a href=&#34;https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;content security policy&lt;/a&gt; (CSP). This post will detail my process adding CSP functionality to the theme as well as &lt;a href=&#34;https://reflectoring.io/upstream-downstream/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;upstreaming&lt;/a&gt; the change to the theme project&amp;rsquo;s repository by opening a pull request on &lt;a href=&#34;https://github.com&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Github&lt;/a&gt;.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Adding docker-compose To An Existing Project</title>
				<link>https://ammiranda.com/posts/adding-docker-compose-to-existing-project/</link>
				<pubDate>Sun, 22 Aug 2021 00:00:00 +0000</pubDate>
				<guid>https://ammiranda.com/posts/adding-docker-compose-to-existing-project/</guid>
				<description>&lt;h2 id=&#34;background&#34;&gt;&#xA;  Background&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#background&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://docs.docker.com/compose/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Docker-compose&lt;/a&gt; is an amazing CLI tool for managing multi-container applications. This post gives an overview on how an API project incorporates &lt;code&gt;docker-compose&lt;/code&gt; (including makefile commands for ease of use).&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-app&#34;&gt;&#xA;  The App&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#the-app&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;The app is an implementation of the &lt;a href=&#34;https://www.freecodecamp.org/learn/apis-and-microservices/apis-and-microservices-projects/timestamp-microservice&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;freeCodeCamp&amp;rsquo;s timeserver API project&lt;/a&gt;. I used &lt;a href=&#34;https://golang.org/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Golang&lt;/a&gt; with the &lt;a href=&#34;https://github.com/gin-gonic/gin&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Gin&lt;/a&gt; web framework to create the REST API. You can view the code for the project &lt;a href=&#34;https://github.com/ammiranda/timeserver&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;here&lt;/a&gt;.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Fixing Hugo Build Using Github Actions</title>
				<link>https://ammiranda.com/posts/fixing-hugo-build-using-github-actions/</link>
				<pubDate>Wed, 06 Jan 2021 00:00:00 +0000</pubDate>
				<guid>https://ammiranda.com/posts/fixing-hugo-build-using-github-actions/</guid>
				<description>&lt;h2 id=&#34;background&#34;&gt;&#xA;  Background&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#background&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;I created this site using &lt;a href=&#34;https://gohugo.io/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Hugo&lt;/a&gt; with the &lt;a href=&#34;https://github.com/luizdepra/hugo-coder/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Hugo-Coder&lt;/a&gt; theme. I wanted to set up the site to build and deploy using a continuous integration pipeline provided with &lt;a href=&#34;https://docs.github.com/en/free-pro-team@latest/actions&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Github Actions&lt;/a&gt;. However I ran into a thorny issue which I will explain below along with the solution I found.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-problem&#34;&gt;&#xA;  The Problem&#xA;  &lt;a class=&#34;heading-link&#34; href=&#34;#the-problem&#34;&gt;&#xA;    &lt;i class=&#34;fa-solid fa-link&#34; aria-hidden=&#34;true&#34; title=&#34;Link to heading&#34;&gt;&lt;/i&gt;&#xA;    &lt;span class=&#34;sr-only&#34;&gt;Link to heading&lt;/span&gt;&#xA;  &lt;/a&gt;&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;I created a build workflow file in the repository to utilize Github Actions.&lt;/p&gt;</description>
			</item>
			<item>
				<title>About me</title>
				<link>https://ammiranda.com/about/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://ammiranda.com/about/</guid>
				<description>&lt;p&gt;Hi I&amp;rsquo;m Alex. I build scalable backend systems and APIs that power modern web applications. I currently work at &lt;a href=&#34;https://www.sailpoint.com/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;SailPoint&lt;/a&gt; as a software engineer, developing identity governance solutions using &lt;a href=&#34;https://openjdk.org/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Java&lt;/a&gt; and &lt;a href=&#34;https://golang.org/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Golang&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Previously, I built high-performance APIs at &lt;a href=&#34;https://persefoni.com/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Persefoni&lt;/a&gt; using Go, and developed microservices architecture at &lt;a href=&#34;https://istreamplanet.com/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;iStreamplanet&lt;/a&gt;. Earlier in my career, I created single-page applications with &lt;a href=&#34;https://reactjs.org/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;React&lt;/a&gt; and &lt;a href=&#34;https://backbonejs.org/&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Backbone&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;m passionate about distributed systems, data visualization, web security, artificial intelligence, and emerging technologies like blockchain. Beyond code, I enjoy travel, reading, photography, cooking, and staying fit.&lt;/p&gt;</description>
			</item>
			<item>
				<title>Contact</title>
				<link>https://ammiranda.com/contact/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://ammiranda.com/contact/</guid>
				<description>&lt;p&gt;Feel free to contact me. I love learning about interesting projects (preferably open source).&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;mailto:alexandermichaelmiranda@gmail.com&#34; &gt;Email&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://linkedin.com/in/alexmmiranda&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Linkedin&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/ammiranda&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Github&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://twitter.com/amiranda222&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Twitter&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://keybase.io/amiranda&#34;  class=&#34;external-link&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Keybase&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;If you want to encrypt your email please use my &lt;a href=&#34;https://ammiranda.com/pgp.txt&#34; &gt;PGP key&lt;/a&gt;.&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
