<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Evan Coleman</title><link>https://edc.me/</link><description>Recent content on Evan Coleman</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Wed, 08 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://edc.me/index.xml" rel="self" type="application/rss+xml"/><item><title>Introducing xcode-remote: A Feedback Loop for AI Agents That Write Swift</title><link>https://edc.me/posts/introducing-xcode-remote/</link><pubDate>Wed, 08 Jul 2026 00:00:00 +0000</pubDate><guid>https://edc.me/posts/introducing-xcode-remote/</guid><description>&lt;p>My coding agents live on a headless Mac, supervised by &lt;a href="https://edc.me/posts/introducing-leo/">Leo&lt;/a>. They run in launchd background sessions: no GUI, no logged-in desktop, nobody at the keyboard. For most work that&amp;rsquo;s fine. An agent can write Swift, run tests, even boot a simulator headlessly and screenshot it. What it can&amp;rsquo;t do is put the app in front of me.&lt;/p>
&lt;p>The apps I want to watch run on the Mac I&amp;rsquo;m sitting at, in a simulator there or on the iPhone paired to it. So for a while the loop closed through me: the agent builds, I copy the &lt;code>.app&lt;/code> over, launch it, squint at Console, and paste crash reports back into the conversation. That got old fast.&lt;/p></description></item><item><title>Apple Just Laid the Groundwork to Change the Public Perception of AI</title><link>https://edc.me/posts/ai-for-the-masses/</link><pubDate>Mon, 08 Jun 2026 00:00:00 +0000</pubDate><guid>https://edc.me/posts/ai-for-the-masses/</guid><description>&lt;p>If you&amp;rsquo;re a software engineer who hasn&amp;rsquo;t been living under a rock for the last six months, you already know AI is real. Not hype-real. Actually-real. It writes code, it refactors code, it explains code you&amp;rsquo;ve never seen, and it does all of it well enough that a lot of us have quietly reorganized how we work.&lt;/p>
&lt;p>And yet, talk to anyone who &lt;em>doesn&amp;rsquo;t&lt;/em> write software, and you&amp;rsquo;ll hear the opposite. AI is a joke. AI is a scam. AI is the thing that ruined their search results and took their job. The gap between how engineers talk about this technology and how everyone else does is enormous.&lt;/p></description></item><item><title>Introducing Leo: From OpenClaw to Native Claude Code</title><link>https://edc.me/posts/introducing-leo/</link><pubDate>Sun, 19 Apr 2026 00:00:00 +0000</pubDate><guid>https://edc.me/posts/introducing-leo/</guid><description>&lt;p>Like many, I participated in the AI agent revolution that is &lt;a href="https://github.com/openclaw/openclaw">OpenClaw&lt;/a> early this year. In the beginning, it was magical. It managed my inbox and calendar, kept me up to date on news. I even tried using it for coding.&lt;/p>
&lt;p>It wasn&amp;rsquo;t long before I started to get frustrated. OpenClaw is a genuinely impressive
project, but it moves fast and updates would frequently break things. It got to the point where I found myself spending more time making sure things were working than actually getting any benefit out of it. Eventually I found myself reaching for Claude Code more than my OpenClaw agent.&lt;/p></description></item><item><title>Introducing MacroBrewery: A Collection of Swift Macros for Code Generation</title><link>https://edc.me/posts/introducing-macrobrewery/</link><pubDate>Tue, 30 Dec 2025 00:00:00 +0000</pubDate><guid>https://edc.me/posts/introducing-macrobrewery/</guid><description>&lt;p>If you&amp;rsquo;ve worked on a Swift codebase of any size, you&amp;rsquo;ve written the same boilerplate code hundreds of times. Memberwise initializers. Builder patterns. Enum case accessors. Test stubs. It&amp;rsquo;s tedious, error-prone, and frankly, boring.&lt;/p>
&lt;p>Swift 5.9 introduced macros, and I finally had a way to solve this properly. So I built &lt;a href="https://github.com/evandcoleman/MacroBrewery">MacroBrewery&lt;/a>, a collection of macros that generate the repetitive code I was tired of writing by hand.&lt;/p>
&lt;h2 id="whats-included">What&amp;rsquo;s Included&lt;/h2>
&lt;h3 id="autoinit">@AutoInit&lt;/h3>
&lt;p>Generates memberwise initializers that improve on Swift&amp;rsquo;s built-in one: optionals default to &lt;code>nil&lt;/code>, properties with default values preserve them as parameter defaults, and you can set any access level.&lt;/p></description></item><item><title>My Homelab Infrastructure: Deploying a Hashicorp Stack with Ansible</title><link>https://edc.me/posts/homelab-hashicorp-stack/</link><pubDate>Thu, 27 Feb 2025 13:21:14 -0500</pubDate><guid>https://edc.me/posts/homelab-hashicorp-stack/</guid><description>&lt;p>After years of tinkering with various homelab setups, I&amp;rsquo;ve finally settled on what I consider to be the perfect infrastructure stack for my needs. In this post, I&amp;rsquo;ll walk you through how I use Ansible to deploy and manage a complete Hashicorp stack (Nomad, Consul, Vault) along with Caddy as a reverse proxy, Consul-Template for dynamic configuration, and Cloudflared for secure tunneling.&lt;/p>
&lt;p>&lt;em>Note: I&amp;rsquo;ve open-sourced all the configuration files and deployment scripts on &lt;a href="https://github.com/evandcoleman/ansible-hashicorp-homelab">GitHub&lt;/a>. If you find this guide helpful, consider supporting my work on &lt;a href="https://www.patreon.com/evandcoleman">Patreon&lt;/a>.&lt;/em>&lt;/p></description></item><item><title>Introducing Trickledown.fail: Exposing the Myths of Trickle-Down Economics</title><link>https://edc.me/posts/introducing-trickledown-fail/</link><pubDate>Sat, 08 Feb 2025 12:00:00 +0000</pubDate><guid>https://edc.me/posts/introducing-trickledown-fail/</guid><description>&lt;p>For decades, politicians and corporate elites have pushed &lt;strong>trickle-down economics&lt;/strong>—the idea that giving tax breaks and advantages to the wealthy will somehow benefit everyone. It’s a &lt;strong>lie&lt;/strong>. Wealth doesn’t trickle down; it gets hoarded at the top.&lt;/p>
&lt;p>That’s why I built &lt;strong>&lt;a href="https://trickledown.fail">trickledown.fail&lt;/a>&lt;/strong>—a site dedicated to breaking down the myths of trickle-down economics, using &lt;strong>data, research, and historical examples&lt;/strong> to show how this policy has &lt;strong>widened inequality&lt;/strong> and &lt;strong>failed working people&lt;/strong> time and time again.&lt;/p></description></item><item><title>Self-Hosting Mastodon on Nomad</title><link>https://edc.me/posts/self-hosted-mastodon/</link><pubDate>Sat, 08 Feb 2025 12:00:00 +0000</pubDate><guid>https://edc.me/posts/self-hosted-mastodon/</guid><description>&lt;p>For a while, I’ve been running my Mastodon instance, coleman.social, on a DigitalOcean VPS. It worked fine, but as my self-hosted infrastructure matured, it made sense to move it over to my Nomad cluster. The benefits? Faster response times, better resource utilization, and lower costs. Plus, I wanted full control over my setup.&lt;/p>
&lt;h1 id="why-self-host">Why Self-Host?&lt;/h1>
&lt;ul>
&lt;li>&lt;strong>Cost Efficiency&lt;/strong> – Running Mastodon on DigitalOcean meant paying for a dedicated VPS. Now, it runs on my existing infrastructure with no extra monthly costs.&lt;/li>
&lt;li>&lt;strong>Performance&lt;/strong> – With direct access to my Synology SAN for volumes, everything runs smoother and faster.&lt;/li>
&lt;li>&lt;strong>Full Control&lt;/strong> – Instead of relying on a managed VPS, I can tweak the stack however I need, with consistent configurations across services.&lt;/li>
&lt;li>&lt;strong>Scalability&lt;/strong> – By moving to Nomad, I can easily scale up or down as needed without dealing with VPS limitations.&lt;/li>
&lt;/ul>
&lt;h1 id="infrastructure-overview">Infrastructure Overview&lt;/h1>
&lt;h2 id="nomad--consul-for-orchestration">Nomad &amp;amp; Consul for Orchestration&lt;/h2>
&lt;p>Mastodon is now managed as a Nomad job, ensuring clean deployments and automated scheduling.&lt;/p></description></item><item><title>A Twitter Bot for COVID Vaccine Availability in New York City</title><link>https://edc.me/posts/covid-vaccine-bot/</link><pubDate>Fri, 26 Mar 2021 20:11:49 +0000</pubDate><guid>https://edc.me/posts/covid-vaccine-bot/</guid><description>&lt;p>The other day I stopped to think about the collective time and energy that&amp;rsquo;s been wasted from people refreshing vaccine booking portals trying to book appointments for themselves or their loved ones.&lt;/p>
&lt;p>A few months ago when COVID vaccines were first becoming available in New York, I built a web scraper to constantly check the Walgreens, CVS, and New York State vaccine portals for available appointments. If it found one, it would send me an SMS via the Twilio API. This was incredibly useful, and I managed to snag at least one appointment for a family member early on. But then I let it sit for a few weeks. As you can imagine, vaccine distributers are constantly updating and changing their booking systems whether it be to fix issues or to fit the ever-changing demands. This ultimately led to my script no longer working well enough to be useful.&lt;/p></description></item><item><title>Dissecting the Media Remote Protocol: Reverse Engineering an Apple TV</title><link>https://edc.me/posts/dissecting-the-media-remote-protocol/</link><pubDate>Mon, 19 Mar 2018 20:23:30 +0000</pubDate><guid>https://edc.me/posts/dissecting-the-media-remote-protocol/</guid><description>&lt;p>For me, the holy grail of home automation isn’t just being able to control lights with your smartphone. Connecting your lights to the internet opens up a ton of possibilities. Your smartphone is just one way to control them. The holy grail of home automation is removing the need to even control your devices at all.&lt;/p>
&lt;p>When I watch a movie, I want my lights set a certain way. Seems simple enough. I watch everything on my Apple TV, so surely there should be a way to detect that and send the message along to HomeKit. In the past I’ve used a plugin for Plex that handled this quite well. The only downsides were that it was painstakingly tedious to program in the lighting settings, and it only worked in Plex. I figured the Apple TV must transmit its global play/pause state somehow, seeing as the Apple TV iOS app displays it.&lt;/p></description></item><item><title>Portfolio</title><link>https://edc.me/portfolio/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://edc.me/portfolio/</guid><description>&lt;p>Founder at &lt;a href="https://blackpaw.studio">Blackpaw Studio&lt;/a>. Previously Senior Staff
Mobile Engineer at &lt;a href="https://afresh.com">Afresh&lt;/a>, Software Architect at
&lt;a href="https://www.theknotww.com/about-us/">The Knot&lt;/a>, and iOS at
&lt;a href="https://apps.apple.com/us/app/timehop-memories-then-now/id569077959">Timehop&lt;/a>.
Also iOS &amp;amp; web for
&lt;a href="https://apps.apple.com/us/app/artist-connect/id1203809730">Artist Connect&lt;/a>.
NYC native. He/Him.&lt;/p></description></item></channel></rss>