<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/">
    <channel>
        <title><![CDATA[Miguel Piedrafita]]></title>
        <description><![CDATA[I'm a 24-year-old maker, and I love building things.]]></description>
        <link>https://miguel.build</link>
        <generator>Limbhad</generator>
        <lastBuildDate>Sat, 21 Mar 2026 00:43:03 GMT</lastBuildDate>
        <atom:link href="https://miguel.build/feed.xml" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Bringing World ID to Agents]]></title>
            <description><![CDATA[<p></p>
<p>With more and more agents browsing the internet, telling bots acting on behalf of a human apart from crawlers &#x26; other undesirable bots will become increasingly important. I've been working on using World ID to provide websites with a proof that a human is behind bot requests. It's out as a developer preview today!</p>]]></description>
            <link>https://miguel.build/b/bringing-world-id-to-agents</link>
            <guid isPermaLink="true">https://miguel.build/b/bringing-world-id-to-agents</guid>
            <pubDate>Tue, 17 Mar 2026 21:08:31 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/agentkit/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/agentkit/poster.jpg&quot; muted type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

With more and more agents browsing the internet, telling bots acting on behalf of a human apart from crawlers &amp; other undesirable bots will become increasingly important. I&apos;ve been working on using World ID to provide websites with a proof that a human is behind bot requests. It&apos;s out as a developer preview today!</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/agentkit/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/agentkit/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[Pokemon Go, but for payphones (?)]]></title>
            <description><![CDATA[<p></p>
<p><a href="https://walzr.com/">Riley Waltz</a> recently launched a new game where you <a href="https://x.com/rtwlz/status/2028281313963483394">go out and hunt down California payphones</a>. I happened to be in SF and wanted to join in on the fun, but copying directions over and over became a bit of a chore.</p>
<p>So I dug up an unreleased project from last year (bike app for Lisbon) and put together a simple app that lets you see your closest phones and navigate to them in one click. Check out those sick sheet animations!</p>
<p><a href="https://github.com/m1guelpf/PayphoneGo">View on GitHub</a></p>]]></description>
            <link>https://miguel.build/b/pokemon-go-but-for-payphones</link>
            <guid isPermaLink="true">https://miguel.build/b/pokemon-go-but-for-payphones</guid>
            <pubDate>Mon, 02 Mar 2026 23:34:45 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/payphonego/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/payphonego/poster.jpg&quot; muted type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

[Riley Waltz](https://walzr.com/) recently launched a new game where you [go out and hunt down California payphones](https://x.com/rtwlz/status/2028281313963483394). I happened to be in SF and wanted to join in on the fun, but copying directions over and over became a bit of a chore.

So I dug up an unreleased project from last year (bike app for Lisbon) and put together a simple app that lets you see your closest phones and navigate to them in one click. Check out those sick sheet animations!

[View on GitHub](https://github.com/m1guelpf/PayphoneGo)</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/payphonego/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/payphonego/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[A brand new World ID (RFC)]]></title>
            <description><![CDATA[<p><img src="https://web-assets.miguel.build/world-id-4-rfc.jpg" alt="A diagram showing the proposed architecture for World ID v4"></p>
<p>It's not often you need to update a protocol. World ID has mostly stayed the same since we first designed it in 2021, and that's because it's great at doing the one thing it's supposed to do (let you anonymously prove you're a human).</p>
<p>Four years later, we want to give it a few extra super-powers, like allowing anyone to issue their own credentials using the protocol. We'd love to hear your feedback on the proposal!</p>
<p><a href="https://github.com/worldcoin/world-id-protocol/blob/main/docs/world-id-4-specs/README.md">Share your feedback</a></p>]]></description>
            <link>https://miguel.build/b/a-brand-new-world-id-rfc</link>
            <guid isPermaLink="true">https://miguel.build/b/a-brand-new-world-id-rfc</guid>
            <pubDate>Thu, 22 Jan 2026 17:27:10 GMT</pubDate>
            <source:markdown>![A diagram showing the proposed architecture for World ID v4](https://web-assets.miguel.build/world-id-4-rfc.jpg)

It&apos;s not often you need to update a protocol. World ID has mostly stayed the same since we first designed it in 2021, and that&apos;s because it&apos;s great at doing the one thing it&apos;s supposed to do (let you anonymously prove you&apos;re a human).

Four years later, we want to give it a few extra super-powers, like allowing anyone to issue their own credentials using the protocol. We&apos;d love to hear your feedback on the proposal!

[Share your feedback](https://github.com/worldcoin/world-id-protocol/blob/main/docs/world-id-4-specs/README.md)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Speeding up the Cloudflare dashboard]]></title>
            <description><![CDATA[<p></p>
<p>I use Cloudflare to power a ton of things (including the video above!), but still dread having to go to the dashboard. It's soooo slow.</p>
<p>To make my life a bit better, I built a lil CLI tool that deep-links into specific pages, cutting down the time it takes me to get places by a ton.</p>
<p><a href="https://github.com/m1guelpf/cf-url">View on GitHub</a></p>]]></description>
            <link>https://miguel.build/b/speeding-up-the-cloudflare-dashboard</link>
            <guid isPermaLink="true">https://miguel.build/b/speeding-up-the-cloudflare-dashboard</guid>
            <pubDate>Sun, 04 Jan 2026 19:30:14 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/cf-url/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/cf-url/poster.jpg&quot; muted type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

I use Cloudflare to power a ton of things (including the video above!), but still dread having to go to the dashboard. It&apos;s soooo slow.

To make my life a bit better, I built a lil CLI tool that deep-links into specific pages, cutting down the time it takes me to get places by a ton.

[View on GitHub](https://github.com/m1guelpf/cf-url)</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/cf-url/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/cf-url/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[A game to keep up with the news]]></title>
            <description><![CDATA[<p></p>
<p>A few days ago, I found a really cool game which turns the news into simple games (trivia &#x26; letter unscrambling). Originally a web app with a really nice design, I took it as a challenge to recreate it as a native iOS app. This is the result!</p>
<p><a href="https://timelines.gg/">Play Timelines on the web</a></p>]]></description>
            <link>https://miguel.build/b/a-game-to-keep-up-with-the-news</link>
            <guid isPermaLink="true">https://miguel.build/b/a-game-to-keep-up-with-the-news</guid>
            <pubDate>Fri, 02 Jan 2026 15:55:53 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/timelines-app/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/timelines-app/poster.jpg&quot; muted type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

A few days ago, I found a really cool game which turns the news into simple games (trivia &amp; letter unscrambling). Originally a web app with a really nice design, I took it as a challenge to recreate it as a native iOS app. This is the result!

[Play Timelines on the web](https://timelines.gg/)</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/timelines-app/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/timelines-app/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[Exploring Spotify's leaked data]]></title>
            <description><![CDATA[<p></p>
<p>Last week, a group of archivists managed to scrape a ton of data from Spotify (including user playlists and, most excitingly, music files). To explore the data (and figure out which of my favorite songs were in there), I built a website that lets you sign in with your Spotify account and navigate the dump easily.</p>]]></description>
            <link>https://miguel.build/b/exploring-spotifys-leaked-data</link>
            <guid isPermaLink="true">https://miguel.build/b/exploring-spotifys-leaked-data</guid>
            <pubDate>Wed, 24 Dec 2025 20:01:22 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/spotify-dump/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/spotify-dump/poster.jpg&quot;  type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

Last week, a group of archivists managed to scrape a ton of data from Spotify (including user playlists and, most excitingly, music files). To explore the data (and figure out which of my favorite songs were in there), I built a website that lets you sign in with your Spotify account and navigate the dump easily.</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/spotify-dump/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/spotify-dump/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[Turning photos into 3D environments]]></title>
            <description><![CDATA[<p></p>
<p>Apple recently released an experimental ML model called <a href="https://github.com/apple/ml-sharp">sharp</a>, which generates gaussian splatting scenes from a single image. I wanted an easier way to play with it, so I spent some time compiling the model to CoreML and building a simple macOS app to interact with it.</p>]]></description>
            <link>https://miguel.build/b/turning-photos-into-3d-environments</link>
            <guid isPermaLink="true">https://miguel.build/b/turning-photos-into-3d-environments</guid>
            <pubDate>Sun, 21 Dec 2025 01:48:34 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/macos-sharp/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/macos-sharp/poster.jpg&quot;  type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

Apple recently released an experimental ML model called [sharp](https://github.com/apple/ml-sharp), which generates gaussian splatting scenes from a single image. I wanted an easier way to play with it, so I spent some time compiling the model to CoreML and building a simple macOS app to interact with it.</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/macos-sharp/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/macos-sharp/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[Decentralized gift-giving on World App]]></title>
            <description><![CDATA[<p></p>
<p>This year's holiday release of World App comes with a whimsical feature: the first global, human-only gift exchange. We put a lot of love into the experience, so it sort of feels like opening a real gift.</p>
<p><a href="https://world.org/giftofgiving">Try it out</a></p>]]></description>
            <link>https://miguel.build/b/decentralized-gift-giving-on-world-app</link>
            <guid isPermaLink="true">https://miguel.build/b/decentralized-gift-giving-on-world-app</guid>
            <pubDate>Fri, 12 Dec 2025 23:14:44 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/wld-gifts/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/wld-gifts/poster.jpg&quot;  type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

This year&apos;s holiday release of World App comes with a whimsical feature: the first global, human-only gift exchange. We put a lot of love into the experience, so it sort of feels like opening a real gift.

[Try it out](https://world.org/giftofgiving)</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/wld-gifts/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/wld-gifts/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[Rendering Miis]]></title>
            <description><![CDATA[<p></p>
<p>The other day I stumbled upon a C++ decompilation of the Wii U library that renders Miis.</p>
<p>I don't have a ton of experience with C++, but after a few hours of trial and error, I managed to run it on my Mac (it needed porting from OpenGL to Metal) and update the render function to give me full-body renders instead of just heads.</p>]]></description>
            <link>https://miguel.build/b/rendering-miis</link>
            <guid isPermaLink="true">https://miguel.build/b/rendering-miis</guid>
            <pubDate>Thu, 23 Oct 2025 14:42:04 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/3d-mii/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/3d-mii/poster.jpg&quot; muted type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

The other day I stumbled upon a C++ decompilation of the Wii U library that renders Miis.

I don&apos;t have a ton of experience with C++, but after a few hours of trial and error, I managed to run it on my Mac (it needed porting from OpenGL to Metal) and update the render function to give me full-body renders instead of just heads.</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/3d-mii/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/3d-mii/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[A Swift SDK for Sora]]></title>
            <description><![CDATA[<pre><code class="language-swift">import VideoAPI

let client = VideoAPI(authToken: YOUR_OPENAI_AUTH_TOKEN)

let video = try await client.create(
    prompt: "A cute cat playing with a ball of yarn",
    model: .sora2Pro
)
</code></pre>
<p>I was invited to OpenAI DevDay this year, where the new Sora APIs got announced. To play around with them, I built a simple Swift SDK that makes it super easy to integrate AI video generation into your iOS and macOS apps.</p>
<p><a href="https://github.com/m1guelpf/swift-openai-videos">View on GitHub</a></p>]]></description>
            <link>https://miguel.build/b/a-swift-sdk-for-sora</link>
            <guid isPermaLink="true">https://miguel.build/b/a-swift-sdk-for-sora</guid>
            <pubDate>Mon, 06 Oct 2025 19:36:20 GMT</pubDate>
            <source:markdown>```swift
import VideoAPI

let client = VideoAPI(authToken: YOUR_OPENAI_AUTH_TOKEN)

let video = try await client.create(
    prompt: &quot;A cute cat playing with a ball of yarn&quot;,
    model: .sora2Pro
)
```

I was invited to OpenAI DevDay this year, where the new Sora APIs got announced. To play around with them, I built a simple Swift SDK that makes it super easy to integrate AI video generation into your iOS and macOS apps.

[View on GitHub](https://github.com/m1guelpf/swift-openai-videos)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Glass icon for an upcoming app]]></title>
            <description><![CDATA[<p><img src="https://web-assets.miguel.build/pocket-icon.jpg" alt="A 3D render of an iPhone, showing the home screen with various app icons. Highlighted is the Pocket app icon."></p>
<p>I've been working on an app called Pocket, which helps you manage your media server (more on that soon!). Of course, every app needs a cool icon, and I was very happy with how this one turned out.</p>]]></description>
            <link>https://miguel.build/b/glass-icon-for-an-upcoming-app</link>
            <guid isPermaLink="true">https://miguel.build/b/glass-icon-for-an-upcoming-app</guid>
            <pubDate>Tue, 23 Sep 2025 21:14:59 GMT</pubDate>
            <source:markdown>![A 3D render of an iPhone, showing the home screen with various app icons. Highlighted is the Pocket app icon.](https://web-assets.miguel.build/pocket-icon.jpg)

I&apos;ve been working on an app called Pocket, which helps you manage your media server (more on that soon!). Of course, every app needs a cool icon, and I was very happy with how this one turned out.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Cleaning up my Twitter followers]]></title>
            <description><![CDATA[<p><img src="https://web-assets.miguel.build/down-20k.png" alt="A follower count, showing a drop of 20,248 followers in a single day."></p>
<p>One of the bad things about having a large Twitter following is that, over time, you end up with a lot of inactive or spammy accounts following you. Aside from being annoying, this was starting to make my tweets not show up on people's timelines.</p>
<p>To fix this, I downloaded a list of everyone that followed me, and spent a few days writing scripts to get rid of obvious bots and spammy accounts. The result? +20k less followers, and a much healthier account!</p>]]></description>
            <link>https://miguel.build/b/cleaning-up-my-twitter-followers</link>
            <guid isPermaLink="true">https://miguel.build/b/cleaning-up-my-twitter-followers</guid>
            <pubDate>Tue, 23 Sep 2025 16:44:26 GMT</pubDate>
            <source:markdown>![A follower count, showing a drop of 20,248 followers in a single day.](https://web-assets.miguel.build/down-20k.png)

One of the bad things about having a large Twitter following is that, over time, you end up with a lot of inactive or spammy accounts following you. Aside from being annoying, this was starting to make my tweets not show up on people&apos;s timelines.

To fix this, I downloaded a list of everyone that followed me, and spent a few days writing scripts to get rid of obvious bots and spammy accounts. The result? +20k less followers, and a much healthier account!</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Real-time AI in two lines of code]]></title>
            <description><![CDATA[<pre><code class="language-swift">import SwiftUI
import RealtimeAPI

struct ContentView: View {
	@State private var conversation = Conversation()

	var body: some View {
		Text("This is all you need for interactive AI in your app!")
			.task {
                try await conversation.connect(
                    ephemeralKey: YOUR_EPHEMERAL_KEY_HERE
                )
            }
	}
}
</code></pre>
<p>OpenAI released a new version of their Realtime API recently, so I took the chance to completely rewrite my old Swift SDK for it, massively improving performance and ergonomics.</p>
<p>It now uses WebRTC under the hood, which makes it way more reliable and faster than the previous WebSocket-based implementation. Check it out!</p>
<p><a href="https://github.com/m1guelpf/swift-realtime-openai">View on GitHub</a></p>]]></description>
            <link>https://miguel.build/b/real-time-ai-in-two-lines-of-code</link>
            <guid isPermaLink="true">https://miguel.build/b/real-time-ai-in-two-lines-of-code</guid>
            <pubDate>Thu, 28 Aug 2025 18:40:34 GMT</pubDate>
            <source:markdown>```swift
import SwiftUI
import RealtimeAPI

struct ContentView: View {
	@State private var conversation = Conversation()

	var body: some View {
		Text(&quot;This is all you need for interactive AI in your app!&quot;)
			.task {
                try await conversation.connect(
                    ephemeralKey: YOUR_EPHEMERAL_KEY_HERE
                )
            }
	}
}
```

OpenAI released a new version of their Realtime API recently, so I took the chance to completely rewrite my old Swift SDK for it, massively improving performance and ergonomics.

It now uses WebRTC under the hood, which makes it way more reliable and faster than the previous WebSocket-based implementation. Check it out!

[View on GitHub](https://github.com/m1guelpf/swift-realtime-openai)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[A skeumorphic voice journal]]></title>
            <description><![CDATA[<p></p>
<p>A few weeks ago, <a href="https://twitter.com/ruedart">my girlfriend</a> and I challenged ourselves to make an app that didn't look or feel like an iOS app.</p>
<p>To achieve this, she designed the app using vector graphics instead of a UI framework, while I added haptics and other affordances to make it feel as familiar as possible. I'm obviously biased, but i think it turned out great. Try it out!</p>
<p><a href="https://apps.apple.com/us/app/audio-diary-ai-voice-journal/id6747790380">Download on the App Store</a></p>]]></description>
            <link>https://miguel.build/b/a-skeumorphic-voice-journal</link>
            <guid isPermaLink="true">https://miguel.build/b/a-skeumorphic-voice-journal</guid>
            <pubDate>Fri, 04 Jul 2025 16:36:29 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/audio-diary/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/audio-diary/poster.jpg&quot; muted type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

A few weeks ago, [my girlfriend](https://twitter.com/ruedart) and I challenged ourselves to make an app that didn&apos;t look or feel like an iOS app.

To achieve this, she designed the app using vector graphics instead of a UI framework, while I added haptics and other affordances to make it feel as familiar as possible. I&apos;m obviously biased, but i think it turned out great. Try it out!

[Download on the App Store](https://apps.apple.com/us/app/audio-diary-ai-voice-journal/id6747790380)</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/audio-diary/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/audio-diary/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[The Nintendo DS Clock, on your phone]]></title>
            <description><![CDATA[<p><img src="https://web-assets.miguel.build/ds-clock-standby.jpg" alt="an iPhone on StandBy mode, showing a clock widget themed after the Nintendo DS clock alongside a widget showing a grid of 365 dots, where the first 154 are filled in and the rest are gray."></p>
<p>I've been feeling a bit nostalgic for old consoles recently, with the Switch 2 finally dropping this week.</p>
<p>To celebrate, <a href="https://twitter.com/ruedart">my girlfriend</a> and I spent the weekend recreating the original Nintendo DS clock as an iOS widget. It's now live on the App Store!</p>
<p><a href="https://apps.apple.com/us/app/dsclock-retro-clock-widget/id6746729918">Download on the App Store</a></p>]]></description>
            <link>https://miguel.build/b/the-nintendo-ds-clock-on-your-phone</link>
            <guid isPermaLink="true">https://miguel.build/b/the-nintendo-ds-clock-on-your-phone</guid>
            <pubDate>Tue, 03 Jun 2025 16:49:58 GMT</pubDate>
            <source:markdown>![an iPhone on StandBy mode, showing a clock widget themed after the Nintendo DS clock alongside a widget showing a grid of 365 dots, where the first 154 are filled in and the rest are gray.](https://web-assets.miguel.build/ds-clock-standby.jpg)

I&apos;ve been feeling a bit nostalgic for old consoles recently, with the Switch 2 finally dropping this week.

To celebrate, [my girlfriend](https://twitter.com/ruedart) and I spent the weekend recreating the original Nintendo DS clock as an iOS widget. It&apos;s now live on the App Store!

[Download on the App Store](https://apps.apple.com/us/app/dsclock-retro-clock-widget/id6746729918)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[A Swift SDK for the OpenAI Images API]]></title>
            <description><![CDATA[<pre><code class="language-swift">import OpenAlImages

let client = ImagesAPI(authToken: OPENAI_API_KEY)

let response = try await client.create(prompt: "A cute cat")

let response = try await client.edit(
    image: .url(
        Bundle.main.url(forResource: "image", withExtension: "png"),
        format: .png
    ),
    prompt: "Change the color of the sky"
)
</code></pre>
<p>OpenAI finally made their latest image generation model available through the API! I'm planning to build an app that makes use of it soon, so I needed a lightweight SDK for interacting with it.</p>
<p><a href="https://github.com/m1guelpf/swift-openai-images">View on GitHub</a></p>]]></description>
            <link>https://miguel.build/b/a-swift-sdk-for-the-openai-images-api</link>
            <guid isPermaLink="true">https://miguel.build/b/a-swift-sdk-for-the-openai-images-api</guid>
            <pubDate>Thu, 24 Apr 2025 04:34:44 GMT</pubDate>
            <source:markdown>```swift
import OpenAlImages

let client = ImagesAPI(authToken: OPENAI_API_KEY)

let response = try await client.create(prompt: &quot;A cute cat&quot;)

let response = try await client.edit(
    image: .url(
        Bundle.main.url(forResource: &quot;image&quot;, withExtension: &quot;png&quot;),
        format: .png
    ),
    prompt: &quot;Change the color of the sky&quot;
)
```

OpenAI finally made their latest image generation model available through the API! I&apos;m planning to build an app that makes use of it soon, so I needed a lightweight SDK for interacting with it.

[View on GitHub](https://github.com/m1guelpf/swift-openai-images)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[A library to let AI take over your computer]]></title>
            <description><![CDATA[<pre><code class="language-swift">let agent = Agent(model: .aceSmall, apiKey: "sk_...")
let computer = Computer()

let session = agent.start("Star the GeneralAgentsKit github repository")

var observation = try await computer.observe()
while true {
    let action = try await session plan(observation: observation)

    print("Executing: \(action)")
    if action.kind == .stop { break }

    observation = try await computer.execute(action)
}
</code></pre>
<p>I've been having a lot of fun playing with "Computer Use" APIs (where an AI model can issue instructions to control a computer or browser).</p>
<p>This week, I found a pretty promising API (by General Agents), and built a nice Swift wrapper over it that gives the AI control over your keyboard and mouse!</p>
<p><a href="https://github.com/m1guelpf/GeneralAgentsKit">View on GitHub</a></p>]]></description>
            <link>https://miguel.build/b/a-library-to-let-ai-take-over-your-computer</link>
            <guid isPermaLink="true">https://miguel.build/b/a-library-to-let-ai-take-over-your-computer</guid>
            <pubDate>Thu, 03 Apr 2025 05:15:43 GMT</pubDate>
            <source:markdown>```swift
let agent = Agent(model: .aceSmall, apiKey: &quot;sk_...&quot;)
let computer = Computer()

let session = agent.start(&quot;Star the GeneralAgentsKit github repository&quot;)

var observation = try await computer.observe()
while true {
    let action = try await session plan(observation: observation)

    print(&quot;Executing: \(action)&quot;)
    if action.kind == .stop { break }

    observation = try await computer.execute(action)
}
```

I&apos;ve been having a lot of fun playing with &quot;Computer Use&quot; APIs (where an AI model can issue instructions to control a computer or browser).

This week, I found a pretty promising API (by General Agents), and built a nice Swift wrapper over it that gives the AI control over your keyboard and mouse!

[View on GitHub](https://github.com/m1guelpf/GeneralAgentsKit)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Imagining an app that turns your friends into stickers]]></title>
            <description><![CDATA[<p></p>
<p>OpenAI just released an incredibly update to their image generation tooling, and I've had a blast playing with all the different styles.</p>
<p>One of my favorites was the "Sticker" style, and even though there's not an API for it yet, I thought I'd try my hand at designing how it could look like.</p>]]></description>
            <link>https://miguel.build/b/imagining-an-app-that-turns-your-friends-into-stickers</link>
            <guid isPermaLink="true">https://miguel.build/b/imagining-an-app-that-turns-your-friends-into-stickers</guid>
            <pubDate>Fri, 28 Mar 2025 23:49:13 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/glimmer-splash/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/glimmer-splash/poster.jpg&quot; muted type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

OpenAI just released an incredibly update to their image generation tooling, and I&apos;ve had a blast playing with all the different styles.

One of my favorites was the &quot;Sticker&quot; style, and even though there&apos;s not an API for it yet, I thought I&apos;d try my hand at designing how it could look like.</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/glimmer-splash/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/glimmer-splash/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[Making AI-powered iOS apps effortless]]></title>
            <description><![CDATA[<pre><code class="language-swift">import OpenAI
import SwiftUI

struct ChatView: View {
	  @State var newMessage: String = ""
	  @State var conversation = Conversation(authToken: OPENAI_KEY, using: .gpt4o)

	  var body: some View {
    		VStack(spacing: 0) {
    			  ScrollView {
                VStack(spacing: 12) {
                    ForEach(conversation.messages, id: .self) { message in
                        MessageBubble(message: message)
                    }
                }
    			  }

    			  TextField("Chat", text: $newMessage)
    				    .frame(height: 40)
    				    .submitLabel(.send)
    				    .onSubmit {
    				        Task {
      			            try await conversation.send(text: newMessage)
      			            newMessage = ""
      		          }
    				    }
    		}
    		.navigationBarTitle("Chat", displayMode: .inline)
    }
}
</code></pre>
<p>After finishing working on the Rust SDK, I got some cool ideas of how the developer experience could look like for building AI-powered iOS apps.</p>
<p>This time, instead of just a wrapper over the API, the SDK comes with a <code>Conversation</code> utility which manages all the hard things for you.</p>
<p><a href="https://github.com/m1guelpf/swift-openai-responses">View on GitHub</a></p>]]></description>
            <link>https://miguel.build/b/making-ai-powered-ios-apps-effortless</link>
            <guid isPermaLink="true">https://miguel.build/b/making-ai-powered-ios-apps-effortless</guid>
            <pubDate>Fri, 21 Mar 2025 22:32:59 GMT</pubDate>
            <source:markdown>```swift
import OpenAI
import SwiftUI

struct ChatView: View {
	  @State var newMessage: String = &quot;&quot;
	  @State var conversation = Conversation(authToken: OPENAI_KEY, using: .gpt4o)

	  var body: some View {
    		VStack(spacing: 0) {
    			  ScrollView {
                VStack(spacing: 12) {
                    ForEach(conversation.messages, id: .self) { message in
                        MessageBubble(message: message)
                    }
                }
    			  }

    			  TextField(&quot;Chat&quot;, text: $newMessage)
    				    .frame(height: 40)
    				    .submitLabel(.send)
    				    .onSubmit {
    				        Task {
      			            try await conversation.send(text: newMessage)
      			            newMessage = &quot;&quot;
      		          }
    				    }
    		}
    		.navigationBarTitle(&quot;Chat&quot;, displayMode: .inline)
    }
}
```

After finishing working on the Rust SDK, I got some cool ideas of how the developer experience could look like for building AI-powered iOS apps.

This time, instead of just a wrapper over the API, the SDK comes with a `Conversation` utility which manages all the hard things for you.

[View on GitHub](https://github.com/m1guelpf/swift-openai-responses)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[A Rust SDK for the OpenAI Responses API]]></title>
            <description><![CDATA[<pre><code class="language-rust">use openai_responses::{Client, Request, types::{Input, Model}};

let response = Client::from_env()?.create(Request {
    model: Model::GPT4o,
    input: Input::Text("Are semicolons optional in JavaScript?".to_string()),
    instructions: Some("You are a coding assistant that talks like a pirate".to_string()),
    ..Default::default()
}).await?;

println!("{}", response.output_text());
</code></pre>
<p>OpenAI released a new API today to unify all of their models under a single endpoint. They released Python and JS SDKs, but I wanted one for Rust, so I spent some time knocking one out.</p>
<p>I'm particularly happy with the way I managed to "Rust-ify" the types to make them feel more idiomatic. Will be building some cool stuff with it soon!</p>
<p><a href="https://github.com/m1guelpf/openai-responses-rs">View on GitHub</a></p>]]></description>
            <link>https://miguel.build/b/a-rust-sdk-for-the-openai-responses-api</link>
            <guid isPermaLink="true">https://miguel.build/b/a-rust-sdk-for-the-openai-responses-api</guid>
            <pubDate>Wed, 12 Mar 2025 20:30:07 GMT</pubDate>
            <source:markdown>```rust
use openai_responses::{Client, Request, types::{Input, Model}};

let response = Client::from_env()?.create(Request {
    model: Model::GPT4o,
    input: Input::Text(&quot;Are semicolons optional in JavaScript?&quot;.to_string()),
    instructions: Some(&quot;You are a coding assistant that talks like a pirate&quot;.to_string()),
    ..Default::default()
}).await?;

println!(&quot;{}&quot;, response.output_text());
```

OpenAI released a new API today to unify all of their models under a single endpoint. They released Python and JS SDKs, but I wanted one for Rust, so I spent some time knocking one out.

I&apos;m particularly happy with the way I managed to &quot;Rust-ify&quot; the types to make them feel more idiomatic. Will be building some cool stuff with it soon!

[View on GitHub](https://github.com/m1guelpf/openai-responses-rs)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Disappearing Text Effect]]></title>
            <description><![CDATA[<p></p>
<p>Saw a particularly neat effect on the <a href="https://devouringdetails.com/">Devouring Details</a> website, where your email vanishes after you subscribe to the newsletter. After playing around for a few hours, I managed to recreate it perfectly!</p>
<p><a href="https://gist.github.com/m1guelpf/f17540f221b575d2f818c9585664f55f">View on GitHub</a></p>]]></description>
            <link>https://miguel.build/b/disappearing-text-effect</link>
            <guid isPermaLink="true">https://miguel.build/b/disappearing-text-effect</guid>
            <pubDate>Tue, 04 Mar 2025 01:53:49 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/text-vanish/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/text-vanish/poster.jpg&quot; muted type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

Saw a particularly neat effect on the [Devouring Details](https://devouringdetails.com/) website, where your email vanishes after you subscribe to the newsletter. After playing around for a few hours, I managed to recreate it perfectly!

[View on GitHub](https://gist.github.com/m1guelpf/f17540f221b575d2f818c9585664f55f)</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/text-vanish/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/text-vanish/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[Love or Bot]]></title>
            <description><![CDATA[<p></p>
<p>For Valentine's Day, I built a game where you are shown a bunch of photos, and need to figure out if they are real or AI-generated. It's harder than it looks, try it out!</p>
<p><a href="https://world.org/ecosystem/app_f9d14c86a530b4e66b44b6d01e6ba454">Play on World App</a></p>]]></description>
            <link>https://miguel.build/b/love-or-bot</link>
            <guid isPermaLink="true">https://miguel.build/b/love-or-bot</guid>
            <pubDate>Fri, 14 Feb 2025 15:34:22 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/loveorbot/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/loveorbot/poster.jpg&quot;  type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

For Valentine&apos;s Day, I built a game where you are shown a bunch of photos, and need to figure out if they are real or AI-generated. It&apos;s harder than it looks, try it out!

[Play on World App](https://world.org/ecosystem/app_f9d14c86a530b4e66b44b6d01e6ba454)</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/loveorbot/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/loveorbot/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[React Server Actions, for PHP]]></title>
            <description><![CDATA[<pre><code class="language-tsx">import { php } from '@/lib/php' // [!code focus]
import { startTransition, useState } from 'react'

const ExamplePage = () => {
    const [email, setEmail] = useState('')
    const [password, setPassword] = useState('')
    const [response, setResponse] = useState(null)

    // [!code focus:9]
    const signIn = php`
        use Illuminate\Support\Facades\Auth;

        function (string $email, string $password) {
            Auth::attempt(['email' => $email, 'password' => $password]);

            return Auth::user() ?? response()->json(['error' => 'Invalid credentials'], 401)
        }
    `

    return (
        &#x3C;div>
            &#x3C;h1>Sign In&#x3C;/h1>
            {response &#x26;&#x26; &#x3C;pre>{JSON.stringify(response)}&#x3C;/pre>}
            &#x3C;input type="email" value={email} onChange={e => setEmail(e.target.value)} />
            &#x3C;input type="password" value={password} onChange={e => setPassword(e.target.value)} />
            &#x3C;button
                onClick={() => // [!code focus]
                    startTransition(async () => signIn(email, password).then(response => setResponse(response))) // [!code focus]
                } // [!code focus]
            >Log In&#x3C;/button>
        &#x3C;/div>
    )
}

export default ExamplePage
</code></pre>
<p>I recently saw <a href="https://github.com/fusion-php/fusion">Fusion</a>, a PHP package that lets you write PHP directly inside of Vue components. Inspired by it, I thought I'd try my hand at a React version.</p>
<p>It's a work in progress, but it works! You define PHP functions inside of JS and call them like regular JS functions. I even got syntax highlighting working in VSCode!</p>
<p><a href="https://github.com/m1guelpf/php-server-actions">View on GitHub</a></p>]]></description>
            <link>https://miguel.build/b/react-server-actions-for-php</link>
            <guid isPermaLink="true">https://miguel.build/b/react-server-actions-for-php</guid>
            <pubDate>Sat, 08 Feb 2025 20:44:55 GMT</pubDate>
            <source:markdown>```tsx
import { php } from &apos;@/lib/php&apos; // [!code focus]
import { startTransition, useState } from &apos;react&apos;

const ExamplePage = () =&gt; {
    const [email, setEmail] = useState(&apos;&apos;)
    const [password, setPassword] = useState(&apos;&apos;)
    const [response, setResponse] = useState(null)

    // [!code focus:9]
    const signIn = php`
        use Illuminate\Support\Facades\Auth;

        function (string $email, string $password) {
            Auth::attempt([&apos;email&apos; =&gt; $email, &apos;password&apos; =&gt; $password]);

            return Auth::user() ?? response()-&gt;json([&apos;error&apos; =&gt; &apos;Invalid credentials&apos;], 401)
        }
    `

    return (
        &lt;div&gt;
            &lt;h1&gt;Sign In&lt;/h1&gt;
            {response &amp;&amp; &lt;pre&gt;{JSON.stringify(response)}&lt;/pre&gt;}
            &lt;input type=&quot;email&quot; value={email} onChange={e =&gt; setEmail(e.target.value)} /&gt;
            &lt;input type=&quot;password&quot; value={password} onChange={e =&gt; setPassword(e.target.value)} /&gt;
            &lt;button
                onClick={() =&gt; // [!code focus]
                    startTransition(async () =&gt; signIn(email, password).then(response =&gt; setResponse(response))) // [!code focus]
                } // [!code focus]
            &gt;Log In&lt;/button&gt;
        &lt;/div&gt;
    )
}

export default ExamplePage
```

I recently saw [Fusion](https://github.com/fusion-php/fusion), a PHP package that lets you write PHP directly inside of Vue components. Inspired by it, I thought I&apos;d try my hand at a React version.

It&apos;s a work in progress, but it works! You define PHP functions inside of JS and call them like regular JS functions. I even got syntax highlighting working in VSCode!

[View on GitHub](https://github.com/m1guelpf/php-server-actions)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[A lightweight pipeline system for Swift.]]></title>
            <description><![CDATA[<pre><code class="language-swift">import Pipeline;

try Pipeline.send(project).through(
    .pipe(BuildProject(),
    .pipe(UploadProject(),
    .pipe(DeployProject()),
    .fn { project in
        // ...

        return project
    }
))).run()
</code></pre>
<p>I recently attended LaraconEU, where I watched a talk going over all the things that Laravel's relatively-simple Pipeline class makes so much easier. It felt like the kind of thing that could come in handy in the future, so I thought I'd quickly build a Swift version.</p>
<p><a href="https://github.com/m1guelpf/swift-pipeline">View on GitHub</a></p>]]></description>
            <link>https://miguel.build/b/a-lightweight-pipeline-system-for-swift</link>
            <guid isPermaLink="true">https://miguel.build/b/a-lightweight-pipeline-system-for-swift</guid>
            <pubDate>Mon, 03 Feb 2025 13:44:55 GMT</pubDate>
            <source:markdown>```swift
import Pipeline;

try Pipeline.send(project).through(
    .pipe(BuildProject(),
    .pipe(UploadProject(),
    .pipe(DeployProject()),
    .fn { project in
        // ...

        return project
    }
))).run()
```

I recently attended LaraconEU, where I watched a talk going over all the things that Laravel&apos;s relatively-simple Pipeline class makes so much easier. It felt like the kind of thing that could come in handy in the future, so I thought I&apos;d quickly build a Swift version.

[View on GitHub](https://github.com/m1guelpf/swift-pipeline)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[A simple Swift library for watching over your Mac]]></title>
            <description><![CDATA[<pre><code class="language-swift">import AppKit
import WatchEye
import Foundation

class ExampleWatchEyeDelegate {
	let watchEye: WatchEye

	init() {
		watchEye = WatchEye()
		watchEye.delegate = self
	}
}

extension ExampleWatchEyeDelegate: WatchEyeDelegate {
	func watchEyeDidReceiveAccessibilityPermissions(_: WatchEye) {
        print("Accessibility permissions granted!")
    }

	func watchEye(_: WatchEye, didFocusApplication app: NSRunningApplication) {
        print("(app.bundleIdentifier!) is now in focus")
    }

	func watchEye(_: WatchEye, didChangeTitleOf app: NSRunningApplication, newTitle title: String) {
        if app.browser?.isIncognito(windowTitle: title) == true { return }

		print("Title of (app.bundleIdentifier!) changed to (title)")

        if let url = app.browser?.getURL() {
			print("URL of (app.bundleIdentifier!) is now (url)")
		}
	}
}
</code></pre>
<p>For an upcoming macOS app I've been working on, I needed a way to watch over other apps while on the background. You can do this with the Accessibility API, but it is quite complicated to set up.</p>
<p>I built a lil helper class for my app, and thought I'd also release it as a library for others to use.</p>
<p><a href="https://github.com/m1guelpf/WatchEye">View on GitHub</a></p>]]></description>
            <link>https://miguel.build/b/a-simple-swift-library-for-watching-over-your-mac</link>
            <guid isPermaLink="true">https://miguel.build/b/a-simple-swift-library-for-watching-over-your-mac</guid>
            <pubDate>Mon, 27 Jan 2025 03:48:49 GMT</pubDate>
            <source:markdown>```swift
import AppKit
import WatchEye
import Foundation

class ExampleWatchEyeDelegate {
	let watchEye: WatchEye

	init() {
		watchEye = WatchEye()
		watchEye.delegate = self
	}
}

extension ExampleWatchEyeDelegate: WatchEyeDelegate {
	func watchEyeDidReceiveAccessibilityPermissions(_: WatchEye) {
        print(&quot;Accessibility permissions granted!&quot;)
    }

	func watchEye(_: WatchEye, didFocusApplication app: NSRunningApplication) {
        print(&quot;(app.bundleIdentifier!) is now in focus&quot;)
    }

	func watchEye(_: WatchEye, didChangeTitleOf app: NSRunningApplication, newTitle title: String) {
        if app.browser?.isIncognito(windowTitle: title) == true { return }

		print(&quot;Title of (app.bundleIdentifier!) changed to (title)&quot;)

        if let url = app.browser?.getURL() {
			print(&quot;URL of (app.bundleIdentifier!) is now (url)&quot;)
		}
	}
}
```

For an upcoming macOS app I&apos;ve been working on, I needed a way to watch over other apps while on the background. You can do this with the Accessibility API, but it is quite complicated to set up.

I built a lil helper class for my app, and thought I&apos;d also release it as a library for others to use.

[View on GitHub](https://github.com/m1guelpf/WatchEye)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[A nice SwiftUI landing screen]]></title>
            <description><![CDATA[<p></p>
<p>Thought I'd build a very simple HomeKit controller app during Christmas, then spent most of the time building the first splash screen for the app instead of the actual app. looks pretty nice tho!</p>]]></description>
            <link>https://miguel.build/b/a-nice-swiftui-landing-screen</link>
            <guid isPermaLink="true">https://miguel.build/b/a-nice-swiftui-landing-screen</guid>
            <pubDate>Thu, 26 Dec 2024 07:23:25 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/lodge/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/lodge/poster.jpg&quot; muted type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

Thought I&apos;d build a very simple HomeKit controller app during Christmas, then spent most of the time building the first splash screen for the app instead of the actual app. looks pretty nice tho!</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/lodge/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/lodge/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[Making OpenAI's new APIs production-ready]]></title>
            <description><![CDATA[<pre><code class="language-rust">use axum::{extract::WebSocketUpgrade, response::IntoResponse, routing::get, Router};

#[tokio::main]
async fn main() {
    let app = Router::new().route("/ws", get(ws_handler));

    let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
    axum::serve(listener, app).await.unwrap();
}

async fn ws_handler(ws: WebSocketUpgrade) -> impl IntoResponse {
    // check for authentication/access/etc. here

    let proxy = realtime_proxy::Proxy::new(
        std::env::var("OPENAI_API_KEY").expect("OPENAI_API_TOKEN env var not set.")
    );

    ws.on_upgrade(|socket| proxy.handle(socket))
}
</code></pre>
<p>OpenAI recently released a new Realtime API, which lets you build conversational interfaces with almost real-time voice responses.</p>
<p>Their API connects directly to the client using WebSockets, which means you'll leak not only your system prompt but also your API keys unless you use some sort of proxy backend for the connection.</p>
<p>To solve this, I built the proxy code as a library, making it super easy to add your own logic on top and safely push the new APIs to prod!</p>
<p><a href="https://github.com/m1guelpf/openai-realtime-proxy">View on GitHub</a></p>]]></description>
            <link>https://miguel.build/b/making-openais-new-apis-production-ready</link>
            <guid isPermaLink="true">https://miguel.build/b/making-openais-new-apis-production-ready</guid>
            <pubDate>Tue, 01 Oct 2024 22:10:02 GMT</pubDate>
            <source:markdown>```rust
use axum::{extract::WebSocketUpgrade, response::IntoResponse, routing::get, Router};

#[tokio::main]
async fn main() {
    let app = Router::new().route(&quot;/ws&quot;, get(ws_handler));

    let listener = tokio::net::TcpListener::bind(&quot;0.0.0.0:3000&quot;).await.unwrap();
    axum::serve(listener, app).await.unwrap();
}

async fn ws_handler(ws: WebSocketUpgrade) -&gt; impl IntoResponse {
    // check for authentication/access/etc. here

    let proxy = realtime_proxy::Proxy::new(
        std::env::var(&quot;OPENAI_API_KEY&quot;).expect(&quot;OPENAI_API_TOKEN env var not set.&quot;)
    );

    ws.on_upgrade(|socket| proxy.handle(socket))
}
```

OpenAI recently released a new Realtime API, which lets you build conversational interfaces with almost real-time voice responses.

Their API connects directly to the client using WebSockets, which means you&apos;ll leak not only your system prompt but also your API keys unless you use some sort of proxy backend for the connection.

To solve this, I built the proxy code as a library, making it super easy to add your own logic on top and safely push the new APIs to prod!

[View on GitHub](https://github.com/m1guelpf/openai-realtime-proxy)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Polishing up this site]]></title>
            <description><![CDATA[<p>Last week, I updated some of the animations on the site and, while making sure everything looked great, noticed things were running concerningly slow.</p>
<p>To make things smoother, I migrated the site from Next.js to <a href="https://astro.build">Astro</a>, which let me strip most of the JS in the site (with little "islands" of interactivity). It now loads much faster!</p>]]></description>
            <link>https://miguel.build/b/polishing-up-this-site</link>
            <guid isPermaLink="true">https://miguel.build/b/polishing-up-this-site</guid>
            <pubDate>Sun, 16 Jun 2024 03:35:10 GMT</pubDate>
            <source:markdown>

Last week, I updated some of the animations on the site and, while making sure everything looked great, noticed things were running concerningly slow.

To make things smoother, I migrated the site from Next.js to [Astro](https://astro.build), which let me strip most of the JS in the site (with little &quot;islands&quot; of interactivity). It now loads much faster!</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[A better way to organize AI prompts in Rust]]></title>
            <description><![CDATA[<pre><code class="language-rust">use prompt_organizer::prompt;

prompt!{my_custom_prompt, r#"
    You are {name}, {user}'s AI assistant. When responding to a message,
    you add "quotes" around the message and sign it with your name.

    Make sure that the message is correctly formatted, and that the
    user's name is always capitalized.
"#}
// ^ expands to:
// pub fn my_custom_prompt(name: &#x26;str, user: &#x26;str) -> String {
//   // returns the prompt with the variables replaced, and the indentation normalized
// }
</code></pre>
<p>I've now built a few AI-powered Rust apps, and something that's always bothered me is that there's no good place to represent your prompts in your code. Storing them as separate files makes it harder to insert dynamic data, but keeping them inline leads to a lot of messy boilerplate.</p>
<p>To fix this, I built a simple macro that lets you define your prompts alongside your code, but still get nice indentation, variable replacement, and compile-time type checking.</p>
<p><a href="https://github.com/m1guelpf/prompt-organizer">View on GitHub</a></p>]]></description>
            <link>https://miguel.build/b/a-better-way-to-organize-ai-prompts-in-rust</link>
            <guid isPermaLink="true">https://miguel.build/b/a-better-way-to-organize-ai-prompts-in-rust</guid>
            <pubDate>Mon, 29 Apr 2024 09:49:02 GMT</pubDate>
            <source:markdown>```rust
use prompt_organizer::prompt;

prompt!{my_custom_prompt, r#&quot;
    You are {name}, {user}&apos;s AI assistant. When responding to a message,
    you add &quot;quotes&quot; around the message and sign it with your name.

    Make sure that the message is correctly formatted, and that the
    user&apos;s name is always capitalized.
&quot;#}
// ^ expands to:
// pub fn my_custom_prompt(name: &amp;str, user: &amp;str) -&gt; String {
//   // returns the prompt with the variables replaced, and the indentation normalized
// }
```

I&apos;ve now built a few AI-powered Rust apps, and something that&apos;s always bothered me is that there&apos;s no good place to represent your prompts in your code. Storing them as separate files makes it harder to insert dynamic data, but keeping them inline leads to a lot of messy boilerplate.

To fix this, I built a simple macro that lets you define your prompts alongside your code, but still get nice indentation, variable replacement, and compile-time type checking.

[View on GitHub](https://github.com/m1guelpf/prompt-organizer)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[An app to easily find liked tweets]]></title>
            <description><![CDATA[<p><img src="https://web-assets.miguel.build/perch-appstore.jpg" alt="Promotional image for Perch – a refreshingly simple app for managing your Twitter likes, designed to make finding &#x22;that one tweet&#x22; a breeze."></p>
<p>After the thousandth time going "let me find that tweet real quick" just to never find it, I decided to do something about it. Perch lets you filter all your liked tweets by author, keyword, links, the kind of media they contain and more, so you can always go back to anything you've seen.</p>
<p><a href="https://apple.co/448gDz6">Download on the App Store</a></p>]]></description>
            <link>https://miguel.build/b/an-app-to-easily-find-liked-tweets</link>
            <guid isPermaLink="true">https://miguel.build/b/an-app-to-easily-find-liked-tweets</guid>
            <pubDate>Thu, 18 Apr 2024 16:31:24 GMT</pubDate>
            <source:markdown>![Promotional image for Perch – a refreshingly simple app for managing your Twitter likes, designed to make finding &quot;that one tweet&quot; a breeze.](https://web-assets.miguel.build/perch-appstore.jpg)

After the thousandth time going &quot;let me find that tweet real quick&quot; just to never find it, I decided to do something about it. Perch lets you filter all your liked tweets by author, keyword, links, the kind of media they contain and more, so you can always go back to anything you&apos;ve seen.

[Download on the App Store](https://apple.co/448gDz6)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Reverse-engineering my 3D printer's API]]></title>
            <description><![CDATA[<pre><code class="language-rust">use bambulab_cloud::cloud::{Client, Region};

let client = Client::login(Region::Europe, "email@example.com", "password").await?;
let tasks = client.get_tasks().await?;

dbg!(tasks);
// [src/main.rs:6] tasks = [
//   Task {
//      id: 67318297,
//      length: 2783,
//      weight: 81.66,
//      cost_time: 6541s,
//      cover: Url { ... },
//      end_time: 2024-04-06T01:51:58Z,
//      start_time: 2024-04-05T23:56:48Z,
//      design_title: "Cursed Benchys #1",
//      title: "0.24mm layer, 3 walls, 30% infill",
//      ...
//   },
// ]
</code></pre>
<p>I recently got a Bambu Lab 3D printer, which of course means I'm constantly checking their app to see the progress of my prints. To make obsessing a little easier, I decided to reverse-engineer the API they use to fetch things like the status or preview images, and build a Rust client for it.</p>
<p><a href="https://github.com/m1guelpf/bambulab-rs">View on GitHub</a></p>]]></description>
            <link>https://miguel.build/b/reverse-engineering-my-3d-printers-api</link>
            <guid isPermaLink="true">https://miguel.build/b/reverse-engineering-my-3d-printers-api</guid>
            <pubDate>Wed, 10 Apr 2024 20:52:43 GMT</pubDate>
            <source:markdown>```rust
use bambulab_cloud::cloud::{Client, Region};

let client = Client::login(Region::Europe, &quot;email@example.com&quot;, &quot;password&quot;).await?;
let tasks = client.get_tasks().await?;

dbg!(tasks);
// [src/main.rs:6] tasks = [
//   Task {
//      id: 67318297,
//      length: 2783,
//      weight: 81.66,
//      cost_time: 6541s,
//      cover: Url { ... },
//      end_time: 2024-04-06T01:51:58Z,
//      start_time: 2024-04-05T23:56:48Z,
//      design_title: &quot;Cursed Benchys #1&quot;,
//      title: &quot;0.24mm layer, 3 walls, 30% infill&quot;,
//      ...
//   },
// ]
```

I recently got a Bambu Lab 3D printer, which of course means I&apos;m constantly checking their app to see the progress of my prints. To make obsessing a little easier, I decided to reverse-engineer the API they use to fetch things like the status or preview images, and build a Rust client for it.

[View on GitHub](https://github.com/m1guelpf/bambulab-rs)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Bringing a calmer feed to life]]></title>
            <description><![CDATA[<p></p>
<p>Scrolling through Twitter, I found <a href="https://twitter.com/samdape/status/1762179245697122614">a pretty sick text-only Twitter concept</a>. I've been looking for excuses to practice my SwiftUI skills, so I took it as a challenge and turned it into a real app, adding a few fun things along the way like dithered images and a super smooth tab bar microinteraction.</p>
<p><a href="https://github.com/m1guelpf/textos-twitter">View on GitHub</a></p>]]></description>
            <link>https://miguel.build/b/bringing-a-calmer-feed-to-life</link>
            <guid isPermaLink="true">https://miguel.build/b/bringing-a-calmer-feed-to-life</guid>
            <pubDate>Sat, 02 Mar 2024 14:50:42 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/textos/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/textos/poster.jpg&quot;  type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

Scrolling through Twitter, I found [a pretty sick text-only Twitter concept](https://twitter.com/samdape/status/1762179245697122614). I&apos;ve been looking for excuses to practice my SwiftUI skills, so I took it as a challenge and turned it into a real app, adding a few fun things along the way like dithered images and a super smooth tab bar microinteraction.

[View on GitHub](https://github.com/m1guelpf/textos-twitter)</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/textos/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/textos/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[My first SwiftUI app]]></title>
            <description><![CDATA[<p></p>
<p>After years of putting it off, I finally got to learning SwiftUI. This first app is a very simple "talk with AI" interaction, inspired by a demo from OpenAI's DevDay a few months ago. It's extremely simple, but I'm super happy with how it turned out!</p>
<p><a href="https://github.com/m1guelpf/indigo">View on GitHub</a></p>]]></description>
            <link>https://miguel.build/b/my-first-swiftui-app</link>
            <guid isPermaLink="true">https://miguel.build/b/my-first-swiftui-app</guid>
            <pubDate>Thu, 01 Feb 2024 02:04:15 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/indigo/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/indigo/poster.jpg&quot;  type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

After years of putting it off, I finally got to learning SwiftUI. This first app is a very simple &quot;talk with AI&quot; interaction, inspired by a demo from OpenAI&apos;s DevDay a few months ago. It&apos;s extremely simple, but I&apos;m super happy with how it turned out!

[View on GitHub](https://github.com/m1guelpf/indigo)</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/indigo/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/indigo/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[A Rust SDK for World ID]]></title>
            <description><![CDATA[<p></p>
<p>Most of the World ID integrations so far have been on the web or mobile, since that's what we have SDKs for. For everyone else, I took a stab at building a Rust crate (which can be called from Swift, Python, etc.) that can serve as a more universal bridge to the protocol.</p>
<p><a href="https://github.com/worldcoin/idkit-rs">View on GitHub</a></p>]]></description>
            <link>https://miguel.build/b/a-rust-sdk-for-world-id</link>
            <guid isPermaLink="true">https://miguel.build/b/a-rust-sdk-for-world-id</guid>
            <pubDate>Tue, 30 Jan 2024 17:27:05 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/idkit-rs/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/idkit-rs/poster.jpg&quot;  type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

Most of the World ID integrations so far have been on the web or mobile, since that&apos;s what we have SDKs for. For everyone else, I took a stab at building a Rust crate (which can be called from Swift, Python, etc.) that can serve as a more universal bridge to the protocol.

[View on GitHub](https://github.com/worldcoin/idkit-rs)</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/idkit-rs/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/idkit-rs/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[Monitoring air quality with Rust.]]></title>
            <description><![CDATA[<pre><code class="language-rust">let device = aranet::connect().await?;
let measurements = device.measurements().await?;

dbg!(measurements);
// [src/main.rs:6] measurements = SensorData {
//   со2: 962,
//   battery: 76,
//   humidity: 49,
//   status: GREEN,
//   pressure: 1017,
//   interval: 300s,
//   temperature: 25.75,
//   since_last_update: 127s,
// }
</code></pre>
<p>I've owned an Aranet4 CO₂ monitor for a while now, and while the device itself is great, it's not compatible with any smart home systems.</p>
<p>I wanted to get push notifications when the CO₂ levels in my room were too high, so I reverse-engineered the BLE protocol it uses and built a simple Rust library to interact with it.</p>
<p><a href="https://github.com/m1guelpf/aranet-rs">View on GitHub</a></p>]]></description>
            <link>https://miguel.build/b/monitoring-air-quality-with-rust</link>
            <guid isPermaLink="true">https://miguel.build/b/monitoring-air-quality-with-rust</guid>
            <pubDate>Thu, 11 Jan 2024 01:19:25 GMT</pubDate>
            <source:markdown>```rust
let device = aranet::connect().await?;
let measurements = device.measurements().await?;

dbg!(measurements);
// [src/main.rs:6] measurements = SensorData {
//   со2: 962,
//   battery: 76,
//   humidity: 49,
//   status: GREEN,
//   pressure: 1017,
//   interval: 300s,
//   temperature: 25.75,
//   since_last_update: 127s,
// }
```

I&apos;ve owned an Aranet4 CO₂ monitor for a while now, and while the device itself is great, it&apos;s not compatible with any smart home systems.

I wanted to get push notifications when the CO₂ levels in my room were too high, so I reverse-engineered the BLE protocol it uses and built a simple Rust library to interact with it.

[View on GitHub](https://github.com/m1guelpf/aranet-rs)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Exploring dependency injection in Rust.]]></title>
            <description><![CDATA[<pre><code class="language-rust">use silhouette::facade::Container;

struct DBPool {}
struct DBConnection {}

// will always use the same pool
Container::singleton(&#x26;|_| DBPool::new())?;

// will resolve a new connection each time
Container::bind(&#x26;|container| -> DBConnection {
    let shared_pool = container.resolve::&#x3C;DBPool>().unwrap();

    shared_pool.get_conn()
})?;

// somewhere else in your app...
let connection: DBConnection = Container::resolve()?;
</code></pre>
<p>Dependency injection is one of my favourite patterns (it's also the secret sauce behind Laravel), but Rust's type system and borrow checker make it impossible to fully implement.</p>
<p>Nevertheless, I wanted to see how far I could get, so I built a super simple service container that lets you register and resolve services, with support for singletons and closures. No interfaces tho 😅</p>
<p><a href="https://github.com/m1guelpf/silhouette">View on GitHub</a></p>]]></description>
            <link>https://miguel.build/b/exploring-dependency-injection-in-rust</link>
            <guid isPermaLink="true">https://miguel.build/b/exploring-dependency-injection-in-rust</guid>
            <pubDate>Thu, 21 Dec 2023 14:30:00 GMT</pubDate>
            <source:markdown>```rust
use silhouette::facade::Container;

struct DBPool {}
struct DBConnection {}

// will always use the same pool
Container::singleton(&amp;|_| DBPool::new())?;

// will resolve a new connection each time
Container::bind(&amp;|container| -&gt; DBConnection {
    let shared_pool = container.resolve::&lt;DBPool&gt;().unwrap();

    shared_pool.get_conn()
})?;

// somewhere else in your app...
let connection: DBConnection = Container::resolve()?;
```

Dependency injection is one of my favourite patterns (it&apos;s also the secret sauce behind Laravel), but Rust&apos;s type system and borrow checker make it impossible to fully implement.

Nevertheless, I wanted to see how far I could get, so I built a super simple service container that lets you register and resolve services, with support for singletons and closures. No interfaces tho 😅

[View on GitHub](https://github.com/m1guelpf/silhouette)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[An elegant event listener package for Rust.]]></title>
            <description><![CDATA[<pre><code class="language-rust">use epicenter::{Event, AsyncDispatcher};

#[derive(Debug, Event)]
struct ExampleEvent {}

// There'a also a SyncDispatcher you can use
let mut dispatcher = AsyncDispatcher::new();

// Register a callback to run when an event is dispatched
// This gets access to the event, so it can retrieve data from it!
dispatcher.listen(|event: ExampleEvent| async move {
    // ...
}).await;

// Dispatch an event to all listeners
dispatcher.dispatch(&#x26;ExampleEvent {}).await?;
</code></pre>
<p>When building a few of my last Rust crates, I found myself wanting to provide a simple way to let callers hook into certain events. While there are a few event dispatcher crates out there, none of them were simple and elegant enough, so I decided to build my own.</p>
<p><a href="https://github.com/m1guelpf/epicenter">View on GitHub</a></p>]]></description>
            <link>https://miguel.build/b/an-elegant-event-listener-package-for-rust</link>
            <guid isPermaLink="true">https://miguel.build/b/an-elegant-event-listener-package-for-rust</guid>
            <pubDate>Wed, 20 Dec 2023 14:30:01 GMT</pubDate>
            <source:markdown>```rust
use epicenter::{Event, AsyncDispatcher};

#[derive(Debug, Event)]
struct ExampleEvent {}

// There&apos;a also a SyncDispatcher you can use
let mut dispatcher = AsyncDispatcher::new();

// Register a callback to run when an event is dispatched
// This gets access to the event, so it can retrieve data from it!
dispatcher.listen(|event: ExampleEvent| async move {
    // ...
}).await;

// Dispatch an event to all listeners
dispatcher.dispatch(&amp;ExampleEvent {}).await?;
```

When building a few of my last Rust crates, I found myself wanting to provide a simple way to let callers hook into certain events. While there are a few event dispatcher crates out there, none of them were simple and elegant enough, so I decided to build my own.

[View on GitHub](https://github.com/m1guelpf/epicenter)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[A filesystem abstraction layer for Rust.]]></title>
            <description><![CDATA[<pre><code class="language-rust">use flysystem::{Filesystem, adapters::{S3Adapter, s3}};

#[tokio::main]
async fn main() {
    // instantly swap between storage backends (like S3/Local/FTP)
    // by changing the type here 👇👇👇
    let mut cache = Filesystem::&#x3C;S3Adapter>::new(s3::Config {
        region: env::var("S3_REGION").ok(),
        bucket: env::var("S3_BUCKET").unwrap(),
        endpoint: env::var("S3_ENDPOINT").unwrap(),
        access_key: env::var("S3_ACCESS_KEY").unwrap(),
        secret_key: env::var("S3_SECRET_KEY").unwrap(),
    }).await?;

    filesystem.write(Path::new("my-first-file.txt"), "Hello, world!").await?;
}
</code></pre>
<p>Continuing on the trend of building packages missing from the Rust ecosystem, I decided to try my hand at rewriting PHP's Flysystem library in Rust. After a few days of tinkering I had something extensible and easy to use, and with full test coverage!</p>
<p><a href="https://github.com/m1guelpf/flysystem">View on GitHub</a></p>]]></description>
            <link>https://miguel.build/b/a-filesystem-abstraction-layer-for-rust</link>
            <guid isPermaLink="true">https://miguel.build/b/a-filesystem-abstraction-layer-for-rust</guid>
            <pubDate>Mon, 18 Dec 2023 00:14:30 GMT</pubDate>
            <source:markdown>```rust
use flysystem::{Filesystem, adapters::{S3Adapter, s3}};

#[tokio::main]
async fn main() {
    // instantly swap between storage backends (like S3/Local/FTP)
    // by changing the type here 👇👇👇
    let mut cache = Filesystem::&lt;S3Adapter&gt;::new(s3::Config {
        region: env::var(&quot;S3_REGION&quot;).ok(),
        bucket: env::var(&quot;S3_BUCKET&quot;).unwrap(),
        endpoint: env::var(&quot;S3_ENDPOINT&quot;).unwrap(),
        access_key: env::var(&quot;S3_ACCESS_KEY&quot;).unwrap(),
        secret_key: env::var(&quot;S3_SECRET_KEY&quot;).unwrap(),
    }).await?;

    filesystem.write(Path::new(&quot;my-first-file.txt&quot;), &quot;Hello, world!&quot;).await?;
}
```

Continuing on the trend of building packages missing from the Rust ecosystem, I decided to try my hand at rewriting PHP&apos;s Flysystem library in Rust. After a few days of tinkering I had something extensible and easy to use, and with full test coverage!

[View on GitHub](https://github.com/m1guelpf/flysystem)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[An expressive Rust library for interacting with a cache.]]></title>
            <description><![CDATA[<pre><code class="language-rust">use amnesia::{Cache, drivers::RedisDriver};

#[tokio::main]
async fn main() {
    // instantly swap between cache backends (like DynamoDB/MySQL/Postgres)
    // by changing the type here 👇👇👇
    let mut cache = Cache::&#x3C;RedisDriver>::new(RedisConfig {
        redis_url: "..."
    }).await?;

    // get `test-value` from the cache
    // or store it for 10 seconds if it's not there yet
    let my_value = cache.remember(
        "test-value",
        Duration::from_secs(10),
        my_value
    ).await?;

    // aaaand it's gone
    cache.forget("test-value").await?;
}
</code></pre>
<p>Lately, I've been trying to build a more intuitive ecosystem of webdev-related packages. I needed to store some things on Redis for an upcoming project, so I thought I'd take some time to upgrade the DX around caching in general.</p>
<p><a href="https://github.com/m1guelpf/amnesia">View on GitHub</a></p>]]></description>
            <link>https://miguel.build/b/an-expressive-rust-library-for-interacting-with-a-cache</link>
            <guid isPermaLink="true">https://miguel.build/b/an-expressive-rust-library-for-interacting-with-a-cache</guid>
            <pubDate>Fri, 15 Dec 2023 22:17:12 GMT</pubDate>
            <source:markdown>```rust
use amnesia::{Cache, drivers::RedisDriver};

#[tokio::main]
async fn main() {
    // instantly swap between cache backends (like DynamoDB/MySQL/Postgres)
    // by changing the type here 👇👇👇
    let mut cache = Cache::&lt;RedisDriver&gt;::new(RedisConfig {
        redis_url: &quot;...&quot;
    }).await?;

    // get `test-value` from the cache
    // or store it for 10 seconds if it&apos;s not there yet
    let my_value = cache.remember(
        &quot;test-value&quot;,
        Duration::from_secs(10),
        my_value
    ).await?;

    // aaaand it&apos;s gone
    cache.forget(&quot;test-value&quot;).await?;
}
```

Lately, I&apos;ve been trying to build a more intuitive ecosystem of webdev-related packages. I needed to store some things on Redis for an upcoming project, so I thought I&apos;d take some time to upgrade the DX around caching in general.

[View on GitHub](https://github.com/m1guelpf/amnesia)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[World ID 2.0]]></title>
            <description><![CDATA[<p></p>
<p>After many months of work, we're releasing the next generation of World ID. I got to rebuild the SDK from scratch and design a new way to connect with the World App, which has made everything more reliable and private.</p>
<p>We also launched a bunch of pre-built integrations, like Telegram or Minecraft (which was super fan to debug). Make sure to check out the announcement for all the details!</p>
<p><a href="https://worldcoin.org/blog/announcements/introducing-world-id-2.0">Read the announcement</a></p>]]></description>
            <link>https://miguel.build/b/world-id-20</link>
            <guid isPermaLink="true">https://miguel.build/b/world-id-20</guid>
            <pubDate>Wed, 13 Dec 2023 16:42:03 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/world-id-v2/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/world-id-v2/poster.jpg&quot;  type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

After many months of work, we&apos;re releasing the next generation of World ID. I got to rebuild the SDK from scratch and design a new way to connect with the World App, which has made everything more reliable and private.

We also launched a bunch of pre-built integrations, like Telegram or Minecraft (which was super fan to debug). Make sure to check out the announcement for all the details!

[Read the announcement](https://worldcoin.org/blog/announcements/introducing-world-id-2.0)</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/world-id-v2/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/world-id-v2/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[A personal wearable AI]]></title>
            <description><![CDATA[<p><img src="https://web-assets.miguel.build/tab-all-nighter.jpg" alt=""></p>
<p>I recently flew to SF to help my friend <a href="https://twitter.com/AviSchiffmann">Avi</a> announce his startup to the world. He's been working on this necklace that listens in on all your conversations and has full context on everything going on in your life, which allows it to give you hyper-targeted advice and answer your questions in a way no other AI assistant can.</p>
<p>He's done an amazing job building the prototype, and on my last night before flying back I offered to pull an all-nighter and "upgrade" his backend with a focus on scalability. I managed to make it more than 10x faster and clean up the code quite a bit, and became the second human ever to own a Tab!</p>
<p><a href="https://twitter.com/AviSchiffmann/status/1708439854005321954">Watch Avi introduce Tab</a></p>]]></description>
            <link>https://miguel.build/b/a-personal-wearable-ai</link>
            <guid isPermaLink="true">https://miguel.build/b/a-personal-wearable-ai</guid>
            <pubDate>Wed, 04 Oct 2023 00:24:38 GMT</pubDate>
            <source:markdown>![](https://web-assets.miguel.build/tab-all-nighter.jpg)

I recently flew to SF to help my friend [Avi](https://twitter.com/AviSchiffmann) announce his startup to the world. He&apos;s been working on this necklace that listens in on all your conversations and has full context on everything going on in your life, which allows it to give you hyper-targeted advice and answer your questions in a way no other AI assistant can.

He&apos;s done an amazing job building the prototype, and on my last night before flying back I offered to pull an all-nighter and &quot;upgrade&quot; his backend with a focus on scalability. I managed to make it more than 10x faster and clean up the code quite a bit, and became the second human ever to own a Tab!

[Watch Avi introduce Tab](https://twitter.com/AviSchiffmann/status/1708439854005321954)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Building the ultimate Mario game]]></title>
            <description><![CDATA[<p></p>
<p>Still on my journey to get good™ at YouTube, I've made another video! This time, it tries to explain how transformer networks work, with the excuse of using one to generate Super Mario levels.</p>
<p>I'm super happy with how everything turned out, and I hope you'll enjoy it!</p>
<p><a href="https://youtu.be/Wqm1c0A6zkk">Watch on YouTube</a></p>]]></description>
            <link>https://miguel.build/b/building-the-ultimate-mario-game</link>
            <guid isPermaLink="true">https://miguel.build/b/building-the-ultimate-mario-game</guid>
            <pubDate>Sun, 10 Sep 2023 08:13:46 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/mariogpt/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/mariogpt/poster.jpg&quot;  type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

Still on my journey to get good™ at YouTube, I&apos;ve made another video! This time, it tries to explain how transformer networks work, with the excuse of using one to generate Super Mario levels.

I&apos;m super happy with how everything turned out, and I hope you&apos;ll enjoy it!

[Watch on YouTube](https://youtu.be/Wqm1c0A6zkk)</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/mariogpt/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/mariogpt/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[My Rust ML library is finally ready!]]></title>
            <description><![CDATA[<pre><code class="language-rust">use cog_rust::Cog;
use schemars::JsonSchema;
use serde::{Serialize, Deserialize};

struct MyModel { ... }

impl Cog for MyModel {
    type Request: Deserialize + JsonSchema;
    type Response: Serialize + JsonSchema;

    /// Setup the model
    async fn setup() -> Result&#x3C;Self>;

    /// Run a prediction on the model
    fn predict(&#x26;self, input: Self::Request) -> Result&#x3C;Self::Response>;
}

cog_rust::start!(MyModel);
</code></pre>
<p>When I <a href="#rust-containers-for-machine-learning">started working on a Rust version of Cog</a> (<a href="https://replicate.com">Replicate</a>'s Python library to dockerize ML models) I set the goal of running Stable Diffusion on Replicate with no external code. Almost two months later, <a href="https://replicate.com/m1guelpf/stable-diffusion-rs">it finally works</a>!</p>
<p>This is probably the most complex codebase I've ever worked on, and I still have a lot of ideas on how to make it better, but I thought hitting this milestone was a good time to mark it production-ready.</p>
<p><a href="https://github.com/m1guelpf/cog-rust">View on GitHub</a></p>]]></description>
            <link>https://miguel.build/b/my-rust-ml-library-is-finally-ready</link>
            <guid isPermaLink="true">https://miguel.build/b/my-rust-ml-library-is-finally-ready</guid>
            <pubDate>Wed, 16 Aug 2023 17:21:37 GMT</pubDate>
            <source:markdown>```rust
use cog_rust::Cog;
use schemars::JsonSchema;
use serde::{Serialize, Deserialize};

struct MyModel { ... }

impl Cog for MyModel {
    type Request: Deserialize + JsonSchema;
    type Response: Serialize + JsonSchema;

    /// Setup the model
    async fn setup() -&gt; Result&lt;Self&gt;;

    /// Run a prediction on the model
    fn predict(&amp;self, input: Self::Request) -&gt; Result&lt;Self::Response&gt;;
}

cog_rust::start!(MyModel);
```

When I [started working on a Rust version of Cog](#rust-containers-for-machine-learning) ([Replicate](https://replicate.com)&apos;s Python library to dockerize ML models) I set the goal of running Stable Diffusion on Replicate with no external code. Almost two months later, [it finally works](https://replicate.com/m1guelpf/stable-diffusion-rs)!

This is probably the most complex codebase I&apos;ve ever worked on, and I still have a lot of ideas on how to make it better, but I thought hitting this milestone was a good time to mark it production-ready.

[View on GitHub](https://github.com/m1guelpf/cog-rust)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[The quickest way to commit your code]]></title>
            <description><![CDATA[<p></p>
<p>Commit is a simple macOS app, which you can invoke with a keyboard shortcut. It'll open a window where you can write a commit message, and then press enter to commit it.</p>
<p>It was inspired by <a href="https://tailwindui.com/templates/commit">this TailwindUI template</a>, which imagines a fake app that does the same thing. I thought it was a cool idea, so I decided to build it!</p>
<p><a href="https://github.com/m1guelpf/commit">Download on GitHub</a></p>]]></description>
            <link>https://miguel.build/b/the-quickest-way-to-commit-your-code</link>
            <guid isPermaLink="true">https://miguel.build/b/the-quickest-way-to-commit-your-code</guid>
            <pubDate>Mon, 14 Aug 2023 15:01:26 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/commit/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/commit/poster.jpg&quot; muted type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

Commit is a simple macOS app, which you can invoke with a keyboard shortcut. It&apos;ll open a window where you can write a commit message, and then press enter to commit it.

It was inspired by [this TailwindUI template](https://tailwindui.com/templates/commit), which imagines a fake app that does the same thing. I thought it was a cool idea, so I decided to build it!

[Download on GitHub](https://github.com/m1guelpf/commit)</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/commit/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/commit/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[Taking the pain out of running AI models locally]]></title>
            <description><![CDATA[<p><img src="https://web-assets.miguel.build/dyson.jpeg" alt=""></p>
<p>Local models keep getting more and more powerful, but the experience of running them still sucks. I've been working on Dyson, a self-hosted <a href="https://replicate.com">Replicate</a> of sorts, which makes running a new model as easy as writing its name and using the auto-generated interface or API.</p>
<p>It's very different from what I'm used to (and has a surprisingly big amount of devops, which I didn't know anything about before), but I'm slowly making progress!</p>
<p><a href="https://github.com/m1guelpf/dyson">View on GitHub</a></p>]]></description>
            <link>https://miguel.build/b/taking-the-pain-out-of-running-ai-models-locally</link>
            <guid isPermaLink="true">https://miguel.build/b/taking-the-pain-out-of-running-ai-models-locally</guid>
            <pubDate>Tue, 18 Jul 2023 20:04:18 GMT</pubDate>
            <source:markdown>![](https://web-assets.miguel.build/dyson.jpeg)

Local models keep getting more and more powerful, but the experience of running them still sucks. I&apos;ve been working on Dyson, a self-hosted [Replicate](https://replicate.com) of sorts, which makes running a new model as easy as writing its name and using the auto-generated interface or API.

It&apos;s very different from what I&apos;m used to (and has a surprisingly big amount of devops, which I didn&apos;t know anything about before), but I&apos;m slowly making progress!

[View on GitHub](https://github.com/m1guelpf/dyson)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Rust containers for Machine Learning]]></title>
            <description><![CDATA[<pre><code class="language-rust">use cog_rust::Cog;
use anyhow::Result;
use schemars::JsonSchema;
use async_trait::async_trait;

struct ExampleModel {
    prefix: String,
}

#[derive(serde::Deserialize, JsonSchema)]
struct ModelRequest {
    /// Text to prefix with 'hello '
    text: String,
}

#[async_trait]
impl Cog for ExampleModel {
    type Request = ModelRequest;
    type Response = String;

    async fn setup() -> Result&#x3C;Self> {
        Ok(Self {
            prefix: "hello".to_string(),
        })
    }

    fn predict(&#x26;self, input: Self::Request) -> Result&#x3C;Self::Response> {
        Ok(format!("{} {}", self.prefix, input.text))
    }
}

cog_rust::start!(ExampleModel);
</code></pre>
<p>In the past I've used Cog (a Python library by <a href="https://replicate.com">Replicate</a>) to very quickly build and deploy new models. As the state of non-Python models slowly advances (mostly thanks to <a href="https://twitter.com/ggerganov">@ggerganov</a>), I thought a Rust version could unlock extra performance.</p>
<p>The library is still very much a work in progress, but it's already usable locally!</p>
<p><a href="https://github.com/m1guelpf/cog-rust">View on GitHub</a></p>]]></description>
            <link>https://miguel.build/b/rust-containers-for-machine-learning</link>
            <guid isPermaLink="true">https://miguel.build/b/rust-containers-for-machine-learning</guid>
            <pubDate>Wed, 07 Jun 2023 20:59:13 GMT</pubDate>
            <source:markdown>```rust
use cog_rust::Cog;
use anyhow::Result;
use schemars::JsonSchema;
use async_trait::async_trait;

struct ExampleModel {
    prefix: String,
}

#[derive(serde::Deserialize, JsonSchema)]
struct ModelRequest {
    /// Text to prefix with &apos;hello &apos;
    text: String,
}

#[async_trait]
impl Cog for ExampleModel {
    type Request = ModelRequest;
    type Response = String;

    async fn setup() -&gt; Result&lt;Self&gt; {
        Ok(Self {
            prefix: &quot;hello&quot;.to_string(),
        })
    }

    fn predict(&amp;self, input: Self::Request) -&gt; Result&lt;Self::Response&gt; {
        Ok(format!(&quot;{} {}&quot;, self.prefix, input.text))
    }
}

cog_rust::start!(ExampleModel);
```

In the past I&apos;ve used Cog (a Python library by [Replicate](https://replicate.com)) to very quickly build and deploy new models. As the state of non-Python models slowly advances (mostly thanks to [@ggerganov](https://twitter.com/ggerganov)), I thought a Rust version could unlock extra performance.

The library is still very much a work in progress, but it&apos;s already usable locally!

[View on GitHub](https://github.com/m1guelpf/cog-rust)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[web3 app starter]]></title>
            <description><![CDATA[<p></p>
<p>While working on a new project, I realized that everything I had built so far could be used as a template for other projects, so I decided to make it into a starter kit.</p>
<p>It's a Next.js app (using the new App Router and server actions) that includes Sign in with Ethereum, a basic UI and support for teams (letting you assign roles, invite people, etc.).</p>
<p><a href="https://github.com/m1guelpf/armchair">View on GitHub</a></p>]]></description>
            <link>https://miguel.build/b/web3-app-starter</link>
            <guid isPermaLink="true">https://miguel.build/b/web3-app-starter</guid>
            <pubDate>Wed, 31 May 2023 01:51:46 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/web3-app-starter/demo.mp4&quot; poster=&quot;https://web-assets.miguel.build/web3-app-starter/poster.jpeg&quot; muted type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

While working on a new project, I realized that everything I had built so far could be used as a template for other projects, so I decided to make it into a starter kit.

It&apos;s a Next.js app (using the new App Router and server actions) that includes Sign in with Ethereum, a basic UI and support for teams (letting you assign roles, invite people, etc.).

[View on GitHub](https://github.com/m1guelpf/armchair)</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/web3-app-starter/demo.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/web3-app-starter/poster.jpeg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[New website!]]></title>
            <description><![CDATA[<p></p>
<p>I've felt like <a href="https://2022.miguel.build">my old website</a> didn't really represent who I am for a while now, and after months of trying to come up with a design I liked, I finally managed to find something unique enough.</p>
<p>I'll keep tweaking and adding stuff (especially to the timeline, there's years of stuff missing), but I wanted to get it out there before I started overthinking it again. Hope you like it!</p>
<p><a href="https://twitter.com/m1guelpf/status/1661617108742971392">Share your thoughts on Twitter</a></p>]]></description>
            <link>https://miguel.build/b/new-website</link>
            <guid isPermaLink="true">https://miguel.build/b/new-website</guid>
            <pubDate>Thu, 25 May 2023 06:16:04 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/new-website/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/new-website/poster.jpeg&quot; muted type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

I&apos;ve felt like [my old website](https://2022.miguel.build) didn&apos;t really represent who I am for a while now, and after months of trying to come up with a design I liked, I finally managed to find something unique enough.

I&apos;ll keep tweaking and adding stuff (especially to the timeline, there&apos;s years of stuff missing), but I wanted to get it out there before I started overthinking it again. Hope you like it!

[Share your thoughts on Twitter](https://twitter.com/m1guelpf/status/1661617108742971392)</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/new-website/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/new-website/poster.jpeg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[An API for ENS data]]></title>
            <description><![CDATA[<p><img src="https://web-assets.miguel.build/enstate-card.jpeg" alt="enstate.rs - querying ens information should be easy."></p>
<p>I really like the idea of ENS being "the universal profile", which you can set up once and every other app can follow.</p>
<p>To make this a little easier, I teamed up with my friend <a href="https://luc.computer">Luc</a> to build a dead-simple API that returns all relevant attributes for an ENS name.</p>
<p><a href="https://github.com/v3xlabs/enstate">View on GitHub</a></p>]]></description>
            <link>https://miguel.build/b/an-api-for-ens-data</link>
            <guid isPermaLink="true">https://miguel.build/b/an-api-for-ens-data</guid>
            <pubDate>Sat, 20 May 2023 18:15:31 GMT</pubDate>
            <source:markdown>![enstate.rs - querying ens information should be easy.](https://web-assets.miguel.build/enstate-card.jpeg)

I really like the idea of ENS being &quot;the universal profile&quot;, which you can set up once and every other app can follow.

To make this a little easier, I teamed up with my friend [Luc](https://luc.computer) to build a dead-simple API that returns all relevant attributes for an ENS name.

[View on GitHub](https://github.com/v3xlabs/enstate)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[My first real attempt at a YouTube video]]></title>
            <description><![CDATA[<p></p>
<p>I've been wanting to make YouTube videos for a while, but never really found the time to do it. A week ago I decided to challenge myself to finish a video in a week (or shave my head), and managed to do it!</p>
<p>The video shows how I gave GPT-4 control over a browser and taught it to browse the web, with a fun tone and a bunch of jokes. Go watch it!</p>
<p><a href="https://www.youtube.com/watch?v=ZpcNEskZabQ">Watch the video</a></p>]]></description>
            <link>https://miguel.build/b/my-first-real-attempt-at-a-youtube-video</link>
            <guid isPermaLink="true">https://miguel.build/b/my-first-real-attempt-at-a-youtube-video</guid>
            <pubDate>Sun, 26 Mar 2023 16:00:43 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/first-youtube-video/trailer.mp4&quot; poster=&quot;https://web-assets.miguel.build/first-youtube-video/poster.jpeg&quot;  type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

I&apos;ve been wanting to make YouTube videos for a while, but never really found the time to do it. A week ago I decided to challenge myself to finish a video in a week (or shave my head), and managed to do it!

The video shows how I gave GPT-4 control over a browser and taught it to browse the web, with a fun tone and a bunch of jokes. Go watch it!

[Watch the video](https://www.youtube.com/watch?v=ZpcNEskZabQ)</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/first-youtube-video/trailer.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/first-youtube-video/poster.jpeg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[A new design for the Worldcoin Docs]]></title>
            <description><![CDATA[<p><img src="https://web-assets.miguel.build/new-worldcoin-docs.jpeg" alt=""></p>
<p>After launching World ID I felt like the docs needed a fresh coat of paint, so I deleted the previous repo and started again from scratch. A few hours later, the new site was live with new design, new content, and a new domain!</p>
<p><a href="https://docs.worldcoin.org">See the docs</a></p>]]></description>
            <link>https://miguel.build/b/a-new-design-for-the-worldcoin-docs</link>
            <guid isPermaLink="true">https://miguel.build/b/a-new-design-for-the-worldcoin-docs</guid>
            <pubDate>Tue, 14 Mar 2023 22:11:12 GMT</pubDate>
            <source:markdown>![](https://web-assets.miguel.build/new-worldcoin-docs.jpeg)

After launching World ID I felt like the docs needed a fresh coat of paint, so I deleted the previous repo and started again from scratch. A few hours later, the new site was live with new design, new content, and a new domain!

[See the docs](https://docs.worldcoin.org)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[ChatGPT for your docs]]></title>
            <description><![CDATA[<p></p>
<p>While visiting my friends from Hop, one of them mentioned it was crazy no one had built a tool that let you train ChatGPT on your app's documentation, so of course I decided to build it.</p>
<p>A few days (and lots of Rust) later, Clippy (MSFT don't sue plz) can "learn" your docs in ~5min and answer questions about them.</p>]]></description>
            <link>https://miguel.build/b/chatgpt-for-your-docs</link>
            <guid isPermaLink="true">https://miguel.build/b/chatgpt-for-your-docs</guid>
            <pubDate>Mon, 06 Feb 2023 22:24:20 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/clippy/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/clippy/poster.jpg&quot; muted type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

While visiting my friends from Hop, one of them mentioned it was crazy no one had built a tool that let you train ChatGPT on your app&apos;s documentation, so of course I decided to build it.

A few days (and lots of Rust) later, Clippy (MSFT don&apos;t sue plz) can &quot;learn&quot; your docs in ~5min and answer questions about them.</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/clippy/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/clippy/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[Baby's first Transformer model]]></title>
            <description><![CDATA[<p><img src="https://web-assets.miguel.build/first-transformer.jpg" alt=""></p>
<p>Built my first Transformer model (trained on Shakespeare's works) following Andrej Karpathy's newest video lecture. It's 2:30h packed with deep knowledge, and while I definitely didn't understand everything, I learned a lot and getting the model working felt like magic ✨</p>
<p><a href="https://www.youtube.com/watch?v=kCc8FmEb1nY">Watch the lecture</a></p>]]></description>
            <link>https://miguel.build/b/babys-first-transformer-model</link>
            <guid isPermaLink="true">https://miguel.build/b/babys-first-transformer-model</guid>
            <pubDate>Thu, 19 Jan 2023 03:24:03 GMT</pubDate>
            <source:markdown>![](https://web-assets.miguel.build/first-transformer.jpg)

Built my first Transformer model (trained on Shakespeare&apos;s works) following Andrej Karpathy&apos;s newest video lecture. It&apos;s 2:30h packed with deep knowledge, and while I definitely didn&apos;t understand everything, I learned a lot and getting the model working felt like magic ✨

[Watch the lecture](https://www.youtube.com/watch?v=kCc8FmEb1nY)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[An iOS widget for Worldcoin]]></title>
            <description><![CDATA[<p><img src="https://web-assets.miguel.build/worldcoin-widget.jpg" alt=""></p>
<p>Built an iOS widget with Scriptable, showing real-time Worldcoin onboarding stats! Uses internal APIs, so unfortunately can't share the code, but hopefully we have some public endpoints soon? 👀</p>]]></description>
            <link>https://miguel.build/b/an-ios-widget-for-worldcoin</link>
            <guid isPermaLink="true">https://miguel.build/b/an-ios-widget-for-worldcoin</guid>
            <pubDate>Wed, 18 Jan 2023 03:00:07 GMT</pubDate>
            <source:markdown>![](https://web-assets.miguel.build/worldcoin-widget.jpg)

Built an iOS widget with Scriptable, showing real-time Worldcoin onboarding stats! Uses internal APIs, so unfortunately can&apos;t share the code, but hopefully we have some public endpoints soon? 👀</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Copilot, but for your terminal]]></title>
            <description><![CDATA[<p></p>
<p>After failing to remember the command to check the size of a directory for the 100th time (and looking for yet another excuse to build something in Rust), I took on building a simple CLI that could bring the Copilot experience to the terminal. Works great for things like ffmpeg!</p>
<p><a href="https://github.com/m1guelpf/plz-cli">Try it out</a></p>]]></description>
            <link>https://miguel.build/b/copilot-but-for-your-terminal</link>
            <guid isPermaLink="true">https://miguel.build/b/copilot-but-for-your-terminal</guid>
            <pubDate>Wed, 14 Dec 2022 13:25:16 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/plz-cli/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/plz-cli/poster.jpg&quot; muted type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

After failing to remember the command to check the size of a directory for the 100th time (and looking for yet another excuse to build something in Rust), I took on building a simple CLI that could bring the Copilot experience to the terminal. Works great for things like ffmpeg!

[Try it out](https://github.com/m1guelpf/plz-cli)</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/plz-cli/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/plz-cli/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[Adding live output to my ChatGPT Telegram bot]]></title>
            <description><![CDATA[<p></p>
<p>One of the things that's made ChatGPT really magical is its ability to show you what it's thinking in real time. While I had originally skipped on this while building my Telegram bot (since Telegram doesn't support live updates), I ended up finding a hacky way to make it work!</p>
<p><a href="https://github.com/m1guelpf/chatgpt-telegram">Try it out</a></p>]]></description>
            <link>https://miguel.build/b/adding-live-output-to-my-chatgpt-telegram-bot</link>
            <guid isPermaLink="true">https://miguel.build/b/adding-live-output-to-my-chatgpt-telegram-bot</guid>
            <pubDate>Tue, 06 Dec 2022 20:28:44 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/chatgpt-telegram-live/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/chatgpt-telegram-live/poster.jpg&quot; muted type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

One of the things that&apos;s made ChatGPT really magical is its ability to show you what it&apos;s thinking in real time. While I had originally skipped on this while building my Telegram bot (since Telegram doesn&apos;t support live updates), I ended up finding a hacky way to make it work!

[Try it out](https://github.com/m1guelpf/chatgpt-telegram)</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/chatgpt-telegram-live/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/chatgpt-telegram-live/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[A Telegram bot for ChatGPT]]></title>
            <description><![CDATA[<p><img src="https://web-assets.miguel.build/chatgpt-telegram.jpg" alt=""></p>
<p>I got tired of opening the ChatGPT website every single time I needed to ask something, so I reverse-engineered the API and built a Telegram bot that lets you chat with it directly from the app!</p>
<p><a href="https://github.com/m1guelpf/gptchat-telegram">Try it out</a></p>]]></description>
            <link>https://miguel.build/b/a-telegram-bot-for-chatgpt</link>
            <guid isPermaLink="true">https://miguel.build/b/a-telegram-bot-for-chatgpt</guid>
            <pubDate>Sun, 04 Dec 2022 04:09:27 GMT</pubDate>
            <source:markdown>![](https://web-assets.miguel.build/chatgpt-telegram.jpg)

I got tired of opening the ChatGPT website every single time I needed to ask something, so I reverse-engineered the API and built a Telegram bot that lets you chat with it directly from the app!

[Try it out](https://github.com/m1guelpf/gptchat-telegram)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[A better ChatGPT interface]]></title>
            <description><![CDATA[<p></p>
<p>ChatGPT might be one of the most impressive things I've seen in a while, but its interface is a bit lacking. I decided to try my hand at building a better one, and ended up with possibly one of the most polished things I've ever made.</p>]]></description>
            <link>https://miguel.build/b/a-better-chatgpt-interface</link>
            <guid isPermaLink="true">https://miguel.build/b/a-better-chatgpt-interface</guid>
            <pubDate>Fri, 02 Dec 2022 20:39:19 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/chatgpt-concept/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/chatgpt-concept/poster.jpg&quot; muted type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

ChatGPT might be one of the most impressive things I&apos;ve seen in a while, but its interface is a bit lacking. I decided to try my hand at building a better one, and ended up with possibly one of the most polished things I&apos;ve ever made.</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/chatgpt-concept/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/chatgpt-concept/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[Deploying Stable Diffusion models to Replicate]]></title>
            <description><![CDATA[<p></p>
<p>I've been playing a lot with fine-tuned Stable Diffusion models recently and deploying them to Replicate for blazing-fast inference, so I made a quick tutorial showing you how to easily deploy any SD model (no ML knowledge required).</p>
<p><a href="https://youtu.be/Kxlcj7BnO8I">Watch on YouTube</a></p>]]></description>
            <link>https://miguel.build/b/deploying-stable-diffusion-models-to-replicate</link>
            <guid isPermaLink="true">https://miguel.build/b/deploying-stable-diffusion-models-to-replicate</guid>
            <pubDate>Thu, 24 Nov 2022 03:00:23 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/replicate-guide/trailer.mp4&quot; poster=&quot;https://web-assets.miguel.build/replicate-guide/poster.jpg&quot;  type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

I&apos;ve been playing a lot with fine-tuned Stable Diffusion models recently and deploying them to Replicate for blazing-fast inference, so I made a quick tutorial showing you how to easily deploy any SD model (no ML knowledge required).

[Watch on YouTube](https://youtu.be/Kxlcj7BnO8I)</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/replicate-guide/trailer.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/replicate-guide/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[Using GPT-3 to write commit messages]]></title>
            <description><![CDATA[<p></p>
<p>After someone at work told me off for naming all my commits "wip", I decided to build a tool that automatically writes the commit messages for you.</p>
<p><a href="https://github.com/m1guelpf/auto-commit">Try it out</a></p>]]></description>
            <link>https://miguel.build/b/using-gpt-3-to-write-commit-messages</link>
            <guid isPermaLink="true">https://miguel.build/b/using-gpt-3-to-write-commit-messages</guid>
            <pubDate>Mon, 31 Oct 2022 17:00:14 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/auto-commit/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/auto-commit/poster.jpg&quot; muted type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

After someone at work told me off for naming all my commits &quot;wip&quot;, I decided to build a tool that automatically writes the commit messages for you. 

[Try it out](https://github.com/m1guelpf/auto-commit)</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/auto-commit/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/auto-commit/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[Script-writing app progress update]]></title>
            <description><![CDATA[<p><img src="https://web-assets.miguel.build/scripty-design/edit.jpg" alt="">
<img src="https://web-assets.miguel.build/scripty-design/create-project.jpg" alt="">
<img src="https://web-assets.miguel.build/scripty-design/landing.jpg" alt=""></p>
<p>I've continued to work on Scripty, my lil script-writing app (hoping to release it soon), here's a few design details from the prototype.</p>
<p>Feels really crazy how fast I can go from "i wish this existed" to a prototype, coding really is a magical skill ✨</p>
<p><a href="https://scripty.vercel.app">Get on the waitlist</a></p>]]></description>
            <link>https://miguel.build/b/script-writing-app-progress-update</link>
            <guid isPermaLink="true">https://miguel.build/b/script-writing-app-progress-update</guid>
            <pubDate>Sat, 22 Oct 2022 07:51:47 GMT</pubDate>
            <source:markdown>![](https://web-assets.miguel.build/scripty-design/edit.jpg)
![](https://web-assets.miguel.build/scripty-design/create-project.jpg)
![](https://web-assets.miguel.build/scripty-design/landing.jpg)

I&apos;ve continued to work on Scripty, my lil script-writing app (hoping to release it soon), here&apos;s a few design details from the prototype.

Feels really crazy how fast I can go from &quot;i wish this existed&quot; to a prototype, coding really is a magical skill ✨

[Get on the waitlist](https://scripty.vercel.app)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Concept for a script-writing app]]></title>
            <description><![CDATA[<p><img src="https://web-assets.miguel.build/scripty-concept.jpg" alt="A screenshot of a fictional app (called Scripty) is shown with a slight 3D tilt on a purple background. The screenshot shows a web app with a 3-column layout. The first column shows the navigation (with items &#x22;Script&#x22;, &#x22;Scenes&#x22;, &#x22;Inspiration&#x22;, &#x22;Feeling Stuck?&#x22;, and &#x22;All Projects&#x22;), while the second shows an editor view with some text. Sections of the text are highlighted with different background colors, to indicate the scene. On the right column, an &#x22;Edit scene&#x22; menu is shown, with some form fields (&#x22;name&#x22;, &#x22;highlight color&#x22; and &#x22;description&#x22;), and a list of scene appearances."></p>
<p>I've been writing some scripts for videos I wanna record recently, which usually has me thinking about both the script and editing details at the same time.</p>
<p>I tried to find something that would let me annotate both of these things at the same time, but couldn't find anything, so I made a concept for an app that allows you to define both the script and the scenes in the same place.</p>
<p><a href="https://scripty.vercel.app">Get on the waitlist</a></p>]]></description>
            <link>https://miguel.build/b/concept-for-a-script-writing-app</link>
            <guid isPermaLink="true">https://miguel.build/b/concept-for-a-script-writing-app</guid>
            <pubDate>Mon, 17 Oct 2022 08:43:35 GMT</pubDate>
            <source:markdown>![A screenshot of a fictional app (called Scripty) is shown with a slight 3D tilt on a purple background. The screenshot shows a web app with a 3-column layout. The first column shows the navigation (with items &quot;Script&quot;, &quot;Scenes&quot;, &quot;Inspiration&quot;, &quot;Feeling Stuck?&quot;, and &quot;All Projects&quot;), while the second shows an editor view with some text. Sections of the text are highlighted with different background colors, to indicate the scene. On the right column, an &quot;Edit scene&quot; menu is shown, with some form fields (&quot;name&quot;, &quot;highlight color&quot; and &quot;description&quot;), and a list of scene appearances.](https://web-assets.miguel.build/scripty-concept.jpg)

I&apos;ve been writing some scripts for videos I wanna record recently, which usually has me thinking about both the script and editing details at the same time.

I tried to find something that would let me annotate both of these things at the same time, but couldn&apos;t find anything, so I made a concept for an app that allows you to define both the script and the scenes in the same place.

[Get on the waitlist](https://scripty.vercel.app)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Explaining web3 to a non-crypto friend]]></title>
            <description><![CDATA[<p></p>
<p>I had to improvise an explanation for what "web3" means for a non-crypto friend recently, and thought it might make a useful resource for others too, so I turned it into a lil video.</p>]]></description>
            <link>https://miguel.build/b/explaining-web3-to-a-non-crypto-friend</link>
            <guid isPermaLink="true">https://miguel.build/b/explaining-web3-to-a-non-crypto-friend</guid>
            <pubDate>Sun, 09 Oct 2022 15:49:06 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/web3-explainer/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/web3-explainer/poster.jpg&quot;  type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

I had to improvise an explanation for what &quot;web3&quot; means for a non-crypto friend recently, and thought it might make a useful resource for others too, so I turned it into a lil video.</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/web3-explainer/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/web3-explainer/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[New World ID docs]]></title>
            <description><![CDATA[<p><img src="https://web-assets.miguel.build/world-id-docs.jpg" alt=""></p>
<p>When we started working on World ID, we used Gitbook for the docs. With a little more time in our hands, we decided to move to a fully-custom docs site, and it turned out pretty nice!</p>
<p><a href="https://id.worldcoin.org">Check them out!</a></p>]]></description>
            <link>https://miguel.build/b/new-world-id-docs</link>
            <guid isPermaLink="true">https://miguel.build/b/new-world-id-docs</guid>
            <pubDate>Fri, 30 Sep 2022 13:46:49 GMT</pubDate>
            <source:markdown>![](https://web-assets.miguel.build/world-id-docs.jpg)

When we started working on World ID, we used Gitbook for the docs. With a little more time in our hands, we decided to move to a fully-custom docs site, and it turned out pretty nice!

[Check them out!](https://id.worldcoin.org)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Image support for Lens Reflect]]></title>
            <description><![CDATA[<p><img src="https://web-assets.miguel.build/reflect-images.jpg" alt=""></p>
<p>Finally managed to add image support to Reflect! After you enable the images option from your dashboard, your Lens posts will keep their images when cross-posted to Twitter.</p>
<p><a href="https://reflect.withlens.app">Try it out!</a></p>]]></description>
            <link>https://miguel.build/b/image-support-for-lens-reflect</link>
            <guid isPermaLink="true">https://miguel.build/b/image-support-for-lens-reflect</guid>
            <pubDate>Thu, 29 Sep 2022 15:09:26 GMT</pubDate>
            <source:markdown>![](https://web-assets.miguel.build/reflect-images.jpg)

Finally managed to add image support to Reflect! After you enable the images option from your dashboard, your Lens posts will keep their images when cross-posted to Twitter.

[Try it out!](https://reflect.withlens.app)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[A simple API for Whisper]]></title>
            <description><![CDATA[<pre><code class="language-typescript">// Reference: https://replicate.com/m1guelpf/whisper-subtitles

fetch('https://api.replicate.com/v1/predictions', {
    method: 'POST',
    headers: {
        'Content-Type': 'application/json',
        Authorization: `Token ${process.env.REPLICATE_API_TOKEN}`,
    },
    body: JSON.stringify({
        version: '7f686e243a96c7f6f0f481bcef24d688a1369ed3983cea348d1f43b879615766',
        input: { audio_path: 'https://path/to/audio.mp3', format: 'srt' },
    }),
})
</code></pre>
<p>Need an API to quickly transcribe some audio? I just pushed a version of OpenAI's Whisper specialized in generating subtitles (both SRT and VTT) to Replicate, which lets you transcribe audio in the cloud with no markup from the compute cost!</p>
<p><a href="https://replicate.com/m1guelpf/whisper-subtitles">Try it out!</a></p>]]></description>
            <link>https://miguel.build/b/a-simple-api-for-whisper</link>
            <guid isPermaLink="true">https://miguel.build/b/a-simple-api-for-whisper</guid>
            <pubDate>Mon, 26 Sep 2022 17:51:19 GMT</pubDate>
            <source:markdown>```typescript
// Reference: https://replicate.com/m1guelpf/whisper-subtitles

fetch(&apos;https://api.replicate.com/v1/predictions&apos;, {
    method: &apos;POST&apos;,
    headers: {
        &apos;Content-Type&apos;: &apos;application/json&apos;,
        Authorization: `Token ${process.env.REPLICATE_API_TOKEN}`,
    },
    body: JSON.stringify({
        version: &apos;7f686e243a96c7f6f0f481bcef24d688a1369ed3983cea348d1f43b879615766&apos;,
        input: { audio_path: &apos;https://path/to/audio.mp3&apos;, format: &apos;srt&apos; },
    }),
})
```

Need an API to quickly transcribe some audio? I just pushed a version of OpenAI&apos;s Whisper specialized in generating subtitles (both SRT and VTT) to Replicate, which lets you transcribe audio in the cloud with no markup from the compute cost!

[Try it out!](https://replicate.com/m1guelpf/whisper-subtitles)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Dynamic location for my website]]></title>
            <description><![CDATA[<p><img src="https://web-assets.miguel.build/website-location.jpg" alt=""></p>
<p>As part of my quest to make my website more personal, I added a map showing where I am. It dynamically updates the location every day when I wake up, generates an Apple Maps screenshot, and a low-res placeholder.</p>
<p><a href="https://twitter.com/m1guelpf/status/1567452672877563904">Here's how I built it</a></p>]]></description>
            <link>https://miguel.build/b/dynamic-location-for-my-website</link>
            <guid isPermaLink="true">https://miguel.build/b/dynamic-location-for-my-website</guid>
            <pubDate>Wed, 07 Sep 2022 10:00:13 GMT</pubDate>
            <source:markdown>![](https://web-assets.miguel.build/website-location.jpg)

As part of my quest to make my website more personal, I added a map showing where I am. It dynamically updates the location every day when I wake up, generates an Apple Maps screenshot, and a low-res placeholder.

[Here&apos;s how I built it](https://twitter.com/m1guelpf/status/1567452672877563904)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA["Now Playing" tile for my website]]></title>
            <description><![CDATA[<p></p>
<p>I've been trying to make my website feel a bit more personal, and I thought a peek into my music would be a fun start, so I built a real-time Spotify tile that shows what I'm listening to at the moment.</p>]]></description>
            <link>https://miguel.build/b/now-playing-tile-for-my-website</link>
            <guid isPermaLink="true">https://miguel.build/b/now-playing-tile-for-my-website</guid>
            <pubDate>Tue, 06 Sep 2022 02:38:02 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/now-playing/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/now-playing/poster.jpg&quot;  type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

I&apos;ve been trying to make my website feel a bit more personal, and I thought a peek into my music would be a fun start, so I built a real-time Spotify tile that shows what I&apos;m listening to at the moment.</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/now-playing/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/now-playing/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[Prototype for ⌘K authentication]]></title>
            <description><![CDATA[<p><img src="https://web-assets.miguel.build/cmd-k-siwe.jpg" alt=""></p>
<p>Still from a project I never got to release, which used a ⌘K menu for wallet management.</p>]]></description>
            <link>https://miguel.build/b/prototype-for-k-authentication</link>
            <guid isPermaLink="true">https://miguel.build/b/prototype-for-k-authentication</guid>
            <pubDate>Sun, 17 Jul 2022 21:56:35 GMT</pubDate>
            <source:markdown>![](https://web-assets.miguel.build/cmd-k-siwe.jpg)

Still from a project I never got to release, which used a ⌘K menu for wallet management.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Gave a TEDx talk]]></title>
            <description><![CDATA[<p><img src="https://web-assets.miguel.build/tedx-talk.jpg" alt=""></p>
<p>Gave a TEDx talk about ConstitutionDAO, and how it was a great example of how the internet can be used to coordinate people at scale.</p>
<p><a href="https://www.youtube.com/watch?v=dvmJ_HyfBto">Watch the talk (in Spanish)</a></p>]]></description>
            <link>https://miguel.build/b/gave-a-tedx-talk</link>
            <guid isPermaLink="true">https://miguel.build/b/gave-a-tedx-talk</guid>
            <pubDate>Sat, 18 Jun 2022 16:52:51 GMT</pubDate>
            <source:markdown>![](https://web-assets.miguel.build/tedx-talk.jpg)

Gave a TEDx talk about ConstitutionDAO, and how it was a great example of how the internet can be used to coordinate people at scale.

[Watch the talk (in Spanish)](https://www.youtube.com/watch?v=dvmJ_HyfBto)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Lenster for iOS]]></title>
            <description><![CDATA[<p><img src="https://web-assets.miguel.build/lenster-ios.jpg" alt=""></p>
<p>I've been using Lenster a lot, and was getting tired of using Safari all the time, so I wrapped it into its own little app.</p>
<p><a href="https://testflight.apple.com/join/yrsLAMu5">Join the Testflight</a></p>]]></description>
            <link>https://miguel.build/b/lenster-for-ios</link>
            <guid isPermaLink="true">https://miguel.build/b/lenster-for-ios</guid>
            <pubDate>Fri, 27 May 2022 02:25:28 GMT</pubDate>
            <source:markdown>![](https://web-assets.miguel.build/lenster-ios.jpg)

I&apos;ve been using Lenster a lot, and was getting tired of using Safari all the time, so I wrapped it into its own little app.

[Join the Testflight](https://testflight.apple.com/join/yrsLAMu5)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Cleaning up my Twitter timeline]]></title>
            <description><![CDATA[<p></p>
<p>My timeline has been a bit of a mess lately, so I built a tool to improve it. It helps you go through every user you follow, view their most recent tweets and some useful stats (like % of RTs, tweets/day, time since last activity, etc.), then choose to unfollow or hide their retweets from your feed.</p>]]></description>
            <link>https://miguel.build/b/cleaning-up-my-twitter-timeline</link>
            <guid isPermaLink="true">https://miguel.build/b/cleaning-up-my-twitter-timeline</guid>
            <pubDate>Sun, 15 May 2022 06:30:14 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/feedclean/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/feedclean/poster.jpg&quot; muted type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

My timeline has been a bit of a mess lately, so I built a tool to improve it. It helps you go through every user you follow, view their most recent tweets and some useful stats (like % of RTs, tweets/day, time since last activity, etc.), then choose to unfollow or hide their retweets from your feed.</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/feedclean/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/feedclean/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[Recording a TV documentary]]></title>
            <description><![CDATA[<p><img src="https://web-assets.miguel.build/documentary/room.jpg" alt="">
<img src="https://web-assets.miguel.build/documentary/cam.jpg" alt=""></p>
<p>I've been helping out with a TV documentary about the future of tech for the biggest news channel in Spain. Today was recording day!</p>]]></description>
            <link>https://miguel.build/b/recording-a-tv-documentary</link>
            <guid isPermaLink="true">https://miguel.build/b/recording-a-tv-documentary</guid>
            <pubDate>Sun, 13 Mar 2022 14:16:55 GMT</pubDate>
            <source:markdown>![](https://web-assets.miguel.build/documentary/room.jpg)
![](https://web-assets.miguel.build/documentary/cam.jpg)

I&apos;ve been helping out with a TV documentary about the future of tech for the biggest news channel in Spain. Today was recording day!</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Running an Ethereum archive at home]]></title>
            <description><![CDATA[<p>Finally managed to get an Ethereum archive node running at home, and point all my wallets &#x26; apps to it. Self-sovereignty feels great, and RPC calls are much faster too!</p>]]></description>
            <link>https://miguel.build/b/running-an-ethereum-archive-at-home</link>
            <guid isPermaLink="true">https://miguel.build/b/running-an-ethereum-archive-at-home</guid>
            <pubDate>Sat, 12 Mar 2022 16:55:28 GMT</pubDate>
            <source:markdown>

Finally managed to get an Ethereum archive node running at home, and point all my wallets &amp; apps to it. Self-sovereignty feels great, and RPC calls are much faster too!</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Making web apps in Solidity]]></title>
            <description><![CDATA[<p></p>
<p>Have you ever wanted to build a web app in Solidity? Me neither, but I built a barely-working server for it anyways.</p>
<p><a href="https://github.com/m1guelpf/solserve">View on GitHub</a></p>]]></description>
            <link>https://miguel.build/b/making-web-apps-in-solidity</link>
            <guid isPermaLink="true">https://miguel.build/b/making-web-apps-in-solidity</guid>
            <pubDate>Sat, 01 Jan 2022 21:18:18 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/solidity-web/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/solidity-web/poster.jpg&quot; muted type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

Have you ever wanted to build a web app in Solidity? Me neither, but I built a barely-working server for it anyways.

[View on GitHub](https://github.com/m1guelpf/solserve)</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/solidity-web/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/solidity-web/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[Animated fractal experiments]]></title>
            <description><![CDATA[<p></p>
<p>Played around with some fractal simulations now that I finally have a M1. Above is a Mandelbulb, a 3D version of the Mandelbrot set</p>
<p><a href="https://twitter.com/m1guelpf/status/1463360501153292292">View the source</a></p>]]></description>
            <link>https://miguel.build/b/animated-fractal-experiments</link>
            <guid isPermaLink="true">https://miguel.build/b/animated-fractal-experiments</guid>
            <pubDate>Wed, 24 Nov 2021 04:05:21 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/fractal-experiments/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/fractal-experiments/poster.jpg&quot; muted type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

Played around with some fractal simulations now that I finally have a M1. Above is a Mandelbulb, a 3D version of the Mandelbrot set

[View the source](https://twitter.com/m1guelpf/status/1463360501153292292)</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/fractal-experiments/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/fractal-experiments/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[Necromint contract]]></title>
            <description><![CDATA[<pre><code class="language-solidity">//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;

import "solmate/tokens/ERC721.sol";

struct Ghost {
    address contractAddress;
    uint256 tokenId;
}

contract Necromint is ERC721 {
    uint256 private _tokenIds;

    mapping(uint256 => Ghost) internal _ghostMap;
    mapping(bytes32 => bool) internal _uniqueMap;

    constructor() ERC721("Necromint", "DEAD") {}

    function resurrect(ERC721 spirit, uint256 soul) external returns (uint256) {
        uint256 tokenId = _tokenIds++;
        Ghost storage ghost = _ghostMap[tokenId];

        require(tokenId &#x3C; 6669, "max supply");
        require(!_uniqueMap[keccak256(abi.encodePacked(spirit, soul))], "already resurrected");
        require(spirit.ownerOf(soul) == address(0x000000000000000000000000000000000000dEaD), "token not in cementery (yet?)");

        ghost.tokenId = soul;
        ghost.contractAddress = address(spirit);
        _uniqueMap[keccak256(abi.encodePacked(spirit, soul))] = true;

        _mint(msg.sender, tokenId);

        return tokenId;
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        require(_ownerOf(tokenId) != address(0), "token does not exist");
        Ghost memory ghost = _ghostMap[tokenId];

        return ERC721(ghost.contractAddress).tokenURI(ghost.tokenId);
    }
}
</code></pre>
<p>Built an ERC721 contract that allows you to resurrect burned NFTs, inspired by Dom Hofmann</p>
<p><a href="https://etherscan.io/address/0x9A652E434250f29972A79B726F2e78974140BB8c">View on Etherscan</a></p>]]></description>
            <link>https://miguel.build/b/necromint-contract</link>
            <guid isPermaLink="true">https://miguel.build/b/necromint-contract</guid>
            <pubDate>Fri, 08 Oct 2021 16:23:39 GMT</pubDate>
            <source:markdown>```solidity
//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;

import &quot;solmate/tokens/ERC721.sol&quot;;

struct Ghost {
    address contractAddress;
    uint256 tokenId;
}

contract Necromint is ERC721 {
    uint256 private _tokenIds;

    mapping(uint256 =&gt; Ghost) internal _ghostMap;
    mapping(bytes32 =&gt; bool) internal _uniqueMap;

    constructor() ERC721(&quot;Necromint&quot;, &quot;DEAD&quot;) {}

    function resurrect(ERC721 spirit, uint256 soul) external returns (uint256) {
        uint256 tokenId = _tokenIds++;
        Ghost storage ghost = _ghostMap[tokenId];

        require(tokenId &lt; 6669, &quot;max supply&quot;);
        require(!_uniqueMap[keccak256(abi.encodePacked(spirit, soul))], &quot;already resurrected&quot;);
        require(spirit.ownerOf(soul) == address(0x000000000000000000000000000000000000dEaD), &quot;token not in cementery (yet?)&quot;);

        ghost.tokenId = soul;
        ghost.contractAddress = address(spirit);
        _uniqueMap[keccak256(abi.encodePacked(spirit, soul))] = true;

        _mint(msg.sender, tokenId);

        return tokenId;
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        require(_ownerOf(tokenId) != address(0), &quot;token does not exist&quot;);
        Ghost memory ghost = _ghostMap[tokenId];

        return ERC721(ghost.contractAddress).tokenURI(ghost.tokenId);
    }
}
```

Built an ERC721 contract that allows you to resurrect burned NFTs, inspired by Dom Hofmann

[View on Etherscan](https://etherscan.io/address/0x9A652E434250f29972A79B726F2e78974140BB8c)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Roam Research iOS app]]></title>
            <description><![CDATA[<p></p>
<p>Got tired of waiting for a Roam Research app so I built my own! It comes with a native "Share to Roam" extension so you can finally send notes to Roam from the native iOS menu.</p>
<p><a href="https://testflight.apple.com/join/80wiqrUd">Join the TestFlight</a></p>]]></description>
            <link>https://miguel.build/b/roam-research-ios-app</link>
            <guid isPermaLink="true">https://miguel.build/b/roam-research-ios-app</guid>
            <pubDate>Sun, 08 Aug 2021 03:21:38 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/roam-research-app/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/roam-research-app/poster.jpg&quot; muted type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

Got tired of waiting for a Roam Research app so I built my own! It comes with a native &quot;Share to Roam&quot; extension so you can finally send notes to Roam from the native iOS menu.

[Join the TestFlight](https://testflight.apple.com/join/80wiqrUd)</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/roam-research-app/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/roam-research-app/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[DM Newsletters on Twitter]]></title>
            <description><![CDATA[<p><img src="https://web-assets.miguel.build/dm-link.jpg" alt=""></p>
<p>While playing around with the Twitter API, I discovered a hacky way to bring newsletters into the platform using a DM feature meant for business chats.</p>
<p><a href="https://twitter.com/m1guelpf/status/1369327457514438656">View on Twitter</a></p>]]></description>
            <link>https://miguel.build/b/dm-newsletters-on-twitter</link>
            <guid isPermaLink="true">https://miguel.build/b/dm-newsletters-on-twitter</guid>
            <pubDate>Tue, 09 Mar 2021 16:41:21 GMT</pubDate>
            <source:markdown>![](https://web-assets.miguel.build/dm-link.jpg)

While playing around with the Twitter API, I discovered a hacky way to bring newsletters into the platform using a DM feature meant for business chats.

[View on Twitter](https://twitter.com/m1guelpf/status/1369327457514438656)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Spoke at Laravel Worldwide Meetup]]></title>
            <description><![CDATA[<p><img src="https://web-assets.miguel.build/laravel-meetup.jpg" alt=""></p>
<p>Gave a talk about different methods of authentication for Laravel at the Laravel Worldwide Meetup. Was a lot of fun!</p>
<p><a href="https://www.youtube.com/watch?v=3-9es617heE">Watch on YouTube</a></p>]]></description>
            <link>https://miguel.build/b/spoke-at-laravel-worldwide-meetup</link>
            <guid isPermaLink="true">https://miguel.build/b/spoke-at-laravel-worldwide-meetup</guid>
            <pubDate>Tue, 23 Mar 2021 20:31:09 GMT</pubDate>
            <source:markdown>![](https://web-assets.miguel.build/laravel-meetup.jpg)

Gave a talk about different methods of authentication for Laravel at the Laravel Worldwide Meetup. Was a lot of fun!

[Watch on YouTube](https://www.youtube.com/watch?v=3-9es617heE)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[3D experiments]]></title>
            <description><![CDATA[<p></p>
<p>Played around with physics-based animations in Blender. Not super fancy-looking but hey, physics!</p>]]></description>
            <link>https://miguel.build/b/3d-experiments</link>
            <guid isPermaLink="true">https://miguel.build/b/3d-experiments</guid>
            <pubDate>Fri, 19 Feb 2021 12:39:17 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/3d-experiments/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/3d-experiments/poster.jpg&quot; muted type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

Played around with physics-based animations in Blender. Not super fancy-looking but hey, physics!</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/3d-experiments/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/3d-experiments/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[Sign in with Apple on the web]]></title>
            <description><![CDATA[<p></p>
<p>Built a Laravel package to easily add Sign in with Apple to your app.</p>
<p><a href="https://github.com/m1guelpf/laravel-apple-login">View on GitHub</a></p>]]></description>
            <link>https://miguel.build/b/sign-in-with-apple-on-the-web</link>
            <guid isPermaLink="true">https://miguel.build/b/sign-in-with-apple-on-the-web</guid>
            <pubDate>Wed, 27 Jan 2021 03:00:00 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/laravel-apple-sign-in/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/laravel-apple-sign-in/poster.jpg&quot; muted type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

Built a Laravel package to easily add Sign in with Apple to your app.

[View on GitHub](https://github.com/m1guelpf/laravel-apple-login)</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/laravel-apple-sign-in/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/laravel-apple-sign-in/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[A WebAuthn Laravel package]]></title>
            <description><![CDATA[<p></p>
<p>Built a simple Laravel package that makes integrating WebAuthn into your app a breeze.</p>
<p><a href="https://github.com/m1guelpf/laravel-fastlogin">View on GitHub</a></p>]]></description>
            <link>https://miguel.build/b/a-webauthn-laravel-package</link>
            <guid isPermaLink="true">https://miguel.build/b/a-webauthn-laravel-package</guid>
            <pubDate>Fri, 22 Jan 2021 16:54:42 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/laravel-webauthn/demo.mp4&quot; poster=&quot;https://web-assets.miguel.build/laravel-webauthn/poster.jpg&quot; muted type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

Built a simple Laravel package that makes integrating WebAuthn into your app a breeze.

[View on GitHub](https://github.com/m1guelpf/laravel-fastlogin)</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/laravel-webauthn/demo.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/laravel-webauthn/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[Landing page design]]></title>
            <description><![CDATA[<p><img src="https://web-assets.miguel.build/landing-page.jpg" alt=""></p>
<p>A landing I designed for a product that never ended up getting announced. I designed this in Sketch, taking inspiration from the old Tuple and Level landing pages, and then built it with Tailwind CSS.</p>]]></description>
            <link>https://miguel.build/b/landing-page-design</link>
            <guid isPermaLink="true">https://miguel.build/b/landing-page-design</guid>
            <pubDate>Sun, 07 Jun 2020 00:11:59 GMT</pubDate>
            <source:markdown>![](https://web-assets.miguel.build/landing-page.jpg)

A landing I designed for a product that never ended up getting announced. I designed this in Sketch, taking inspiration from the old Tuple and Level landing pages, and then built it with Tailwind CSS.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[A new book-reading experience]]></title>
            <description><![CDATA[<p></p>
<p>To celebrate a few months with my girlfriend, I bought her an eBook. However, she doesn't have an eReader, so I built a simple web app to read it on following the stories format.</p>
<p><a href="https://twitter.com/m1guelpf/status/1263072424771440641">See the process</a></p>]]></description>
            <link>https://miguel.build/b/a-new-book-reading-experience</link>
            <guid isPermaLink="true">https://miguel.build/b/a-new-book-reading-experience</guid>
            <pubDate>Wed, 20 May 2020 11:41:47 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/book-stories/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/book-stories/poster.jpg&quot; muted type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

To celebrate a few months with my girlfriend, I bought her an eBook. However, she doesn&apos;t have an eReader, so I built a simple web app to read it on following the stories format.

[See the process](https://twitter.com/m1guelpf/status/1263072424771440641)</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/book-stories/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/book-stories/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[Shortcut macOS app]]></title>
            <description><![CDATA[<p></p>
<p>I wanted a desktop app for Shortcut (previously Clubhouse), but they aren't planning to release one soon, so I made it myself.</p>]]></description>
            <link>https://miguel.build/b/shortcut-macos-app</link>
            <guid isPermaLink="true">https://miguel.build/b/shortcut-macos-app</guid>
            <pubDate>Sun, 15 Mar 2020 13:03:38 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/clubhouse-macos/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/clubhouse-macos/poster.jpg&quot; muted type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

I wanted a desktop app for Shortcut (previously Clubhouse), but they aren&apos;t planning to release one soon, so I made it myself.</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/clubhouse-macos/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/clubhouse-macos/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[Neumorphic Sitesauce prototype]]></title>
            <description><![CDATA[<p></p>
<p>Over the last few days, I scratched the whole Sitesauce codebase (while keeping a copy on git obviously) and started over, focusing on the best UI &#x26; UX I could provide.</p>
<p><a href="https://twitter.com/m1guelpf/status/1229559537289637890">View full redesign</a></p>]]></description>
            <link>https://miguel.build/b/neumorphic-sitesauce-prototype</link>
            <guid isPermaLink="true">https://miguel.build/b/neumorphic-sitesauce-prototype</guid>
            <pubDate>Tue, 18 Feb 2020 00:13:32 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/neumorphic-sitesauce/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/neumorphic-sitesauce/poster.jpg&quot; muted type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

Over the last few days, I scratched the whole Sitesauce codebase (while keeping a copy on git obviously) and started over, focusing on the best UI &amp; UX I could provide.

[View full redesign](https://twitter.com/m1guelpf/status/1229559537289637890)</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/neumorphic-sitesauce/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/neumorphic-sitesauce/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[Reverse-engineering Byte]]></title>
            <description><![CDATA[<p></p>
<p>Spent some time reverse-engineering the Byte API, and managed to upload a video from outside the app!</p>]]></description>
            <link>https://miguel.build/b/reverse-engineering-byte</link>
            <guid isPermaLink="true">https://miguel.build/b/reverse-engineering-byte</guid>
            <pubDate>Sat, 25 Jan 2020 18:48:46 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/byte-re/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/byte-re/poster.jpg&quot; muted type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

Spent some time reverse-engineering the Byte API, and managed to upload a video from outside the app!</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/byte-re/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/byte-re/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[Sitesauce UI refresh]]></title>
            <description><![CDATA[<p></p>
<p>I took some time this weekend to rebuild the entire Sitesauce UI from scratch (for like 3rd time!). Happy with this iteration so far.</p>]]></description>
            <link>https://miguel.build/b/sitesauce-ui-refresh</link>
            <guid isPermaLink="true">https://miguel.build/b/sitesauce-ui-refresh</guid>
            <pubDate>Sun, 10 Nov 2019 17:57:26 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/sitesauce-ui/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/sitesauce-ui/poster.jpg&quot;  type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

I took some time this weekend to rebuild the entire Sitesauce UI from scratch (for like 3rd time!). Happy with this iteration so far.</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/sitesauce-ui/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/sitesauce-ui/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[Skeuomorphic credit card input]]></title>
            <description><![CDATA[<p></p>
<p>A very unique credit card input for Sitesauce (using Stripe Elements behind the scenes). Didn't end up making it onto the final product, but I still love it.</p>]]></description>
            <link>https://miguel.build/b/skeuomorphic-credit-card-input</link>
            <guid isPermaLink="true">https://miguel.build/b/skeuomorphic-credit-card-input</guid>
            <pubDate>Thu, 24 Oct 2019 21:20:11 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/skeuomorphic-cc/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/skeuomorphic-cc/poster.jpg&quot; muted type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

A very unique credit card input for Sitesauce (using Stripe Elements behind the scenes). Didn&apos;t end up making it onto the final product, but I still love it.</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/skeuomorphic-cc/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/skeuomorphic-cc/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[Secret project prototype]]></title>
            <description><![CDATA[<p></p>
<p>Secret project video update: Been working on polishing UX &#x26; onboarding experience. Hoping to announce it very soon!</p>]]></description>
            <link>https://miguel.build/b/secret-project-prototype</link>
            <guid isPermaLink="true">https://miguel.build/b/secret-project-prototype</guid>
            <pubDate>Fri, 06 Sep 2019 16:22:25 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/sitesauce-prototype/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/sitesauce-prototype/poster.jpg&quot; muted type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

Secret project video update: Been working on polishing UX &amp; onboarding experience. Hoping to announce it very soon!</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/sitesauce-prototype/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/sitesauce-prototype/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[My first ever (un)conference talk!]]></title>
            <description><![CDATA[<p><img src="https://web-assets.miguel.build/unconference-talk.jpg" alt=""></p>
<p>I gave my first talk ever at the LaraconEU Unconference, and it was a great experience. Maybe I'll be on the main stage next year?</p>]]></description>
            <link>https://miguel.build/b/my-first-ever-unconference-talk</link>
            <guid isPermaLink="true">https://miguel.build/b/my-first-ever-unconference-talk</guid>
            <pubDate>Sun, 01 Sep 2019 21:46:35 GMT</pubDate>
            <source:markdown>![](https://web-assets.miguel.build/unconference-talk.jpg)

I gave my first talk ever at the LaraconEU Unconference, and it was a great experience. Maybe I&apos;ll be on the main stage next year?</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Custom backgrounds]]></title>
            <description><![CDATA[<p><img src="https://web-assets.miguel.build/custom-backgrounds/desktop.jpg" alt="">
<img src="https://web-assets.miguel.build/custom-backgrounds/phone.jpg" alt=""></p>
<p>Designed some new backgrounds for my devices, showing all the logos from past projects and my branding ✨</p>]]></description>
            <link>https://miguel.build/b/custom-backgrounds</link>
            <guid isPermaLink="true">https://miguel.build/b/custom-backgrounds</guid>
            <pubDate>Wed, 17 Jul 2019 15:47:01 GMT</pubDate>
            <source:markdown>![](https://web-assets.miguel.build/custom-backgrounds/desktop.jpg)
![](https://web-assets.miguel.build/custom-backgrounds/phone.jpg)

Designed some new backgrounds for my devices, showing all the logos from past projects and my branding ✨</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[A Chrome extension to focus on your email]]></title>
            <description><![CDATA[<p><img src="https://web-assets.miguel.build/gmail-focus.jpg" alt=""></p>
<p>Inspired by Christian Genco, I buily a simple Chrome extension that strikes out the text of every single email except for the first one, forcing you to actually focus instead of just skimming through them.</p>
<p><a href="https://chrome.google.com/webstore/detail/gmail-focus/ibkglcbdiifoobbgjpghnobobbnddojj">Install extension</a></p>]]></description>
            <link>https://miguel.build/b/a-chrome-extension-to-focus-on-your-email</link>
            <guid isPermaLink="true">https://miguel.build/b/a-chrome-extension-to-focus-on-your-email</guid>
            <pubDate>Wed, 17 Jul 2019 11:13:40 GMT</pubDate>
            <source:markdown>![](https://web-assets.miguel.build/gmail-focus.jpg)

Inspired by Christian Genco, I buily a simple Chrome extension that strikes out the text of every single email except for the first one, forcing you to actually focus instead of just skimming through them.

[Install extension](https://chrome.google.com/webstore/detail/gmail-focus/ibkglcbdiifoobbgjpghnobobbnddojj)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[A theme uploader for Ghost]]></title>
            <description><![CDATA[<p></p>
<p>A Ghost theme marketplace prototype that could directly upload and update Ghost themes using undocumented API endpoints. Built in under two hours while streaming!</p>]]></description>
            <link>https://miguel.build/b/a-theme-uploader-for-ghost</link>
            <guid isPermaLink="true">https://miguel.build/b/a-theme-uploader-for-ghost</guid>
            <pubDate>Fri, 28 Jun 2019 12:41:25 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/connla/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/connla/poster.jpg&quot; muted type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

A Ghost theme marketplace prototype that could directly upload and update Ghost themes using undocumented API endpoints. Built in under two hours while streaming!</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/connla/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/connla/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[Launchpad OBS controls]]></title>
            <description><![CDATA[<p></p>
<p>Managed to get a really cool scene switching setup with my launchpad, using MIDI to control OBS Studio. I can now switch scenes and toggle sources with the push of a button!</p>]]></description>
            <link>https://miguel.build/b/launchpad-obs-controls</link>
            <guid isPermaLink="true">https://miguel.build/b/launchpad-obs-controls</guid>
            <pubDate>Wed, 26 Jun 2019 10:54:10 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/launchpad-obs/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/launchpad-obs/poster.jpg&quot; muted type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

Managed to get a really cool scene switching setup with my launchpad, using MIDI to control OBS Studio. I can now switch scenes and toggle sources with the push of a button!</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/launchpad-obs/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/launchpad-obs/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[Blog redesign prototype]]></title>
            <description><![CDATA[<p></p>
<p>An early version of my website's redesign which I ended up discarding.</p>]]></description>
            <link>https://miguel.build/b/blog-redesign-prototype</link>
            <guid isPermaLink="true">https://miguel.build/b/blog-redesign-prototype</guid>
            <pubDate>Sat, 22 Jun 2019 14:09:52 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/old-blog-themes/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/old-blog-themes/poster.jpg&quot; muted type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

An early version of my website&apos;s redesign which I ended up discarding.</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/old-blog-themes/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/old-blog-themes/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[Things web logger]]></title>
            <description><![CDATA[<p></p>
<p>I LOVE Things, but it's only available for iOS devices and I wanted to add tasks from my school Chromebook, so I made a little PWA that lets you add tasks from any device.</p>
<p><a href="https://github.com/m1guelpf/send-to-things">View on GitHub</a></p>]]></description>
            <link>https://miguel.build/b/things-web-logger</link>
            <guid isPermaLink="true">https://miguel.build/b/things-web-logger</guid>
            <pubDate>Thu, 13 Jun 2019 13:30:22 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/things-web-logger/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/things-web-logger/poster.jpg&quot; muted type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

I LOVE Things, but it&apos;s only available for iOS devices and I wanted to add tasks from my school Chromebook, so I made a little PWA that lets you add tasks from any device.

[View on GitHub](https://github.com/m1guelpf/send-to-things)</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/things-web-logger/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/things-web-logger/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[Blogcast onboarding prototype]]></title>
            <description><![CDATA[<p></p>
<p>Built a nice onboarding for Blogcast, which explains the service and guides you while adding your first article, importing and enabling sync.</p>]]></description>
            <link>https://miguel.build/b/blogcast-onboarding-prototype</link>
            <guid isPermaLink="true">https://miguel.build/b/blogcast-onboarding-prototype</guid>
            <pubDate>Mon, 22 Apr 2019 22:44:21 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/blogcast-onboarding/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/blogcast-onboarding/poster.jpg&quot; muted type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

Built a nice onboarding for Blogcast, which explains the service and guides you while adding your first article, importing and enabling sync.</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/blogcast-onboarding/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/blogcast-onboarding/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[Snaptier designs]]></title>
            <description><![CDATA[<p><img src="https://web-assets.miguel.build/snaptier-designs/landing.png" alt="">
<img src="https://web-assets.miguel.build/snaptier-designs/coming-soon.png" alt="">
<img src="https://web-assets.miguel.build/snaptier-designs/404.png" alt=""></p>
<p>Snaptier was an automation project I worked on with some friends. We ended up shutting it down after a few months, but the designs were pretty cool.</p>]]></description>
            <link>https://miguel.build/b/snaptier-designs</link>
            <guid isPermaLink="true">https://miguel.build/b/snaptier-designs</guid>
            <pubDate>Sun, 31 Mar 2019 22:44:21 GMT</pubDate>
            <source:markdown>![](https://web-assets.miguel.build/snaptier-designs/landing.png)
![](https://web-assets.miguel.build/snaptier-designs/coming-soon.png)
![](https://web-assets.miguel.build/snaptier-designs/404.png)

Snaptier was an automation project I worked on with some friends. We ended up shutting it down after a few months, but the designs were pretty cool.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Turn your blog into a podcast]]></title>
            <description><![CDATA[<p><img src="https://web-assets.miguel.build/blogcast.jpg" alt=""></p>
<p>Blogcast uses advanced text-to-speech technology to turn your blog into a podcast. I set myself the goal of going from idea to first paying customer in less than a week, and I'm happy to say I did it!</p>
<p><a href="https://www.producthunt.com/posts/blogcast">View on Product Hunt</a></p>]]></description>
            <link>https://miguel.build/b/turn-your-blog-into-a-podcast</link>
            <guid isPermaLink="true">https://miguel.build/b/turn-your-blog-into-a-podcast</guid>
            <pubDate>Thu, 21 Mar 2019 07:00:16 GMT</pubDate>
            <source:markdown>![](https://web-assets.miguel.build/blogcast.jpg)

Blogcast uses advanced text-to-speech technology to turn your blog into a podcast. I set myself the goal of going from idea to first paying customer in less than a week, and I&apos;m happy to say I did it!

[View on Product Hunt](https://www.producthunt.com/posts/blogcast)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Website redesign]]></title>
            <description><![CDATA[<p><img src="https://web-assets.miguel.build/website-redesign.jpg" alt=""></p>
<p>Redesigned my website yet again, this time with a much cleaner look and cards for the articles. Also, dark mode!</p>]]></description>
            <link>https://miguel.build/b/website-redesign</link>
            <guid isPermaLink="true">https://miguel.build/b/website-redesign</guid>
            <pubDate>Wed, 23 Jan 2019 00:02:59 GMT</pubDate>
            <source:markdown>![](https://web-assets.miguel.build/website-redesign.jpg)

Redesigned my website yet again, this time with a much cleaner look and cards for the articles. Also, dark mode!</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Blogcast UI]]></title>
            <description><![CDATA[<p></p>
<p>Finally finished working on the UI flow for my new article-to-audio product! Still things to tweak, but here's an early preview.</p>]]></description>
            <link>https://miguel.build/b/blogcast-ui</link>
            <guid isPermaLink="true">https://miguel.build/b/blogcast-ui</guid>
            <pubDate>Fri, 18 Jan 2019 17:55:53 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/blogcast-ui/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/blogcast-ui/poster.jpg&quot; muted type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

Finally finished working on the UI flow for my new article-to-audio product! Still things to tweak, but here&apos;s an early preview.</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/blogcast-ui/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/blogcast-ui/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[A better Patreon for makers]]></title>
            <description><![CDATA[<p><img src="https://web-assets.miguel.build/maker-army.jpg" alt=""></p>
<p>Built a landing page for a product that never ended up launching. It was supposed to be a better Patreon for makers, with better integrations and an actually usable API.</p>]]></description>
            <link>https://miguel.build/b/a-better-patreon-for-makers</link>
            <guid isPermaLink="true">https://miguel.build/b/a-better-patreon-for-makers</guid>
            <pubDate>Mon, 24 Dec 2018 00:30:23 GMT</pubDate>
            <source:markdown>![](https://web-assets.miguel.build/maker-army.jpg)

Built a landing page for a product that never ended up launching. It was supposed to be a better Patreon for makers, with better integrations and an actually usable API.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[An extension to toggle CSS from a website]]></title>
            <description><![CDATA[<p><img src="https://web-assets.miguel.build/unstyler.jpg" alt=""></p>
<p>I challenged myself to build something in an hour, and the result was a very simple Chrome extension that let you disable CSS on a website. It's now available on the Chrome Web Store!</p>
<p><a href="https://chrome.google.com/webstore/detail/unstyler/iniahmhgmcmkimliphhbgfkmichgccjd">Install extension</a></p>]]></description>
            <link>https://miguel.build/b/an-extension-to-toggle-css-from-a-website</link>
            <guid isPermaLink="true">https://miguel.build/b/an-extension-to-toggle-css-from-a-website</guid>
            <pubDate>Fri, 07 Dec 2018 08:17:34 GMT</pubDate>
            <source:markdown>![](https://web-assets.miguel.build/unstyler.jpg)

I challenged myself to build something in an hour, and the result was a very simple Chrome extension that let you disable CSS on a website. It&apos;s now available on the Chrome Web Store!

[Install extension](https://chrome.google.com/webstore/detail/unstyler/iniahmhgmcmkimliphhbgfkmichgccjd)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Personal Dashboard]]></title>
            <description><![CDATA[<p><img src="https://web-assets.miguel.build/personal-dashboard.jpg" alt=""></p>
<p>A dynamic dashboard showing my calendar, Twitter interactions, current music, and more. Built with Laravel and Vue.js.</p>]]></description>
            <link>https://miguel.build/b/personal-dashboard</link>
            <guid isPermaLink="true">https://miguel.build/b/personal-dashboard</guid>
            <pubDate>Thu, 29 Nov 2018 22:00:28 GMT</pubDate>
            <source:markdown>![](https://web-assets.miguel.build/personal-dashboard.jpg)

A dynamic dashboard showing my calendar, Twitter interactions, current music, and more. Built with Laravel and Vue.js.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Video Embeds for Statamic]]></title>
            <description><![CDATA[<p></p>
<p>My second Statamic addon, which lets you embed videos from YouTube, Vimeo, and Wistia. It also supports custom embeds, and is fully configurable.</p>]]></description>
            <link>https://miguel.build/b/video-embeds-for-statamic</link>
            <guid isPermaLink="true">https://miguel.build/b/video-embeds-for-statamic</guid>
            <pubDate>Wed, 18 Jul 2018 19:11:54 GMT</pubDate>
            <source:markdown>&lt;video controls&gt;&lt;source src=&quot;https://web-assets.miguel.build/statamic-embeds/video.mp4&quot; poster=&quot;https://web-assets.miguel.build/statamic-embeds/poster.jpg&quot; muted type=&quot;video/mp4&quot;&gt;&lt;/video&gt;

My second Statamic addon, which lets you embed videos from YouTube, Vimeo, and Wistia. It also supports custom embeds, and is fully configurable.</source:markdown>
            <media:group>
                <media:content url="https://web-assets.miguel.build/statamic-embeds/video.mp4" type="video/mp4" medium="video"/>
                <media:thumbnail url="https://web-assets.miguel.build/statamic-embeds/poster.jpg"/>
            </media:group>
        </item>
        <item>
            <title><![CDATA[Beautiful docs for everyone]]></title>
            <description><![CDATA[<p><img src="https://web-assets.miguel.build/unmarkdocs.png" alt=""></p>
<p>Since last summer, I've been working in my first real product. It aims to help everyone create beautiful documentation for their projects. Try it out!</p>]]></description>
            <link>https://miguel.build/b/beautiful-docs-for-everyone</link>
            <guid isPermaLink="true">https://miguel.build/b/beautiful-docs-for-everyone</guid>
            <pubDate>Tue, 19 Jun 2018 09:05:08 GMT</pubDate>
            <source:markdown>![](https://web-assets.miguel.build/unmarkdocs.png)

Since last summer, I&apos;ve been working in my first real product. It aims to help everyone create beautiful documentation for their projects. Try it out!</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Contributed to the Laravel framework]]></title>
            <description><![CDATA[<pre><code class="language-blade">{{-- Tired of doing this? --}}

@if (Auth::check())
    @include('super-secret-stuff')
@else
    @include('nothing-to-see-here')
@endif

{{-- Maybe it's even worse... --}}

@if (Auth::guard('api')->check())
    @include('super-secret-stuff')
@endif

{{-- Now you can simply --}}

@auth
    @include('super-secret-stuff')
@endauth

@auth('api')
    Yay, Auth Guards!
@endauth
</code></pre>
<p>Added an @auth Blade directive, so you can easily check if a user is logged in or not.</p>
<p><a href="https://github.com/laravel/framework/pull/20087">View on GitHub</a></p>]]></description>
            <link>https://miguel.build/b/contributed-to-the-laravel-framework</link>
            <guid isPermaLink="true">https://miguel.build/b/contributed-to-the-laravel-framework</guid>
            <pubDate>Mon, 17 Jul 2017 16:07:53 GMT</pubDate>
            <source:markdown>```blade
{{-- Tired of doing this? --}}

@if (Auth::check())
    @include(&apos;super-secret-stuff&apos;)
@else
    @include(&apos;nothing-to-see-here&apos;)
@endif

{{-- Maybe it&apos;s even worse... --}}

@if (Auth::guard(&apos;api&apos;)-&gt;check())
    @include(&apos;super-secret-stuff&apos;)
@endif

{{-- Now you can simply --}}

@auth
    @include(&apos;super-secret-stuff&apos;)
@endauth

@auth(&apos;api&apos;)
    Yay, Auth Guards!
@endauth
```

Added an @auth Blade directive, so you can easily check if a user is logged in or not.

[View on GitHub](https://github.com/laravel/framework/pull/20087)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Learning Laravel]]></title>
            <description><![CDATA[<p>After a few weeks of "Inspect Element"-ing through websites, tweaking HTML/CSS, and trying to understand how things work, I figured it was time to learn a proper programming language.</p>
<p>The obvious next step was PHP, and after going through some courses and the PHP docs, I figured the best way to learn was by building something.</p>
<p>I've been working on an app for joining GitHub organizations, more on that soon!</p>
<p><a href="https://github.com/orgmanager/orgmanager/commit/f3d37fe15f2d97d758597359346a8c0b9f1a98d8">First OrgManager commit</a></p>]]></description>
            <link>https://miguel.build/b/learning-laravel</link>
            <guid isPermaLink="true">https://miguel.build/b/learning-laravel</guid>
            <pubDate>Fri, 13 Jan 2017 21:01:44 GMT</pubDate>
            <source:markdown>

After a few weeks of &quot;Inspect Element&quot;-ing through websites, tweaking HTML/CSS, and trying to understand how things work, I figured it was time to learn a proper programming language.

The obvious next step was PHP, and after going through some courses and the PHP docs, I figured the best way to learn was by building something.

I&apos;ve been working on an app for joining GitHub organizations, more on that soon!

[First OrgManager commit](https://github.com/orgmanager/orgmanager/commit/f3d37fe15f2d97d758597359346a8c0b9f1a98d8)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[My first 3DS homebrew]]></title>
            <description><![CDATA[<p><img src="https://web-assets.miguel.build/3ds-homebrew.jpg" alt=""></p>
<p>Finally managed to get DevKitPro working, and write my first 3DS homebrew!</p>]]></description>
            <link>https://miguel.build/b/my-first-3ds-homebrew</link>
            <guid isPermaLink="true">https://miguel.build/b/my-first-3ds-homebrew</guid>
            <pubDate>Tue, 03 Jan 2017 21:01:44 GMT</pubDate>
            <source:markdown>![](https://web-assets.miguel.build/3ds-homebrew.jpg)

Finally managed to get DevKitPro working, and write my first 3DS homebrew!</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[ConstitutionDAO]]></title>
            <description><![CDATA[<p>[ConstitutionDAO (📜, 📜) (@ConstitutionDAO) on Twitter: We didn't get the Constitution, but we made history nonetheless.</p>
<p>We broke records for the largest crowdfund for a physical object and most money crowdfunded in 72h, which will of course be refunded to everyone who participated.</p>
<p>To all our 17,437 contributors, THANK YOU ❤️](https://twitter.com/ConstitutionDAO/status/1461527514485035009)</p>
<p>Last month, my friends and I embarked on the crazy journey of trying to buy a copy of United States' Consitution. We built the DAO in less than a week and raised $42M in 4 days. Didn't end up winning, but it was a hell of a ride.</p>]]></description>
            <link>https://miguel.build/b/constitutiondao</link>
            <guid isPermaLink="true">https://miguel.build/b/constitutiondao</guid>
            <pubDate>Sat, 13 Nov 2021 04:43:01 GMT</pubDate>
            <source:markdown>[ConstitutionDAO (📜, 📜) (@ConstitutionDAO) on Twitter: We didn&apos;t get the Constitution, but we made history nonetheless.

We broke records for the largest crowdfund for a physical object and most money crowdfunded in 72h, which will of course be refunded to everyone who participated.

To all our 17,437 contributors, THANK YOU ❤️](https://twitter.com/ConstitutionDAO/status/1461527514485035009)

Last month, my friends and I embarked on the crazy journey of trying to buy a copy of United States&apos; Consitution. We built the DAO in less than a week and raised $42M in 4 days. Didn&apos;t end up winning, but it was a hell of a ride.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Laracon Online talk]]></title>
            <description><![CDATA[<p><a href="https://twitter.com/LaraconOnline/status/1372269942020608001">Laracon Online (@LaraconOnline) on Twitter: Next up @m1guelpf is going to talk about the Foundation we all build upon in @laravelphp. https://t.co/Fwjy7Kw9sS</a></p>
<p>Gave a talk about the internals of the Laravel Framework to thousands of developers all over the world.</p>
<p><a href="https://www.youtube.com/watch?v=QCveo4y4uSU">Watch on YouTube</a></p>]]></description>
            <link>https://miguel.build/b/laracon-online-talk</link>
            <guid isPermaLink="true">https://miguel.build/b/laracon-online-talk</guid>
            <pubDate>Wed, 17 Mar 2021 19:33:44 GMT</pubDate>
            <source:markdown>[Laracon Online (@LaraconOnline) on Twitter: Next up @m1guelpf is going to talk about the Foundation we all build upon in @laravelphp. https://t.co/Fwjy7Kw9sS](https://twitter.com/LaraconOnline/status/1372269942020608001)

Gave a talk about the internals of the Laravel Framework to thousands of developers all over the world.

[Watch on YouTube](https://www.youtube.com/watch?v=QCveo4y4uSU)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Meta tweet]]></title>
            <description><![CDATA[<p><a href="https://twitter.com/m1guelpf/status/1499932412851146754">Miguel Piedrafita ✨ (@m1guelpf) on Twitter: https://t.co/BUjkIncxfG</a></p>
<p>A tweet that shows its own likes, retweets and replies (best viewed on Twitter). It generates dynamic open graph images using a headless browser, then refreshes Twitter's cache using a reverse-engineered API.</p>]]></description>
            <link>https://miguel.build/b/meta-tweet</link>
            <guid isPermaLink="true">https://miguel.build/b/meta-tweet</guid>
            <pubDate>Sat, 05 Mar 2022 02:18:49 GMT</pubDate>
            <source:markdown>[Miguel Piedrafita ✨ (@m1guelpf) on Twitter: https://t.co/BUjkIncxfG](https://twitter.com/m1guelpf/status/1499932412851146754)

A tweet that shows its own likes, retweets and replies (best viewed on Twitter). It generates dynamic open graph images using a headless browser, then refreshes Twitter&apos;s cache using a reverse-engineered API.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Spotify OBS widget]]></title>
            <description><![CDATA[<p><a href="https://spotify.m1guelpf.me/"><img src="https://spotify.m1guelpf.me/card.jpg" alt="A Spotify Embed for your Twitch Streams"></a></p>
<p>A super simple, real-time "now playing" widget to display your current Spotify song on stream. Was a fun little project to learn about the Spotify API.</p>]]></description>
            <link>https://miguel.build/b/spotify-obs-widget</link>
            <guid isPermaLink="true">https://miguel.build/b/spotify-obs-widget</guid>
            <pubDate>Thu, 29 Apr 2021 00:01:32 GMT</pubDate>
            <source:markdown>[![A Spotify Embed for your Twitch Streams](https://spotify.m1guelpf.me/card.jpg)](https://spotify.m1guelpf.me/)

A super simple, real-time &quot;now playing&quot; widget to display your current Spotify song on stream. Was a fun little project to learn about the Spotify API.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Announcing Sitesauce]]></title>
            <description><![CDATA[<p>[Miguel Piedrafita ✨ (@m1guelpf) on Twitter: 🎉 I'm incredibly excited to finally unveil what I've been working on for the past month.</p>
<p>Sitesauce generates static sites from ANY dynamically-generated site and keeps them updated.</p>
<p>Learn more and sign up for early access 👇</p>
<p>https://t.co/34a8oLKjop](https://twitter.com/m1guelpf/status/1183404875465592832)</p>
<p>Sitesauce generates static sites from ANY dynamically-generated site and keeps them updated. I've been working on it for over a month now, and I'm super excited to see where it goes!</p>]]></description>
            <link>https://miguel.build/b/announcing-sitesauce</link>
            <guid isPermaLink="true">https://miguel.build/b/announcing-sitesauce</guid>
            <pubDate>Sun, 13 Oct 2019 15:31:23 GMT</pubDate>
            <source:markdown>[Miguel Piedrafita ✨ (@m1guelpf) on Twitter: 🎉 I&apos;m incredibly excited to finally unveil what I&apos;ve been working on for the past month.

Sitesauce generates static sites from ANY dynamically-generated site and keeps them updated.

Learn more and sign up for early access 👇

https://t.co/34a8oLKjop](https://twitter.com/m1guelpf/status/1183404875465592832)

Sitesauce generates static sites from ANY dynamically-generated site and keeps them updated. I&apos;ve been working on it for over a month now, and I&apos;m super excited to see where it goes!</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[World is now live in the US]]></title>
            <description><![CDATA[<p><a href="https://twitter.com/ethereum/status/1919376610182025455">Ethereum (@ethereum) on Twitter: Ethereum is for humans.</a></p>
<p>After many months of work, World launches in the US! See the tweet above for some highlights of what we launched, included some things I built! 😁</p>]]></description>
            <link>https://miguel.build/b/world-is-now-live-in-the-us</link>
            <guid isPermaLink="true">https://miguel.build/b/world-is-now-live-in-the-us</guid>
            <pubDate>Thu, 01 May 2025 07:31:04 GMT</pubDate>
            <source:markdown>[Ethereum (@ethereum) on Twitter: Ethereum is for humans.](https://twitter.com/ethereum/status/1919376610182025455)

After many months of work, World launches in the US! See the tweet above for some highlights of what we launched, included some things I built! 😁</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[ENS Delegate Checker]]></title>
            <description><![CDATA[<p><a href="https://ens-delegatoor.vercel.app"><img src="https://ens-delegatoor.vercel.app/_next/static/media/card.037282da.jpg" alt="Who is voting with my $ENS?"></a></p>
<p>Built a simple website where you can see who you're currently delegating your $ENS to. Built in response to a controversy one of the top delegates was involved in.</p>]]></description>
            <link>https://miguel.build/b/ens-delegate-checker</link>
            <guid isPermaLink="true">https://miguel.build/b/ens-delegate-checker</guid>
            <pubDate>Sun, 06 Feb 2022 06:08:45 GMT</pubDate>
            <source:markdown>[![Who is voting with my $ENS?](https://ens-delegatoor.vercel.app/_next/static/media/card.037282da.jpg)](https://ens-delegatoor.vercel.app)

Built a simple website where you can see who you&apos;re currently delegating your $ENS to. Built in response to a controversy one of the top delegates was involved in.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Wallet to Twitter]]></title>
            <description><![CDATA[<p><a href="https://twiteth.m1guelpf.me"><img src="https://twiteth.m1guelpf.me/_next/static/media/cover.400581ac.jpg" alt="How Traceable is your Ethereum Address?"></a></p>
<p>Built a small website on the plane back from ETHDenver that shows you if your wallet can be traced back to any Twitter accounts, using multiple publicly-available data sources.</p>]]></description>
            <link>https://miguel.build/b/wallet-to-twitter</link>
            <guid isPermaLink="true">https://miguel.build/b/wallet-to-twitter</guid>
            <pubDate>Wed, 23 Feb 2022 21:53:34 GMT</pubDate>
            <source:markdown>[![How Traceable is your Ethereum Address?](https://twiteth.m1guelpf.me/_next/static/media/cover.400581ac.jpg)](https://twiteth.m1guelpf.me)

Built a small website on the plane back from ETHDenver that shows you if your wallet can be traced back to any Twitter accounts, using multiple publicly-available data sources.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[A Stable Diffusion Twitter bot]]></title>
            <description><![CDATA[<p>[Miguel Piedrafita ✨ (@m1guelpf) on Twitter: ✨ Stable Diffusion is amazing, but unfortunately it isn't trivial to setup (especially for people without good GPUs).</p>
<p>Instead, I made a Twitter bot that turns any reply to this tweet into an image, using SD!</p>
<p>Let's see what you can come up with! 👇](https://twitter.com/m1guelpf/status/1569487042345861121)</p>
<p>Stable Diffusion is amazing, but unfortunately it isn't trivial to setup (especially for people without good GPUs). To share it with everyone, I made a Twitter bot that turns any tweet reply into an image, using SD.</p>]]></description>
            <link>https://miguel.build/b/a-stable-diffusion-twitter-bot</link>
            <guid isPermaLink="true">https://miguel.build/b/a-stable-diffusion-twitter-bot</guid>
            <pubDate>Tue, 13 Sep 2022 00:44:05 GMT</pubDate>
            <source:markdown>[Miguel Piedrafita ✨ (@m1guelpf) on Twitter: ✨ Stable Diffusion is amazing, but unfortunately it isn&apos;t trivial to setup (especially for people without good GPUs).

Instead, I made a Twitter bot that turns any reply to this tweet into an image, using SD!

Let&apos;s see what you can come up with! 👇](https://twitter.com/m1guelpf/status/1569487042345861121)

Stable Diffusion is amazing, but unfortunately it isn&apos;t trivial to setup (especially for people without good GPUs). To share it with everyone, I made a Twitter bot that turns any tweet reply into an image, using SD.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Hacker News for Lens]]></title>
            <description><![CDATA[<p><a href="https://refract.withlens.app"><img src="https://refract.withlens.app/_next/static/media/card.6b3d3958.jpg" alt="Refract: Top Links in Crypto"></a></p>
<p>I love Hacker News because of all the amazing articles &#x26; repos I've found there over the years. To carry that sentiment into web3, I built a Lens-powered link board.</p>]]></description>
            <link>https://miguel.build/b/hacker-news-for-lens</link>
            <guid isPermaLink="true">https://miguel.build/b/hacker-news-for-lens</guid>
            <pubDate>Thu, 26 May 2022 04:52:25 GMT</pubDate>
            <source:markdown>[![Refract: Top Links in Crypto](https://refract.withlens.app/_next/static/media/card.6b3d3958.jpg)](https://refract.withlens.app)

I love Hacker News because of all the amazing articles &amp; repos I&apos;ve found there over the years. To carry that sentiment into web3, I built a Lens-powered link board.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Copilot, but worse]]></title>
            <description><![CDATA[<p><a href="https://github.com/m1guelpf/ai-code"><img src="https://repository-images.githubusercontent.com/560279775/5e696e7c-7844-40da-b1e8-a5bde0ac61bf" alt="GitHub - m1guelpf/ai-code: copilot, but worse"></a></p>
<p>Dumb 3AM idea: A JS package containing every function in existence. It uses Codex to generate the function's code on the fly, and then runs it.</p>]]></description>
            <link>https://miguel.build/b/copilot-but-worse</link>
            <guid isPermaLink="true">https://miguel.build/b/copilot-but-worse</guid>
            <pubDate>Fri, 04 Nov 2022 03:02:25 GMT</pubDate>
            <source:markdown>[![GitHub - m1guelpf/ai-code: copilot, but worse](https://repository-images.githubusercontent.com/560279775/5e696e7c-7844-40da-b1e8-a5bde0ac61bf)](https://github.com/m1guelpf/ai-code)

Dumb 3AM idea: A JS package containing every function in existence. It uses Codex to generate the function&apos;s code on the fly, and then runs it.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Writing a Docker image runner from scratch 🦀]]></title>
            <description><![CDATA[<p><a href="https://github.com/m1guelpf/lil-docker"><img src="https://opengraph.githubassets.com/f79e9469c3b5a36c3b851a9f9e3181180dfab6f8371e3395038e9762608575f4/m1guelpf/lil-docker" alt="GitHub - m1guelpf/lil-docker: An intentionally-limited Rust implementation of the Docker runtime with no external dependencies."></a></p>
<p>As I continue to learn Rust (and slowly run out of ideas for things to rebuild) I decided to learn more about container runtimes and build a simple one from scratch. It can run any Docker image, and it was a lot of fun to build!</p>]]></description>
            <link>https://miguel.build/b/writing-a-docker-image-runner-from-scratch</link>
            <guid isPermaLink="true">https://miguel.build/b/writing-a-docker-image-runner-from-scratch</guid>
            <pubDate>Sat, 24 Dec 2022 16:08:47 GMT</pubDate>
            <source:markdown>[![GitHub - m1guelpf/lil-docker: An intentionally-limited Rust implementation of the Docker runtime with no external dependencies.](https://opengraph.githubassets.com/f79e9469c3b5a36c3b851a9f9e3181180dfab6f8371e3395038e9762608575f4/m1guelpf/lil-docker)](https://github.com/m1guelpf/lil-docker)

As I continue to learn Rust (and slowly run out of ideas for things to rebuild) I decided to learn more about container runtimes and build a simple one from scratch. It can run any Docker image, and it was a lot of fun to build!</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[A simple job queue for Rust]]></title>
            <description><![CDATA[<p><a href="https://github.com/m1guelpf/redeez-rs"><img src="https://opengraph.githubassets.com/bed9a04aba632b7f1207447ccedf2ffc4390e30e99556b8d3f0e0cabdf21518f/m1guelpf/redeez-rs" alt="GitHub - m1guelpf/redeez-rs: A simplified general-purpose queueing system for Rust apps."></a></p>
<p>I had my friend Luc over last weekend, and he walked me through basic Redis commands &#x26; how to build queues with them. To practice, I built a simple job queue in Rust, using Redis as the backend. It's definitely not production-ready, but it made for a fun exercise!</p>]]></description>
            <link>https://miguel.build/b/a-simple-job-queue-for-rust</link>
            <guid isPermaLink="true">https://miguel.build/b/a-simple-job-queue-for-rust</guid>
            <pubDate>Mon, 16 Jan 2023 14:00:16 GMT</pubDate>
            <source:markdown>[![GitHub - m1guelpf/redeez-rs: A simplified general-purpose queueing system for Rust apps.](https://opengraph.githubassets.com/bed9a04aba632b7f1207447ccedf2ffc4390e30e99556b8d3f0e0cabdf21518f/m1guelpf/redeez-rs)](https://github.com/m1guelpf/redeez-rs)

I had my friend Luc over last weekend, and he walked me through basic Redis commands &amp; how to build queues with them. To practice, I built a simple job queue in Rust, using Redis as the backend. It&apos;s definitely not production-ready, but it made for a fun exercise!</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Automatically overlay subtitles into any video]]></title>
            <description><![CDATA[<p><a href="https://github.com/m1guelpf/auto-subtitle"><img src="https://opengraph.githubassets.com/9cf23b6d895e43f308f6e2209cec16cfc44a7cc169633a636fcfe0eef81d2992/m1guelpf/auto-subtitle" alt="GitHub - m1guelpf/auto-subtitle: Automatically generate and overlay subtitles for any video."></a></p>
<p>Built another Whisper-powered utility, which lets you automatically generate and overlay subtitles into any video. Feels insane we used to have to pay for this, and now it's just one command away.</p>]]></description>
            <link>https://miguel.build/b/automatically-overlay-subtitles-into-any-video</link>
            <guid isPermaLink="true">https://miguel.build/b/automatically-overlay-subtitles-into-any-video</guid>
            <pubDate>Wed, 28 Sep 2022 01:12:22 GMT</pubDate>
            <source:markdown>[![GitHub - m1guelpf/auto-subtitle: Automatically generate and overlay subtitles for any video.](https://opengraph.githubassets.com/9cf23b6d895e43f308f6e2209cec16cfc44a7cc169633a636fcfe0eef81d2992/m1guelpf/auto-subtitle)](https://github.com/m1guelpf/auto-subtitle)

Built another Whisper-powered utility, which lets you automatically generate and overlay subtitles into any video. Feels insane we used to have to pay for this, and now it&apos;s just one command away.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Exploring server-side Swift]]></title>
            <description><![CDATA[<p><a href="https://github.com/m1guelpf/swift-wallet-bridge"><img src="https://opengraph.githubassets.com/a343e07880d67a2b8e24d03655dea2bfebcf8ea6706a6606c662a4a2a4d21912/m1guelpf/swift-wallet-bridge" alt="GitHub - m1guelpf/swift-wallet-bridge: A Swift implementation of Worldcoin&#x27;s end-to-end encrypted ZKP bridge"></a></p>
<p>I've been having a lot of fun with Swift recently, so when I discovered there's a Swift Laravel-like web framework, I had to give it a try.</p>
<p>I decided to rebuild the end-to-end encrypted bridge that Worldcoin uses to connect to the World App, and was surprised to find it took 70% less code for pretty much the same app, and with a much better DX! Will definitely be using it in the future.</p>]]></description>
            <link>https://miguel.build/b/exploring-server-side-swift</link>
            <guid isPermaLink="true">https://miguel.build/b/exploring-server-side-swift</guid>
            <pubDate>Thu, 28 Mar 2024 16:39:48 GMT</pubDate>
            <source:markdown>[![GitHub - m1guelpf/swift-wallet-bridge: A Swift implementation of Worldcoin&apos;s end-to-end encrypted ZKP bridge](https://opengraph.githubassets.com/a343e07880d67a2b8e24d03655dea2bfebcf8ea6706a6606c662a4a2a4d21912/m1guelpf/swift-wallet-bridge)](https://github.com/m1guelpf/swift-wallet-bridge)

I&apos;ve been having a lot of fun with Swift recently, so when I discovered there&apos;s a Swift Laravel-like web framework, I had to give it a try.

I decided to rebuild the end-to-end encrypted bridge that Worldcoin uses to connect to the World App, and was surprised to find it took 70% less code for pretty much the same app, and with a much better DX! Will definitely be using it in the future.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Standard Webhooks for Swift]]></title>
            <description><![CDATA[<p><a href="https://github.com/m1guelpf/swift-standard-webhooks"><img src="https://opengraph.githubassets.com/fa552743c2c85073ad587349a59f41f7de8f5281a63a408769f6d1ce35924315/m1guelpf/swift-standard-webhooks" alt="GitHub - m1guelpf/swift-standard-webhooks: A Swift implementation of the Standard Webhooks specification."></a></p>
<p>I recently learned about the <a href="https://www.standardwebhooks.com/">Standard Webhooks spec</a>, a set of standards for properly verifying and parsing webhooks.</p>
<p>There are official SDKs for a bunch of languages, but not Swift, and I needed to validate OpenAI's webhooks (which follow the standard) on a Swift server, so I ended up building a package that handles both signing and verifying.</p>]]></description>
            <link>https://miguel.build/b/standard-webhooks-for-swift</link>
            <guid isPermaLink="true">https://miguel.build/b/standard-webhooks-for-swift</guid>
            <pubDate>Fri, 11 Jul 2025 20:07:11 GMT</pubDate>
            <source:markdown>[![GitHub - m1guelpf/swift-standard-webhooks: A Swift implementation of the Standard Webhooks specification.](https://opengraph.githubassets.com/fa552743c2c85073ad587349a59f41f7de8f5281a63a408769f6d1ce35924315/m1guelpf/swift-standard-webhooks)](https://github.com/m1guelpf/swift-standard-webhooks)

I recently learned about the [Standard Webhooks spec](https://www.standardwebhooks.com/), a set of standards for properly verifying and parsing webhooks.

There are official SDKs for a bunch of languages, but not Swift, and I needed to validate OpenAI&apos;s webhooks (which follow the standard) on a Swift server, so I ended up building a package that handles both signing and verifying.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Deploying Laravel apps from GitHub Actions]]></title>
            <description><![CDATA[<p><a href="https://github.com/m1guelpf/orbit"><img src="https://repository-images.githubusercontent.com/831705369/82ffbe17-f68a-4b52-a318-fe79ee920c1e" alt="GitHub - m1guelpf/orbit: Simple &#x26; safe zero-downtime deployments for Laravel."></a></p>
<p>I've been slowly coming back to the Laravel world, and wanted an easy way to deploy open-source apps to my server from GitHub Actions.</p>
<p>SSH'ing in didn't feel like the safest, so I built the system where the server is in control of the entire flow, while the still gets real-time logs streamed in. Self-hosted zero-downtime deployments for all!</p>]]></description>
            <link>https://miguel.build/b/deploying-laravel-apps-from-github-actions</link>
            <guid isPermaLink="true">https://miguel.build/b/deploying-laravel-apps-from-github-actions</guid>
            <pubDate>Tue, 23 Jul 2024 21:53:23 GMT</pubDate>
            <source:markdown>[![GitHub - m1guelpf/orbit: Simple &amp; safe zero-downtime deployments for Laravel.](https://repository-images.githubusercontent.com/831705369/82ffbe17-f68a-4b52-a318-fe79ee920c1e)](https://github.com/m1guelpf/orbit)

I&apos;ve been slowly coming back to the Laravel world, and wanted an easy way to deploy open-source apps to my server from GitHub Actions.

SSH&apos;ing in didn&apos;t feel like the safest, so I built the system where the server is in control of the entire flow, while the still gets real-time logs streamed in. Self-hosted zero-downtime deployments for all!</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[lil web3]]></title>
            <description><![CDATA[<p><a href="https://github.com/m1guelpf/lil-web3"><img src="https://opengraph.githubassets.com/fca74476fda14f87774855ae33cf1349370994253e04f75446a1ce8c0eaed37e/m1guelpf/lil-web3" alt="GitHub - m1guelpf/lil-web3: Simple, intentionally-limited versions of web3 protocols &#x26; apps."></a></p>
<p>I rebuilt the most popular web3 protocols and apps in a hyper-simplified (and fully tested) repo, as a learning resource. Includes ENS, OpenSea, Fractional, Juicebox, Flashloans, Gnosis Safe, and more!</p>]]></description>
            <link>https://miguel.build/b/lil-web3</link>
            <guid isPermaLink="true">https://miguel.build/b/lil-web3</guid>
            <pubDate>Thu, 06 Jan 2022 14:21:02 GMT</pubDate>
            <source:markdown>[![GitHub - m1guelpf/lil-web3: Simple, intentionally-limited versions of web3 protocols &amp; apps.](https://opengraph.githubassets.com/fca74476fda14f87774855ae33cf1349370994253e04f75446a1ce8c0eaed37e/m1guelpf/lil-web3)](https://github.com/m1guelpf/lil-web3)

I rebuilt the most popular web3 protocols and apps in a hyper-simplified (and fully tested) repo, as a learning resource. Includes ENS, OpenSea, Fractional, Juicebox, Flashloans, Gnosis Safe, and more!</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Axum Middleware for Signed URLs]]></title>
            <description><![CDATA[<p><a href="https://github.com/m1guelpf/axum-signed-urls"><img src="https://opengraph.githubassets.com/5d759d96cb1eafa21f5af118855fad153ec103f187a510d10383e73c1396b24f/m1guelpf/axum-signed-urls" alt="GitHub - m1guelpf/axum-signed-urls: Signed URL middleware for Axum, using extractors."></a></p>
<p>After experimenting with Rust backends recently, I decided to rebuild one of my favourite features from the Laravel framework: Signed URLs.</p>]]></description>
            <link>https://miguel.build/b/axum-middleware-for-signed-urls</link>
            <guid isPermaLink="true">https://miguel.build/b/axum-middleware-for-signed-urls</guid>
            <pubDate>Thu, 09 Feb 2023 04:12:29 GMT</pubDate>
            <source:markdown>[![GitHub - m1guelpf/axum-signed-urls: Signed URL middleware for Axum, using extractors.](https://opengraph.githubassets.com/5d759d96cb1eafa21f5af118855fad153ec103f187a510d10383e73c1396b24f/m1guelpf/axum-signed-urls)](https://github.com/m1guelpf/axum-signed-urls)

After experimenting with Rust backends recently, I decided to rebuild one of my favourite features from the Laravel framework: Signed URLs.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Building a web framework from scratch 🦀]]></title>
            <description><![CDATA[<p><a href="https://github.com/m1guelpf/lil-http-rs"><img src="https://opengraph.githubassets.com/8483e39a02aee61880b2dfc45fdf96e9276a906558ea0de758c1c26b6b893cc0/m1guelpf/lil-http-rs" alt="GitHub - m1guelpf/lil-http-rs: A Rust web framework with no external dependencies"></a></p>
<p>I've been learning Rust recently, and built a zero-dep HTTP server to practice (establishing TCP connections, manually parsing HTTP payloads and crafting responses, etc.). After that was finished, I kept going for a bit and built a router and some helpers to the point where it was more of a lil framework.</p>
<p>Wouldn't recommend using it in prod, but I'm super happy with how the DX turned out.</p>]]></description>
            <link>https://miguel.build/b/building-a-web-framework-from-scratch</link>
            <guid isPermaLink="true">https://miguel.build/b/building-a-web-framework-from-scratch</guid>
            <pubDate>Wed, 28 Dec 2022 09:52:29 GMT</pubDate>
            <source:markdown>[![GitHub - m1guelpf/lil-http-rs: A Rust web framework with no external dependencies](https://opengraph.githubassets.com/8483e39a02aee61880b2dfc45fdf96e9276a906558ea0de758c1c26b6b893cc0/m1guelpf/lil-http-rs)](https://github.com/m1guelpf/lil-http-rs)

I&apos;ve been learning Rust recently, and built a zero-dep HTTP server to practice (establishing TCP connections, manually parsing HTTP payloads and crafting responses, etc.). After that was finished, I kept going for a bit and built a router and some helpers to the point where it was more of a lil framework.

Wouldn&apos;t recommend using it in prod, but I&apos;m super happy with how the DX turned out.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Named routes for server-side Swift]]></title>
            <description><![CDATA[<p><a href="https://github.com/m1guelpf/ziggy-vapor"><img src="https://repository-images.githubusercontent.com/805194581/dda8e498-ea99-4b71-b2b3-68a8f038dd64" alt="GitHub - m1guelpf/ziggy-vapor: Named routes for your Vapor app, both on Swift and on Javascript!"></a></p>
<p>Continuing my exploration of server-side Swift, I've built a small library that lets you name your <a href="https://vapor.codes">Vapor</a> routes, providing a nicer way to generate URLs. I also managed to make it compatible with a JS library, so you can generate URLs on your frontend as well!</p>]]></description>
            <link>https://miguel.build/b/named-routes-for-server-side-swift</link>
            <guid isPermaLink="true">https://miguel.build/b/named-routes-for-server-side-swift</guid>
            <pubDate>Fri, 24 May 2024 14:07:05 GMT</pubDate>
            <source:markdown>[![GitHub - m1guelpf/ziggy-vapor: Named routes for your Vapor app, both on Swift and on Javascript!](https://repository-images.githubusercontent.com/805194581/dda8e498-ea99-4b71-b2b3-68a8f038dd64)](https://github.com/m1guelpf/ziggy-vapor)

Continuing my exploration of server-side Swift, I&apos;ve built a small library that lets you name your [Vapor](https://vapor.codes) routes, providing a nicer way to generate URLs. I also managed to make it compatible with a JS library, so you can generate URLs on your frontend as well!</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Massively simplifying AWS Nitro Enclaves]]></title>
            <description><![CDATA[<p><a href="https://github.com/worldcoin/pontifex"><img src="https://opengraph.githubassets.com/23fa088923884c12ef34d6fd445bfa61017d51026135b185dff97fd1fde7da94/worldcoin/pontifex" alt="GitHub - worldcoin/pontifex: Rust library for building and interacting with AWS Nitro enclaves."></a></p>
<p>We've been exploring TEEs at work recently, and while it's really cool you can run any Rust code in them, the experience is full of rough edges.</p>
<p>After figuring out the best way to do a bunch of essential things, I decided to compile them all into an open-source crate that others can take advantage of.</p>]]></description>
            <link>https://miguel.build/b/massively-simplifying-aws-nitro-enclaves</link>
            <guid isPermaLink="true">https://miguel.build/b/massively-simplifying-aws-nitro-enclaves</guid>
            <pubDate>Fri, 25 Apr 2025 18:29:02 GMT</pubDate>
            <source:markdown>[![GitHub - worldcoin/pontifex: Rust library for building and interacting with AWS Nitro enclaves.](https://opengraph.githubassets.com/23fa088923884c12ef34d6fd445bfa61017d51026135b185dff97fd1fde7da94/worldcoin/pontifex)](https://github.com/worldcoin/pontifex)

We&apos;ve been exploring TEEs at work recently, and while it&apos;s really cool you can run any Rust code in them, the experience is full of rough edges.

After figuring out the best way to do a bunch of essential things, I decided to compile them all into an open-source crate that others can take advantage of.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Onchain human verification for Lens]]></title>
            <description><![CDATA[<p><a href="https://github.com/worldcoin/world-id-lens"><img src="https://opengraph.githubassets.com/e6067c83b51bf938cd85173a2da0ea4546d72e5849740203efb1b74eebca5efc/worldcoin/world-id-lens" alt="GitHub - worldcoin/world-id-lens: ARCHIVED. Human verification for Lens Protocol with World ID."></a></p>
<p>Lens Protocol imagines a new era of decentralized social networks. To solve the issue of verification, they could use World ID and have verification be a simple on-chain transaction. Of course, I built the smart contracts to make this possible.</p>]]></description>
            <link>https://miguel.build/b/onchain-human-verification-for-lens</link>
            <guid isPermaLink="true">https://miguel.build/b/onchain-human-verification-for-lens</guid>
            <pubDate>Wed, 18 May 2022 20:15:13 GMT</pubDate>
            <source:markdown>[![GitHub - worldcoin/world-id-lens: ARCHIVED. Human verification for Lens Protocol with World ID.](https://opengraph.githubassets.com/e6067c83b51bf938cd85173a2da0ea4546d72e5849740203efb1b74eebca5efc/worldcoin/world-id-lens)](https://github.com/worldcoin/world-id-lens)

Lens Protocol imagines a new era of decentralized social networks. To solve the issue of verification, they could use World ID and have verification be a simple on-chain transaction. Of course, I built the smart contracts to make this possible.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Taking back my feed]]></title>
            <description><![CDATA[<p><a href="https://mute.guru"><img src="https://mute.guru/_next/static/media/card.f8cbe20d.jpg" alt="Take back your feed | mute.guru"></a></p>
<p>I recently noticed my feed had been surfacing way too many threadooors, so I built a one-click mute button for all these people recycling the same templates to get engagement.</p>]]></description>
            <link>https://miguel.build/b/taking-back-my-feed</link>
            <guid isPermaLink="true">https://miguel.build/b/taking-back-my-feed</guid>
            <pubDate>Thu, 01 Sep 2022 16:06:32 GMT</pubDate>
            <source:markdown>[![Take back your feed | mute.guru](https://mute.guru/_next/static/media/card.f8cbe20d.jpg)](https://mute.guru)

I recently noticed my feed had been surfacing way too many threadooors, so I built a one-click mute button for all these people recycling the same templates to get engagement.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[A deep-dive into the Orb's source]]></title>
            <description><![CDATA[<p><a href="https://www.youtube.com/watch?v=h6AjLyj6ics"><img src="https://i.ytimg.com/vi/h6AjLyj6ics/maxresdefault.jpg" alt="Worldcoin Orb codebase walkthrough"></a></p>
<p>Worldcoin recently open-sourced the Rust codebase that powers the Orb. To make contributing and browsing through the code easier, I sat down with some of the core contributors for an "improvised interview" of sorts, where they walked me through the overall structure.</p>
<p><a href="https://worldcoin.org/blog/engineering/worldcoin-foundation-open-sources-core-components-orb-software">Read the announcement</a></p>]]></description>
            <link>https://miguel.build/b/a-deep-dive-into-the-orbs-source</link>
            <guid isPermaLink="true">https://miguel.build/b/a-deep-dive-into-the-orbs-source</guid>
            <pubDate>Fri, 22 Mar 2024 13:06:57 GMT</pubDate>
            <source:markdown>[![Worldcoin Orb codebase walkthrough](https://i.ytimg.com/vi/h6AjLyj6ics/maxresdefault.jpg)](https://www.youtube.com/watch?v=h6AjLyj6ics)

Worldcoin recently open-sourced the Rust codebase that powers the Orb. To make contributing and browsing through the code easier, I sat down with some of the core contributors for an &quot;improvised interview&quot; of sorts, where they walked me through the overall structure.

[Read the announcement](https://worldcoin.org/blog/engineering/worldcoin-foundation-open-sources-core-components-orb-software)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Breaking on-chain captchas]]></title>
            <description><![CDATA[<p><a href="https://algoz-breaker.vercel.app"><img src="https://algoz-breaker.vercel.app/_next/static/media/cover.57043593.jpg" alt="Auto-solving Algoz.xyz&#x27;s on-chain captchas"></a></p>
<p>Came across Algoz on my timeline today, and upon looking deeper into it something caught my attention. I tried running their captchas through OCR and, after a bunch of image pre-processing, built a solver.</p>]]></description>
            <link>https://miguel.build/b/breaking-on-chain-captchas</link>
            <guid isPermaLink="true">https://miguel.build/b/breaking-on-chain-captchas</guid>
            <pubDate>Thu, 19 May 2022 03:54:30 GMT</pubDate>
            <source:markdown>[![Auto-solving Algoz.xyz&apos;s on-chain captchas](https://algoz-breaker.vercel.app/_next/static/media/cover.57043593.jpg)](https://algoz-breaker.vercel.app)

Came across Algoz on my timeline today, and upon looking deeper into it something caught my attention. I tried running their captchas through OCR and, after a bunch of image pre-processing, built a solver.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[A mature content filter using Stable Diffusion]]></title>
            <description><![CDATA[<p><a href="https://nsfw.m1guelpf.me"><img src="https://nsfw.m1guelpf.me/_next/static/media/cover.a8227bb9.jpg" alt="Is This Image NSFW?"></a></p>
<p>The Stable Diffusion safety filter has always been a mystery to me. It's not documented anywhere, and overall pretty accurate. I recently came across a paper by a group of researchers that had the same questions I did. They managed to reverse-engineer not only the logic but also the types of content the filter tries to match. Turns out, it's much simpler than expected!</p>
<p>Stable Diffusion already has a way of figuring out which concepts an image is closest to (this is a core part of generating images), using OpenAI's CLIP model. So you can use it to measure how close the generated image is to a list of "sensitive" concepts.</p>
<p>I modified the example code proposed in the paper (repo below), and deployed it to Replicate. The result: an API that can check images for adult content in less than half a second, for ~$0.00022/image.</p>
<p><a href="https://github.com/m1guelpf/cog-nsfw-filter">View the code</a></p>]]></description>
            <link>https://miguel.build/b/a-mature-content-filter-using-stable-diffusion</link>
            <guid isPermaLink="true">https://miguel.build/b/a-mature-content-filter-using-stable-diffusion</guid>
            <pubDate>Tue, 17 Jan 2023 05:00:07 GMT</pubDate>
            <source:markdown>[![Is This Image NSFW?](https://nsfw.m1guelpf.me/_next/static/media/cover.a8227bb9.jpg)](https://nsfw.m1guelpf.me)

The Stable Diffusion safety filter has always been a mystery to me. It&apos;s not documented anywhere, and overall pretty accurate. I recently came across a paper by a group of researchers that had the same questions I did. They managed to reverse-engineer not only the logic but also the types of content the filter tries to match. Turns out, it&apos;s much simpler than expected!

Stable Diffusion already has a way of figuring out which concepts an image is closest to (this is a core part of generating images), using OpenAI&apos;s CLIP model. So you can use it to measure how close the generated image is to a list of &quot;sensitive&quot; concepts.

I modified the example code proposed in the paper (repo below), and deployed it to Replicate. The result: an API that can check images for adult content in less than half a second, for ~$0.00022/image.

[View the code](https://github.com/m1guelpf/cog-nsfw-filter)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Soulbound NFT creator]]></title>
            <description><![CDATA[<p><a href="https://soulminter.m1guelpf.me"><img src="https://soulminter.m1guelpf.me/_next/static/media/cover.d07d12e0.jpg" alt="Soulminter"></a></p>
<p>Souldbound NFTs have been gaining more and more popularity lately. So I built a site where anyone can create one with just a few clicks, on mainnet, Polygon and Optimism!</p>]]></description>
            <link>https://miguel.build/b/soulbound-nft-creator</link>
            <guid isPermaLink="true">https://miguel.build/b/soulbound-nft-creator</guid>
            <pubDate>Thu, 12 May 2022 17:33:01 GMT</pubDate>
            <source:markdown>[![Soulminter](https://soulminter.m1guelpf.me/_next/static/media/cover.d07d12e0.jpg)](https://soulminter.m1guelpf.me)

Souldbound NFTs have been gaining more and more popularity lately. So I built a site where anyone can create one with just a few clicks, on mainnet, Polygon and Optimism!</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Hotlinking for Decentralized Social]]></title>
            <description><![CDATA[<p><a href="https://open.withlens.app"><img src="https://open.withlens.app/_next/static/media/card.d0694d9d.jpg" alt="Lens links that open with your preferred frontend"></a></p>
<p>Lens Protocol is one of the first decentralized social networks, meaning there's not a single place to link users to. I built a little tool that lets users chose their preferred Lens frontend, and redirects all links to it.</p>]]></description>
            <link>https://miguel.build/b/hotlinking-for-decentralized-social</link>
            <guid isPermaLink="true">https://miguel.build/b/hotlinking-for-decentralized-social</guid>
            <pubDate>Tue, 31 May 2022 21:28:36 GMT</pubDate>
            <source:markdown>[![Lens links that open with your preferred frontend](https://open.withlens.app/_next/static/media/card.d0694d9d.jpg)](https://open.withlens.app)

Lens Protocol is one of the first decentralized social networks, meaning there&apos;s not a single place to link users to. I built a little tool that lets users chose their preferred Lens frontend, and redirects all links to it.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[A WalletConnect iOS Bridge]]></title>
            <description><![CDATA[<p><a href="https://app.airport.community/app/recK081nDp6EcxKJr">https://app.airport.community/app/recK081nDp6EcxKJr</a></p>
<p>Made a little iOS/iPadOS app that lets you use WalletConnect on sites where only MetaMask is supported.</p>
<p><a href="https://testflight.apple.com/join/A56IxCVw">Join the TestFlight</a></p>]]></description>
            <link>https://miguel.build/b/a-walletconnect-ios-bridge</link>
            <guid isPermaLink="true">https://miguel.build/b/a-walletconnect-ios-bridge</guid>
            <pubDate>Thu, 12 Aug 2021 12:24:03 GMT</pubDate>
            <source:markdown>[https://app.airport.community/app/recK081nDp6EcxKJr](https://app.airport.community/app/recK081nDp6EcxKJr)

Made a little iOS/iPadOS app that lets you use WalletConnect on sites where only MetaMask is supported.

[Join the TestFlight](https://testflight.apple.com/join/A56IxCVw)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[A new social network]]></title>
            <description><![CDATA[<p><a href="https://auralite.vercel.app"><img src="https://auralite.vercel.app/img/card.jpg" alt="Auralite: A new social network for the future - Auralite"></a></p>
<p>Auralite is a new social network built for people. It's mindful of your attention and your privacy. It's gonna be great.</p>]]></description>
            <link>https://miguel.build/b/a-new-social-network</link>
            <guid isPermaLink="true">https://miguel.build/b/a-new-social-network</guid>
            <pubDate>Wed, 24 Jun 2020 15:36:49 GMT</pubDate>
            <source:markdown>[![Auralite: A new social network for the future - Auralite](https://auralite.vercel.app/img/card.jpg)](https://auralite.vercel.app)

Auralite is a new social network built for people. It&apos;s mindful of your attention and your privacy. It&apos;s gonna be great.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[A leaderboard for Lens]]></title>
            <description><![CDATA[<p><a href="https://leaderboard.withlens.app"><img src="https://leaderboard.withlens.app/_next/static/media/card.f9f60b93.jpg" alt="Lens Leaderboard: Most followed, active, collected &#x26; shared profiles"></a></p>
<p>With every new social network, it's always interesting to keep track of the most active users and see how engagement evolves. Fortunately, Lens Protocol makes this super easy, since all the data is on-chain and indexed. So I built a little tool to look over the metrics.</p>]]></description>
            <link>https://miguel.build/b/a-leaderboard-for-lens</link>
            <guid isPermaLink="true">https://miguel.build/b/a-leaderboard-for-lens</guid>
            <pubDate>Mon, 23 May 2022 17:19:18 GMT</pubDate>
            <source:markdown>[![Lens Leaderboard: Most followed, active, collected &amp; shared profiles](https://leaderboard.withlens.app/_next/static/media/card.f9f60b93.jpg)](https://leaderboard.withlens.app)

With every new social network, it&apos;s always interesting to keep track of the most active users and see how engagement evolves. Fortunately, Lens Protocol makes this super easy, since all the data is on-chain and indexed. So I built a little tool to look over the metrics.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Embeds for Lens Protocol]]></title>
            <description><![CDATA[<p><a href="https://embed.withlens.app"><img src="https://embed.withlens.app/_next/static/media/card.763216ec.jpg" alt="Easily embed Lens posts anywhere"></a></p>
<p>One of the coolest things about Lens Protocol is that you truly own your data, and can bring it anywhere you go. To help with this, I built a quick embed component for posts, comments &#x26; mirrors.</p>]]></description>
            <link>https://miguel.build/b/embeds-for-lens-protocol</link>
            <guid isPermaLink="true">https://miguel.build/b/embeds-for-lens-protocol</guid>
            <pubDate>Sun, 29 May 2022 02:25:30 GMT</pubDate>
            <source:markdown>[![Easily embed Lens posts anywhere](https://embed.withlens.app/_next/static/media/card.763216ec.jpg)](https://embed.withlens.app)

One of the coolest things about Lens Protocol is that you truly own your data, and can bring it anywhere you go. To help with this, I built a quick embed component for posts, comments &amp; mirrors.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[A digital pet on the blockchain]]></title>
            <description><![CDATA[<p><a href="https://onchain.pet"><img src="https://onchain.pet/images/card.jpg" alt="A digital pet, on the blockchain"></a></p>
<p>🚀 Inspired by Dom Hofmann's WAGMIGOTCHI experiment, I built a $PET NFT for you to adopt and take care of. This was my first (serious) Solidity project, and also managed to make a pretty sick fully gassless interface. Almost doesn't feel like web3!</p>]]></description>
            <link>https://miguel.build/b/a-digital-pet-on-the-blockchain</link>
            <guid isPermaLink="true">https://miguel.build/b/a-digital-pet-on-the-blockchain</guid>
            <pubDate>Sat, 11 Sep 2021 06:14:09 GMT</pubDate>
            <source:markdown>[![A digital pet, on the blockchain](https://onchain.pet/images/card.jpg)](https://onchain.pet)

🚀 Inspired by Dom Hofmann&apos;s WAGMIGOTCHI experiment, I built a $PET NFT for you to adopt and take care of. This was my first (serious) Solidity project, and also managed to make a pretty sick fully gassless interface. Almost doesn&apos;t feel like web3!</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Launching Sitesauce]]></title>
            <description><![CDATA[<p><a href="https://sitesauce.app"><img src="https://brand-assets.sitesauce.app/twitter-card.png" alt="A static site for your dynamically-generated website"></a></p>
<p>Generate static sites from any backend in one click, and keep them updated. I've been working on it for almost a year now, and I'm super excited to finally share it!</p>]]></description>
            <link>https://miguel.build/b/launching-sitesauce</link>
            <guid isPermaLink="true">https://miguel.build/b/launching-sitesauce</guid>
            <pubDate>Fri, 01 May 2020 09:04:39 GMT</pubDate>
            <source:markdown>[![A static site for your dynamically-generated website](https://brand-assets.sitesauce.app/twitter-card.png)](https://sitesauce.app)

Generate static sites from any backend in one click, and keep them updated. I&apos;ve been working on it for almost a year now, and I&apos;m super excited to finally share it!</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[A super-simple URL shortener]]></title>
            <description><![CDATA[<p><a href="https://microl.ink/">https://microl.ink/</a></p>
<p>After my previous shortener went offline, I decided to build a very simple alternative. No tracking or stats or anything crazy, just Vercel redirects.</p>]]></description>
            <link>https://miguel.build/b/a-super-simple-url-shortener</link>
            <guid isPermaLink="true">https://miguel.build/b/a-super-simple-url-shortener</guid>
            <pubDate>Tue, 15 Sep 2020 01:55:50 GMT</pubDate>
            <source:markdown>[https://microl.ink/](https://microl.ink/)

After my previous shortener went offline, I decided to build a very simple alternative. No tracking or stats or anything crazy, just Vercel redirects.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[A lil website to show some of my favourite clothes]]></title>
            <description><![CDATA[<p><a href="https://miguel.clothing"><img src="https://miguel.clothing/og.jpg" alt="Miguel&#x27;s Wardrobe"></a></p>
<p>One of my goals for last year was to develop a better sense of personal style and wardrobe. I'm very happy with where I ended up, and after seeing miguel dot clothing was available, I couldn't help it but build a lil site to highlight some of my favourite pieces!</p>]]></description>
            <link>https://miguel.build/b/a-lil-website-to-show-some-of-my-favourite-clothes</link>
            <guid isPermaLink="true">https://miguel.build/b/a-lil-website-to-show-some-of-my-favourite-clothes</guid>
            <pubDate>Sat, 03 Jan 2026 19:40:22 GMT</pubDate>
            <source:markdown>[![Miguel&apos;s Wardrobe](https://miguel.clothing/og.jpg)](https://miguel.clothing)

One of my goals for last year was to develop a better sense of personal style and wardrobe. I&apos;m very happy with where I ended up, and after seeing miguel dot clothing was available, I couldn&apos;t help it but build a lil site to highlight some of my favourite pieces!</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[A simple page about me]]></title>
            <description><![CDATA[<p><a href="/cv"><img src="https://miguel.build/images/_site/cv-card.jpg" alt="Miguel Piedrafita"></a></p>
<p>Added a new page to my site, inspired by Jack Butcher's CCV Google Docs. Will probably update it once I have a better idea of how to define myself, super happy with how clear the format feels tho.</p>
<p><a href="https://twitter.com/jackbutcher/status/1551588118947631111">See the inspiration</a></p>]]></description>
            <link>https://miguel.build/b/a-simple-page-about-me</link>
            <guid isPermaLink="true">https://miguel.build/b/a-simple-page-about-me</guid>
            <pubDate>Tue, 26 Jul 2022 02:41:56 GMT</pubDate>
            <source:markdown>[![Miguel Piedrafita](https://miguel.build/images/_site/cv-card.jpg)](/cv)

Added a new page to my site, inspired by Jack Butcher&apos;s CCV Google Docs. Will probably update it once I have a better idea of how to define myself, super happy with how clear the format feels tho.

[See the inspiration](https://twitter.com/jackbutcher/status/1551588118947631111)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[A cute raffle website for rAAVE Bogotá]]></title>
            <description><![CDATA[<p><a href="https://raave-raffle-app.vercel.app"><img src="https://raave-raffle-app.vercel.app/_next/static/media/cover.e48f6166.jpg" alt="We&#x27;re giving away 5 rAAVE Bogotá tickets!"></a></p>
<p>While at Devcon Bogotá, Worldcoin decided to last-minute partner with Lens Protocol to raffle some rAAVE tickets. I got tasked with building both the onchain contract and the interface for it, and it turned out pretty cute!</p>]]></description>
            <link>https://miguel.build/b/a-cute-raffle-website-for-raave-bogot</link>
            <guid isPermaLink="true">https://miguel.build/b/a-cute-raffle-website-for-raave-bogot</guid>
            <pubDate>Tue, 11 Oct 2022 18:33:19 GMT</pubDate>
            <source:markdown>[![We&apos;re giving away 5 rAAVE Bogotá tickets!](https://raave-raffle-app.vercel.app/_next/static/media/cover.e48f6166.jpg)](https://raave-raffle-app.vercel.app)

While at Devcon Bogotá, Worldcoin decided to last-minute partner with Lens Protocol to raffle some rAAVE tickets. I got tasked with building both the onchain contract and the interface for it, and it turned out pretty cute!</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[An infinite canvas built for brainstorming.]]></title>
            <description><![CDATA[<p><a href="https://thought.surf"><img src="https://thought.surf/_next/static/media/cover.a5b30b14.jpg" alt="thought.surf"></a></p>
<p>For a long time I wondered how you would even go about building something like Figma on the web.</p>
<p>To dive deeper into canvas apps, I've been working on a collaborative place to brainstorm with friends, where you can drop and organize all kinds of content and embeds, with built in collaboration. It's a big work in progress, but it works!</p>
<p><a href="https://github.com/m1guelpf/thought.surf">View on GitHub</a></p>]]></description>
            <link>https://miguel.build/b/an-infinite-canvas-built-for-brainstorming</link>
            <guid isPermaLink="true">https://miguel.build/b/an-infinite-canvas-built-for-brainstorming</guid>
            <pubDate>Wed, 12 Oct 2022 15:33:19 GMT</pubDate>
            <source:markdown>[![thought.surf](https://thought.surf/_next/static/media/cover.a5b30b14.jpg)](https://thought.surf)

For a long time I wondered how you would even go about building something like Figma on the web.

To dive deeper into canvas apps, I&apos;ve been working on a collaborative place to brainstorm with friends, where you can drop and organize all kinds of content and embeds, with built in collaboration. It&apos;s a big work in progress, but it works!

[View on GitHub](https://github.com/m1guelpf/thought.surf)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Content-gated links for your Lens followers]]></title>
            <description><![CDATA[<p><a href="https://garden.withlens.app"><img src="https://garden.withlens.app/_next/static/media/card.f21bc334.jpg" alt="Gated Garden: Links only your Lens followers can access"></a></p>
<p>Built a little app that let you share links only people who follow you on Lens Protocol can access. Makes for a very simple "pay to access" portal when coupled with Lens' superfollows feature.</p>]]></description>
            <link>https://miguel.build/b/content-gated-links-for-your-lens-followers</link>
            <guid isPermaLink="true">https://miguel.build/b/content-gated-links-for-your-lens-followers</guid>
            <pubDate>Sun, 05 Jun 2022 02:17:26 GMT</pubDate>
            <source:markdown>[![Gated Garden: Links only your Lens followers can access](https://garden.withlens.app/_next/static/media/card.f21bc334.jpg)](https://garden.withlens.app)

Built a little app that let you share links only people who follow you on Lens Protocol can access. Makes for a very simple &quot;pay to access&quot; portal when coupled with Lens&apos; superfollows feature.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Announcing World ID]]></title>
            <description><![CDATA[<p><a href="https://worldcoin.org/blog/announcements/introducing-world-id-and-sdk"><img src="https://images.prismic.io/worldcoin-company-website/aTgueHNYClf9n-Q-_introducing-world-id-and-sdk.gif?auto=format%2Ccompress&#x26;rect=0%2C0%2C1800%2C945&#x26;w=2400&#x26;h=1260?v=1" alt="Introducing World ID and SDK"></a></p>
<p>Today we're launching World ID. Sybil resistance is proving to be more important than I ever thought, and this is a foolproof solution, working on and off-chain that you can integrate in minutes.</p>
<p>We've been working to make World ID not only the most robust on-chain option, but also incredibly easy to integrate outside of crypto. For example, "Sign in with Worldcoin" allows regular web apps to become sybil-resistance in the same effort it takes to "Sign in with Google" ⚡</p>
<p>That means, if you're building "regular" apps with Next.js, Laravel, or anything else, you can integrate World ID in just a few lines of code. Actually, thanks to services like Auth0, you don't need code at all! Just add Worldcoin from the dashboard and you're good to go 😁</p>
<p>If you haven't gotten orb'd yet (or don't want to), we're also adding a phone signal to the app, which allows you to anonymously prove you have a valid phone number and a unique device, a weaker version of sybil-resistance but still much better than nothing.</p>]]></description>
            <link>https://miguel.build/b/announcing-world-id</link>
            <guid isPermaLink="true">https://miguel.build/b/announcing-world-id</guid>
            <pubDate>Tue, 14 Mar 2023 09:41:59 GMT</pubDate>
            <source:markdown>[![Introducing World ID and SDK](https://images.prismic.io/worldcoin-company-website/aTgueHNYClf9n-Q-_introducing-world-id-and-sdk.gif?auto=format%2Ccompress&amp;rect=0%2C0%2C1800%2C945&amp;w=2400&amp;h=1260?v=1)](https://worldcoin.org/blog/announcements/introducing-world-id-and-sdk)

Today we&apos;re launching World ID. Sybil resistance is proving to be more important than I ever thought, and this is a foolproof solution, working on and off-chain that you can integrate in minutes.

We&apos;ve been working to make World ID not only the most robust on-chain option, but also incredibly easy to integrate outside of crypto. For example, &quot;Sign in with Worldcoin&quot; allows regular web apps to become sybil-resistance in the same effort it takes to &quot;Sign in with Google&quot; ⚡

That means, if you&apos;re building &quot;regular&quot; apps with Next.js, Laravel, or anything else, you can integrate World ID in just a few lines of code. Actually, thanks to services like Auth0, you don&apos;t need code at all! Just add Worldcoin from the dashboard and you&apos;re good to go 😁

If you haven&apos;t gotten orb&apos;d yet (or don&apos;t want to), we&apos;re also adding a phone signal to the app, which allows you to anonymously prove you have a valid phone number and a unique device, a weaker version of sybil-resistance but still much better than nothing.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Human Colossus interview]]></title>
            <description><![CDATA[<p><a href="https://www.youtube.com/watch?v=345OLOy1tBk"><img src="https://i.ytimg.com/vi/345OLOy1tBk/maxresdefault.jpg" alt="Miguel Piedrafita // ConstitutionDAO, Learning by Debugging, Crypto"></a></p>
<p>Got interviewed by a friend for the Human Colossus project, and it turned out into a pretty nice video! We covered "learning by debugging", my builder journey, and ConstitutionDAO.</p>]]></description>
            <link>https://miguel.build/b/human-colossus-interview</link>
            <guid isPermaLink="true">https://miguel.build/b/human-colossus-interview</guid>
            <pubDate>Tue, 04 Oct 2022 14:26:06 GMT</pubDate>
            <source:markdown>[![Miguel Piedrafita // ConstitutionDAO, Learning by Debugging, Crypto](https://i.ytimg.com/vi/345OLOy1tBk/maxresdefault.jpg)](https://www.youtube.com/watch?v=345OLOy1tBk)

Got interviewed by a friend for the Human Colossus project, and it turned out into a pretty nice video! We covered &quot;learning by debugging&quot;, my builder journey, and ConstitutionDAO.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Reverse-engineering Instagram's new app]]></title>
            <description><![CDATA[<p><a href="https://github.com/m1guelpf/threads-api"><img src="https://opengraph.githubassets.com/74d5296ffb924a67b43ee77f00893b8d12e368454ae753a9ea52fe0101de87f7/m1guelpf/threads-api" alt="GitHub - m1guelpf/threads-api: Reverse-engineered Rust client for Instagram&#x27;s Threads app."></a></p>
<p>Threads (Insta's microblogging app) launched today... everywhere but Europe. After getting my hands on an emulator, I started mapping out their internal API to build a client I can actually use.</p>
<p>It's still a big work in progress ofc, but it can already do most of the available read-only actions. More on this soon!</p>]]></description>
            <link>https://miguel.build/b/reverse-engineering-instagrams-new-app</link>
            <guid isPermaLink="true">https://miguel.build/b/reverse-engineering-instagrams-new-app</guid>
            <pubDate>Thu, 06 Jul 2023 17:41:57 GMT</pubDate>
            <source:markdown>[![GitHub - m1guelpf/threads-api: Reverse-engineered Rust client for Instagram&apos;s Threads app.](https://opengraph.githubassets.com/74d5296ffb924a67b43ee77f00893b8d12e368454ae753a9ea52fe0101de87f7/m1guelpf/threads-api)](https://github.com/m1guelpf/threads-api)

Threads (Insta&apos;s microblogging app) launched today... everywhere but Europe. After getting my hands on an emulator, I started mapping out their internal API to build a client I can actually use.

It&apos;s still a big work in progress ofc, but it can already do most of the available read-only actions. More on this soon!</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[A native app for Overseerr]]></title>
            <description><![CDATA[<p><a href="https://apps.apple.com/app/pocket-for-seerr/id6746105104"><img src="https://is1-ssl.mzstatic.com/image/thumb/PurpleSource221/v4/13/93/00/1393004a-668a-4209-010d-6a3d7a40cc0e/Placeholder.mill/1200x630wa.jpg" alt="Pocket for Seerr App - App Store"></a></p>
<p>For the last few months, I've been working on an iOS app for Overseerr, an open-source project that helps you maintain a self-hosted media server.</p>
<p>This has been my first "real" app to make, completely by myself, start to finish, and I'm incredibly proud of how it turned out. If you use Overseerr, give it a try!</p>
<p><a href="https://apps.apple.com/app/pocket-for-seerr/id6746105104">View on the App Store</a></p>]]></description>
            <link>https://miguel.build/b/a-native-app-for-overseerr</link>
            <guid isPermaLink="true">https://miguel.build/b/a-native-app-for-overseerr</guid>
            <pubDate>Fri, 28 Nov 2025 14:42:04 GMT</pubDate>
            <source:markdown>[![Pocket for Seerr App - App Store](https://is1-ssl.mzstatic.com/image/thumb/PurpleSource221/v4/13/93/00/1393004a-668a-4209-010d-6a3d7a40cc0e/Placeholder.mill/1200x630wa.jpg)](https://apps.apple.com/app/pocket-for-seerr/id6746105104)

For the last few months, I&apos;ve been working on an iOS app for Overseerr, an open-source project that helps you maintain a self-hosted media server.

This has been my first &quot;real&quot; app to make, completely by myself, start to finish, and I&apos;m incredibly proud of how it turned out. If you use Overseerr, give it a try!

[View on the App Store](https://apps.apple.com/app/pocket-for-seerr/id6746105104)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Selling access to GitHub repos]]></title>
            <description><![CDATA[<p><a href="https://gumhub.m1guelpf.me"><img src="https://public-files.gumroad.com/s6oz7oknbxhmprr001i3qrvdqqtc" alt="Sell access to your GitHub repos with Gumroad"></a></p>
<p>After seeing a few people sponsor-lock their repos, I thought I'd build a one-time payment version. GumHub uses Gumroad and Vercel to easily sell access to your GitHub repos.</p>]]></description>
            <link>https://miguel.build/b/selling-access-to-github-repos</link>
            <guid isPermaLink="true">https://miguel.build/b/selling-access-to-github-repos</guid>
            <pubDate>Fri, 16 Oct 2020 12:58:42 GMT</pubDate>
            <source:markdown>[![Sell access to your GitHub repos with Gumroad](https://public-files.gumroad.com/s6oz7oknbxhmprr001i3qrvdqqtc)](https://gumhub.m1guelpf.me)

After seeing a few people sponsor-lock their repos, I thought I&apos;d build a one-time payment version. GumHub uses Gumroad and Vercel to easily sell access to your GitHub repos.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Nouns text-to-image dataset]]></title>
            <description><![CDATA[<p><a href="https://github.com/m1guelpf/nouns-dataset"><img src="https://opengraph.githubassets.com/90723770fda72dc95e12aeda6e253ab3c9a77aa10aef47017d8441d0c5a7043c/m1guelpf/nouns-dataset" alt="GitHub - m1guelpf/nouns-dataset: A HuggingFace text-to-image dataset for Nouns"></a></p>
<p>Built a NounsDAO text-to-image dataset as an experiment, which could be used to fine-tune Stable Diffusion. It works by generating a bunch of random nouns (using 50k at the moment) then writing automated descriptions based on their attributes.</p>
<p><a href="https://huggingface.co/datasets/m1guelpf/nouns">View on HuggingFace</a></p>]]></description>
            <link>https://miguel.build/b/nouns-text-to-image-dataset</link>
            <guid isPermaLink="true">https://miguel.build/b/nouns-text-to-image-dataset</guid>
            <pubDate>Sun, 25 Sep 2022 06:44:25 GMT</pubDate>
            <source:markdown>[![GitHub - m1guelpf/nouns-dataset: A HuggingFace text-to-image dataset for Nouns](https://opengraph.githubassets.com/90723770fda72dc95e12aeda6e253ab3c9a77aa10aef47017d8441d0c5a7043c/m1guelpf/nouns-dataset)](https://github.com/m1guelpf/nouns-dataset)

Built a NounsDAO text-to-image dataset as an experiment, which could be used to fine-tune Stable Diffusion. It works by generating a bunch of random nouns (using 50k at the moment) then writing automated descriptions based on their attributes.

[View on HuggingFace](https://huggingface.co/datasets/m1guelpf/nouns)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[A simple ERC721 drop contract]]></title>
            <description><![CDATA[<p><a href="https://github.com/m1guelpf/erc721-drop"><img src="https://opengraph.githubassets.com/2bddd52df2e25083258bd464c783b97b9633540d7636ea8e8a5024d657df1399/m1guelpf/erc721-drop" alt="GitHub - m1guelpf/erc721-drop: A simple ERC721 drop implementation, using Forge and Solmate."></a></p>
<p>Decided to take Foundry for a spin and built a small NFT drop template. It exposes a simple <code>mint()</code> function with constants for max supply/price, and uses Solmate for gas savings.</p>]]></description>
            <link>https://miguel.build/b/a-simple-erc721-drop-contract</link>
            <guid isPermaLink="true">https://miguel.build/b/a-simple-erc721-drop-contract</guid>
            <pubDate>Thu, 30 Dec 2021 01:19:41 GMT</pubDate>
            <source:markdown>[![GitHub - m1guelpf/erc721-drop: A simple ERC721 drop implementation, using Forge and Solmate.](https://opengraph.githubassets.com/2bddd52df2e25083258bd464c783b97b9633540d7636ea8e8a5024d657df1399/m1guelpf/erc721-drop)](https://github.com/m1guelpf/erc721-drop)

Decided to take Foundry for a spin and built a small NFT drop template. It exposes a simple `mint()` function with constants for max supply/price, and uses Solmate for gas savings.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Universal airdrop contract]]></title>
            <description><![CDATA[<p><a href="https://github.com/worldcoin/hyperdrop-contracts"><img src="https://opengraph.githubassets.com/6e1a052d0c3c07795cdee9b3ae9c831df4de16725ef2e78b8523d6bca9ec65aa/worldcoin/hyperdrop-contracts" alt="GitHub - worldcoin/hyperdrop-contracts: A contract that splits any token it receives between all humans"></a></p>
<p>Small project I built during the Worldcoin retreat: a contract anyone can send tokens to, that allows humans to register a wallet and claim their share of them. Most efficient way to airdrop tokens to everyone in the world!</p>]]></description>
            <link>https://miguel.build/b/universal-airdrop-contract</link>
            <guid isPermaLink="true">https://miguel.build/b/universal-airdrop-contract</guid>
            <pubDate>Sat, 14 May 2022 01:17:49 GMT</pubDate>
            <source:markdown>[![GitHub - worldcoin/hyperdrop-contracts: A contract that splits any token it receives between all humans](https://opengraph.githubassets.com/6e1a052d0c3c07795cdee9b3ae9c831df4de16725ef2e78b8523d6bca9ec65aa/worldcoin/hyperdrop-contracts)](https://github.com/worldcoin/hyperdrop-contracts)

Small project I built during the Worldcoin retreat: a contract anyone can send tokens to, that allows humans to register a wallet and claim their share of them. Most efficient way to airdrop tokens to everyone in the world!</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Worldcoin is out]]></title>
            <description><![CDATA[<p><a href="https://worldcoin.org/home"><img src="https://images.prismic.io/worldcoin-company-website/aV58k3NYClf9o3Py_General.png?auto=format%2Ccompress&#x26;w=2400&#x26;h=1260" alt="World - The real human network."></a></p>
<p>After almost four years of development, Worldcoin has finally launched! I've spent the last year building World ID, a fully anonymous sybil-resistance solution powered by biometrics, and now it's time to decentralize it. <a href="https://worldcoin.org/download">Download the World App</a>, find your nearest orb, and join the network!</p>]]></description>
            <link>https://miguel.build/b/worldcoin-is-out</link>
            <guid isPermaLink="true">https://miguel.build/b/worldcoin-is-out</guid>
            <pubDate>Mon, 24 Jul 2023 13:25:04 GMT</pubDate>
            <source:markdown>[![World - The real human network.](https://images.prismic.io/worldcoin-company-website/aV58k3NYClf9o3Py_General.png?auto=format%2Ccompress&amp;w=2400&amp;h=1260)](https://worldcoin.org/home)

After almost four years of development, Worldcoin has finally launched! I&apos;ve spent the last year building World ID, a fully anonymous sybil-resistance solution powered by biometrics, and now it&apos;s time to decentralize it. [Download the World App](https://worldcoin.org/download), find your nearest orb, and join the network!</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Playwright for Swift]]></title>
            <description><![CDATA[<p><a href="https://github.com/m1guelpf/swift-playwright"><img src="https://opengraph.githubassets.com/d6b688864a47c5c4bd9b881d0aa7cdaa72cd3a5472e2295885341e72f1457621/m1guelpf/swift-playwright" alt="GitHub - m1guelpf/swift-playwright: Playwright for Swift is a browser automation library to control Chromium, Firefox and WebKit with a single API."></a></p>
<p>I've been working on a personal data dashboard, joining together tons of data sources to get a full picture of my life. One of the sources I wanted was my YouTube Watch Later, which you can't retrieve from the API.</p>
<p>I have <a href="#rust-containers-for-machine-learning">gone to extreme lenghts</a> in the past to avoid using Python, and this time was no different. After a week of intense rewriting, you can now use Playwright from Swift :D</p>]]></description>
            <link>https://miguel.build/b/playwright-for-swift</link>
            <guid isPermaLink="true">https://miguel.build/b/playwright-for-swift</guid>
            <pubDate>Sat, 14 Mar 2026 02:43:57 GMT</pubDate>
            <source:markdown>[![GitHub - m1guelpf/swift-playwright: Playwright for Swift is a browser automation library to control Chromium, Firefox and WebKit with a single API.](https://opengraph.githubassets.com/d6b688864a47c5c4bd9b881d0aa7cdaa72cd3a5472e2295885341e72f1457621/m1guelpf/swift-playwright)](https://github.com/m1guelpf/swift-playwright)

I&apos;ve been working on a personal data dashboard, joining together tons of data sources to get a full picture of my life. One of the sources I wanted was my YouTube Watch Later, which you can&apos;t retrieve from the API.

I have [gone to extreme lenghts](#rust-containers-for-machine-learning) in the past to avoid using Python, and this time was no different. After a week of intense rewriting, you can now use Playwright from Swift :D</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Working with streaming JSON in Rust]]></title>
            <description><![CDATA[<p><a href="https://github.com/m1guelpf/repair-json"><img src="https://opengraph.githubassets.com/43a3fdc524adaef99744e52e3599bfa7ab3f416cd59218189dca45aa6bd89fd9/m1guelpf/repair-json" alt="GitHub - m1guelpf/repair-json: Repair incomplete JSON (e.g. from streaming APIs or AI models) so it can be parsed as it&#x27;s received."></a></p>
<p>LLMs have gotten pretty good at generating structured data recently, but unlike with text you can't use the results in real-time, since the returned JSON isn't valid until the end of the response.</p>
<p>To solve this, I built a fast JSON syntax validator of sorts, which keeps track of the current context (are we inside a string, object, key, etc.) and can revert back to the latest valid state or complete the JSON to make it parseable.</p>]]></description>
            <link>https://miguel.build/b/working-with-streaming-json-in-rust</link>
            <guid isPermaLink="true">https://miguel.build/b/working-with-streaming-json-in-rust</guid>
            <pubDate>Wed, 17 Jan 2024 12:29:22 GMT</pubDate>
            <source:markdown>[![GitHub - m1guelpf/repair-json: Repair incomplete JSON (e.g. from streaming APIs or AI models) so it can be parsed as it&apos;s received.](https://opengraph.githubassets.com/43a3fdc524adaef99744e52e3599bfa7ab3f416cd59218189dca45aa6bd89fd9/m1guelpf/repair-json)](https://github.com/m1guelpf/repair-json)

LLMs have gotten pretty good at generating structured data recently, but unlike with text you can&apos;t use the results in real-time, since the returned JSON isn&apos;t valid until the end of the response.

To solve this, I built a fast JSON syntax validator of sorts, which keeps track of the current context (are we inside a string, object, key, etc.) and can revert back to the latest valid state or complete the JSON to make it parseable.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[A Chess bot in C#]]></title>
            <description><![CDATA[<p><a href="https://github.com/m1guelpf/Chess-Challenge"><img src="https://opengraph.githubassets.com/77aa5ce8d30c3c72836d537e3b9d53ea56f73f2a046d11655ef3ba98f8a7fe32/m1guelpf/Chess-Challenge" alt="GitHub - m1guelpf/Chess-Challenge: My entry for Sebastian Lague&#x27;s C# Chess Bot Challenge"></a></p>
<p><a href="https://www.youtube.com/c/SebastianLague">Sebastian Lague</a> recently announced a chess coding challenge, where you're given a C# framework that manages the board, generates moves, etc. and you have to write a "brain" for a chess bot.</p>
<p>While I'm not particularly good at C# (and know next to nothing about building chess bots), I thought it'd be interesting to participate. Definitely not the prettiest bot in the competition, but learned a lot while building it!</p>]]></description>
            <link>https://miguel.build/b/a-chess-bot-in-c</link>
            <guid isPermaLink="true">https://miguel.build/b/a-chess-bot-in-c</guid>
            <pubDate>Sat, 29 Jul 2023 04:50:55 GMT</pubDate>
            <source:markdown>[![GitHub - m1guelpf/Chess-Challenge: My entry for Sebastian Lague&apos;s C# Chess Bot Challenge](https://opengraph.githubassets.com/77aa5ce8d30c3c72836d537e3b9d53ea56f73f2a046d11655ef3ba98f8a7fe32/m1guelpf/Chess-Challenge)](https://github.com/m1guelpf/Chess-Challenge)

[Sebastian Lague](https://www.youtube.com/c/SebastianLague) recently announced a chess coding challenge, where you&apos;re given a C#&amp;nbsp;framework that manages the board, generates moves, etc. and you have to write a &quot;brain&quot; for a chess bot.

While I&apos;m not particularly good at C# (and know next to nothing about building chess bots), I thought it&apos;d be interesting to participate. Definitely not the prettiest bot in the competition, but learned a lot while building it!</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Contributing to Laravel Echo]]></title>
            <description><![CDATA[<p><a href="https://github.com/laravel/echo/pull/242"><img src="https://opengraph.githubassets.com/bbcc97312c46505398ec7e9937ab3443e57bce515b9c2023f9b6c8b916918640/laravel/echo/pull/242" alt="[1.x] Try to get CSRF token from cookie by m1guelpf · Pull Request #242 · laravel/echo"></a></p>
<p>Just opened a PR to make Laravel Echo automatically get the CSRF token from the XSRF-TOKEN cookie Laravel adds by default. Should improve developer experience a lot!</p>]]></description>
            <link>https://miguel.build/b/contributing-to-laravel-echo</link>
            <guid isPermaLink="true">https://miguel.build/b/contributing-to-laravel-echo</guid>
            <pubDate>Fri, 06 Sep 2019 15:24:29 GMT</pubDate>
            <source:markdown>[![[1.x] Try to get CSRF token from cookie by m1guelpf · Pull Request #242 · laravel/echo](https://opengraph.githubassets.com/bbcc97312c46505398ec7e9937ab3443e57bce515b9c2023f9b6c8b916918640/laravel/echo/pull/242)](https://github.com/laravel/echo/pull/242)

Just opened a PR to make Laravel Echo automatically get the CSRF token from the XSRF-TOKEN cookie Laravel adds by default. Should improve developer experience a lot!</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[A tiny vector database in Rust]]></title>
            <description><![CDATA[<p><a href="https://github.com/m1guelpf/tinyvector"><img src="https://opengraph.githubassets.com/13ac261a3e417c00cc6e077155cafbab79918cc66dcadabb5e2b81321fea1f87/m1guelpf/tinyvector" alt="GitHub - m1guelpf/tinyvector: A tiny embedding database in pure Rust."></a></p>
<p>After seeing <a href="https://twitter.com/willdepue">my friend Will</a> build a tiny embedding database in ~500 lines of code with python, sqlite and numpy, I thought it'd be fun to try and build something similar in Rust.</p>
<p>I ended up rewriting the entire thing from scratch (dropping sqlite and numpy on the process) and storing everything on memory. After some performance optimizations, it was good enough to replace Pinecone on <a href="#contextual-search-for-podcasts">some personal projects</a>!</p>]]></description>
            <link>https://miguel.build/b/a-tiny-vector-database-in-rust</link>
            <guid isPermaLink="true">https://miguel.build/b/a-tiny-vector-database-in-rust</guid>
            <pubDate>Tue, 04 Jul 2023 06:44:27 GMT</pubDate>
            <source:markdown>[![GitHub - m1guelpf/tinyvector: A tiny embedding database in pure Rust.](https://opengraph.githubassets.com/13ac261a3e417c00cc6e077155cafbab79918cc66dcadabb5e2b81321fea1f87/m1guelpf/tinyvector)](https://github.com/m1guelpf/tinyvector)

After seeing [my friend Will](https://twitter.com/willdepue) build a tiny embedding database in ~500 lines of code with python, sqlite and numpy, I thought it&apos;d be fun to try and build something similar in Rust.

I ended up rewriting the entire thing from scratch (dropping sqlite and numpy on the process) and storing everything on memory. After some performance optimizations, it was good enough to replace Pinecone on [some personal projects](#contextual-search-for-podcasts)!</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[YouTube subtitle generator update]]></title>
            <description><![CDATA[<p><a href="https://github.com/m1guelpf/yt-whisper"><img src="https://opengraph.githubassets.com/760bba89e23c9a97f55be4e099bb9a655bd71ecb365294d5442b561096cadf66/m1guelpf/yt-whisper" alt="GitHub - m1guelpf/yt-whisper: Using OpenAI&#x27;s Whisper to automatically generate YouTube subtitles"></a></p>
<p>A while ago, I made a simple script that generated subtitle files from any YouTube URL (using OpenAI's Whisper model).</p>
<p>Since then I've added support for SRT outputs (as well as VTT), made YouTube downloads +2x faster and added line break support for nicer subtitles.</p>]]></description>
            <link>https://miguel.build/b/youtube-subtitle-generator-update</link>
            <guid isPermaLink="true">https://miguel.build/b/youtube-subtitle-generator-update</guid>
            <pubDate>Fri, 14 Oct 2022 22:39:44 GMT</pubDate>
            <source:markdown>[![GitHub - m1guelpf/yt-whisper: Using OpenAI&apos;s Whisper to automatically generate YouTube subtitles](https://opengraph.githubassets.com/760bba89e23c9a97f55be4e099bb9a655bd71ecb365294d5442b561096cadf66/m1guelpf/yt-whisper)](https://github.com/m1guelpf/yt-whisper)

A while ago, I made a simple script that generated subtitle files from any YouTube URL (using OpenAI&apos;s Whisper model).

Since then I&apos;ve added support for SRT outputs (as well as VTT), made YouTube downloads +2x faster and added line break support for nicer subtitles.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[YouTube subtitles with Whisper]]></title>
            <description><![CDATA[<p><a href="https://github.com/m1guelpf/yt-whisper"><img src="https://opengraph.githubassets.com/760bba89e23c9a97f55be4e099bb9a655bd71ecb365294d5442b561096cadf66/m1guelpf/yt-whisper" alt="GitHub - m1guelpf/yt-whisper: Using OpenAI&#x27;s Whisper to automatically generate YouTube subtitles"></a></p>
<p>Yesterday, OpenAI released Whisper, a neural net for speech recognition with insane accuracy, so I made a simple script that uses it to generate (very good) YouTube subtitles for any video, in seconds.</p>]]></description>
            <link>https://miguel.build/b/youtube-subtitles-with-whisper</link>
            <guid isPermaLink="true">https://miguel.build/b/youtube-subtitles-with-whisper</guid>
            <pubDate>Thu, 22 Sep 2022 16:35:36 GMT</pubDate>
            <source:markdown>[![GitHub - m1guelpf/yt-whisper: Using OpenAI&apos;s Whisper to automatically generate YouTube subtitles](https://opengraph.githubassets.com/760bba89e23c9a97f55be4e099bb9a655bd71ecb365294d5442b561096cadf66/m1guelpf/yt-whisper)](https://github.com/m1guelpf/yt-whisper)

Yesterday, OpenAI released Whisper, a neural net for speech recognition with insane accuracy, so I made a simple script that uses it to generate (very good) YouTube subtitles for any video, in seconds.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Rebuilding the ENS contracts]]></title>
            <description><![CDATA[<p><a href="https://github.com/m1guelpf/ens-contracts-blindrun"><img src="https://opengraph.githubassets.com/5d35ef9e51cda5a095981a5778d1c2dd8ef22c9f46dfdb7e3425c4746854cdc8/m1guelpf/ens-contracts-blindrun" alt="GitHub - m1guelpf/ens-contracts-blindrun: For Solidity practice, I tried to rebuild the base ENS contracts from the EIP-137."></a></p>
<p>As a Solidity learning exercise, I built a very basic implementation of the ENS protocol, following their EIP-137 spec (w/ Foundry and Solidity tests, ofc).</p>]]></description>
            <link>https://miguel.build/b/rebuilding-the-ens-contracts</link>
            <guid isPermaLink="true">https://miguel.build/b/rebuilding-the-ens-contracts</guid>
            <pubDate>Sun, 02 Jan 2022 20:23:57 GMT</pubDate>
            <source:markdown>[![GitHub - m1guelpf/ens-contracts-blindrun: For Solidity practice, I tried to rebuild the base ENS contracts from the EIP-137.](https://opengraph.githubassets.com/5d35ef9e51cda5a095981a5778d1c2dd8ef22c9f46dfdb7e3425c4746854cdc8/m1guelpf/ens-contracts-blindrun)](https://github.com/m1guelpf/ens-contracts-blindrun)

As a Solidity learning exercise, I built a very basic implementation of the ENS protocol, following their EIP-137 spec (w/ Foundry and Solidity tests, ofc).</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[A modern Swift SDK for OpenAI's Realtime API]]></title>
            <description><![CDATA[<p><a href="https://github.com/m1guelpf/swift-realtime-openai"><img src="https://repository-images.githubusercontent.com/866837972/3d2cce32-a711-45c1-a639-a2ef1d78a2b6" alt="GitHub - m1guelpf/swift-realtime-openai: A modern Swift SDK for OpenAI&#x27;s Realtime API"></a></p>
<p>The newly-released Realtime API from OpenAI bring almost real-time voice capabilities, and mobile apps are some of the best use cases for this new capability.</p>
<p>To make building these apps as easy as possible, I'm working on a super simple SDK for iOS, which lets you build full-fledged voice chat apps in less that 60 LoC (including the UI!).</p>]]></description>
            <link>https://miguel.build/b/a-modern-swift-sdk-for-openais-realtime-api</link>
            <guid isPermaLink="true">https://miguel.build/b/a-modern-swift-sdk-for-openais-realtime-api</guid>
            <pubDate>Thu, 03 Oct 2024 01:32:47 GMT</pubDate>
            <source:markdown>[![GitHub - m1guelpf/swift-realtime-openai: A modern Swift SDK for OpenAI&apos;s Realtime API](https://repository-images.githubusercontent.com/866837972/3d2cce32-a711-45c1-a639-a2ef1d78a2b6)](https://github.com/m1guelpf/swift-realtime-openai)

The newly-released Realtime API from OpenAI bring almost real-time voice capabilities, and mobile apps are some of the best use cases for this new capability.

To make building these apps as easy as possible, I&apos;m working on a super simple SDK for iOS, which lets you build full-fledged voice chat apps in less that 60 LoC (including the UI!).</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Sign in with Ethereum for Next.js v13 Template]]></title>
            <description><![CDATA[<p><a href="https://github.com/m1guelpf/nextjs13-connectkit-siwe"><img src="https://opengraph.githubassets.com/dc5e693ac50374f2ca80dbc6576cfbf91507ccb7a4897d5757c09dedcc010001/m1guelpf/nextjs13-connectkit-siwe" alt="GitHub - m1guelpf/nextjs13-connectkit-siwe: Using ConnectKit&#x27;s SIWE with the Next.js v13 App Router"></a></p>
<p>Wanted to use the Next.js app router for a new app that uses Sign In With Ethereum, but ConnectKit's integration only supports API routes, so I built a lil starter kit showing how to use it with app routes.</p>]]></description>
            <link>https://miguel.build/b/sign-in-with-ethereum-for-nextjs-v13-template</link>
            <guid isPermaLink="true">https://miguel.build/b/sign-in-with-ethereum-for-nextjs-v13-template</guid>
            <pubDate>Sun, 14 May 2023 09:51:25 GMT</pubDate>
            <source:markdown>[![GitHub - m1guelpf/nextjs13-connectkit-siwe: Using ConnectKit&apos;s SIWE with the Next.js v13 App Router](https://opengraph.githubassets.com/dc5e693ac50374f2ca80dbc6576cfbf91507ccb7a4897d5757c09dedcc010001/m1guelpf/nextjs13-connectkit-siwe)](https://github.com/m1guelpf/nextjs13-connectkit-siwe)

Wanted to use the Next.js app router for a new app that uses Sign In With Ethereum, but ConnectKit&apos;s integration only supports API routes, so I built a lil starter kit showing how to use it with app routes.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Onchain Connect 4]]></title>
            <description><![CDATA[<p><a href="http://github.com/m1guelpf/connect4-sol"><img src="https://opengraph.githubassets.com/3f63fe40067871dbd9f46e9830228b0ffafb3affb354ae3fb3821dcedddcc283/m1guelpf/connect4-sol" alt="GitHub - m1guelpf/connect4-sol: An optimised Connect4 game implementation on Solidity"></a></p>
<p>I built a lil contract to play Connect 4 on the blockchain! It includes a super-optimised Game contract (moves cost ~$20 on mainnet) + an NFT that the owner can mint which generates an image of the board (also fully onchain).</p>]]></description>
            <link>https://miguel.build/b/onchain-connect-4</link>
            <guid isPermaLink="true">https://miguel.build/b/onchain-connect-4</guid>
            <pubDate>Mon, 31 Jan 2022 04:29:34 GMT</pubDate>
            <source:markdown>[![GitHub - m1guelpf/connect4-sol: An optimised Connect4 game implementation on Solidity](https://opengraph.githubassets.com/3f63fe40067871dbd9f46e9830228b0ffafb3affb354ae3fb3821dcedddcc283/m1guelpf/connect4-sol)](http://github.com/m1guelpf/connect4-sol)

I built a lil contract to play Connect 4 on the blockchain! It includes a super-optimised Game contract (moves cost ~$20 on mainnet) + an NFT that the owner can mint which generates an image of the board (also fully onchain).</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[A fridge for your zorbs]]></title>
            <description><![CDATA[<p><a href="https://github.com/m1guelpf/zorb-fridge"><img src="https://opengraph.githubassets.com/7d8173932c1f4247afde241152bbb9f566f4232b4da3fe2ea87febda0cee8c99/m1guelpf/zorb-fridge" alt="GitHub - m1guelpf/zorb-fridge: Zorbs shift when transferred. The Zorb Fridge allows you to freeze them."></a></p>
<p>Saw a few people sharing their ZORA orbs with frens, only to see the orb change when transferred, so I made a fridge. It freezes your zorbs so they don't change (built with Foundry &#x26; Solmate).</p>]]></description>
            <link>https://miguel.build/b/a-fridge-for-your-zorbs</link>
            <guid isPermaLink="true">https://miguel.build/b/a-fridge-for-your-zorbs</guid>
            <pubDate>Mon, 03 Jan 2022 03:16:37 GMT</pubDate>
            <source:markdown>[![GitHub - m1guelpf/zorb-fridge: Zorbs shift when transferred. The Zorb Fridge allows you to freeze them.](https://opengraph.githubassets.com/7d8173932c1f4247afde241152bbb9f566f4232b4da3fe2ea87febda0cee8c99/m1guelpf/zorb-fridge)](https://github.com/m1guelpf/zorb-fridge)

Saw a few people sharing their ZORA orbs with frens, only to see the orb change when transferred, so I made a fridge. It freezes your zorbs so they don&apos;t change (built with Foundry &amp; Solmate).</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[A better DX for Rive data binding on iOS]]></title>
            <description><![CDATA[<p><a href="https://github.com/rive-app/rive-ios/pull/377"><img src="https://opengraph.githubassets.com/4ca9049a3771fae8ba39e62d55c3b6e5606ddd420241446ac98f1a9437732abb/rive-app/rive-ios/pull/377" alt="🚧 Automatically generate data-binding types from Rive files by m1guelpf · Pull Request #377 · rive-app/rive-ios"></a></p>
<p>While working on a new app, I had to use the Rive iOS runtime for some graphics, and didn't love the way you had to manually declare all the properties and types.</p>
<p>To fix this, I built an Xcode plugin that automatically parses Rive files and generates all the types. It's just a proof of concept right now, but hopefully will eventually get pulled in!</p>]]></description>
            <link>https://miguel.build/b/a-better-dx-for-rive-data-binding-on-ios</link>
            <guid isPermaLink="true">https://miguel.build/b/a-better-dx-for-rive-data-binding-on-ios</guid>
            <pubDate>Wed, 11 Jun 2025 22:21:29 GMT</pubDate>
            <source:markdown>[![🚧 Automatically generate data-binding types from Rive files by m1guelpf · Pull Request #377 · rive-app/rive-ios](https://opengraph.githubassets.com/4ca9049a3771fae8ba39e62d55c3b6e5606ddd420241446ac98f1a9437732abb/rive-app/rive-ios/pull/377)](https://github.com/rive-app/rive-ios/pull/377)

While working on a new app, I had to use the Rive iOS runtime for some graphics, and didn&apos;t love the way you had to manually declare all the properties and types.

To fix this, I built an Xcode plugin that automatically parses Rive files and generates all the types. It&apos;s just a proof of concept right now, but hopefully will eventually get pulled in!</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Potato website]]></title>
            <description><![CDATA[<p><a href="https://github.com/m1guelpf/formtato"><img src="https://opengraph.githubassets.com/03e08f19b93a07dcd4490aa27be7aa64249ede681da6c986ec879bd42585dc39/m1guelpf/formtato" alt="GitHub - m1guelpf/formtato: A lil web3 form for Ana&#x27;s potato comissions"></a></p>
<p>Built a simple form website for my girlfriend's potato commissions as a Valentine's day gift. I made it in less than a day using Next.js, Tailwind CSS, Mirror's design system, Prisma, and nft.storage.</p>
<p><a href="https://formtato.m1guelpf.me">Order a potato NFT</a></p>]]></description>
            <link>https://miguel.build/b/potato-website</link>
            <guid isPermaLink="true">https://miguel.build/b/potato-website</guid>
            <pubDate>Tue, 22 Feb 2022 20:13:28 GMT</pubDate>
            <source:markdown>[![GitHub - m1guelpf/formtato: A lil web3 form for Ana&apos;s potato comissions](https://opengraph.githubassets.com/03e08f19b93a07dcd4490aa27be7aa64249ede681da6c986ec879bd42585dc39/m1guelpf/formtato)](https://github.com/m1guelpf/formtato)

Built a simple form website for my girlfriend&apos;s potato commissions as a Valentine&apos;s day gift. I made it in less than a day using Next.js, Tailwind CSS, Mirror&apos;s design system, Prisma, and nft.storage.

[Order a potato NFT](https://formtato.m1guelpf.me)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Navigation primitives for SwiftUI]]></title>
            <description><![CDATA[<p><a href="https://github.com/m1guelpf/NavigationKit"><img src="https://opengraph.githubassets.com/40f43ec043f8f1e38fe70cd734a85cc53ab1496a372005fab0cf378cf4feb53a/m1guelpf/NavigationKit" alt="GitHub - m1guelpf/NavigationKit: Typed SwiftUI navigation primitives with a single, app-defined destination model."></a></p>
<p>Noticed that I kept copying a set of navigation helpers I built for Pocket to any other iOS app I started, so I took some time to clean them up and extract them into a Swift package.</p>]]></description>
            <link>https://miguel.build/b/navigation-primitives-for-swiftui</link>
            <guid isPermaLink="true">https://miguel.build/b/navigation-primitives-for-swiftui</guid>
            <pubDate>Tue, 30 Dec 2025 16:48:16 GMT</pubDate>
            <source:markdown>[![GitHub - m1guelpf/NavigationKit: Typed SwiftUI navigation primitives with a single, app-defined destination model.](https://opengraph.githubassets.com/40f43ec043f8f1e38fe70cd734a85cc53ab1496a372005fab0cf378cf4feb53a/m1guelpf/NavigationKit)](https://github.com/m1guelpf/NavigationKit)

Noticed that I kept copying a set of navigation helpers I built for Pocket to any other iOS app I started, so I took some time to clean them up and extract them into a Swift package.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Web3 dApp Starter Kit]]></title>
            <description><![CDATA[<p><a href="https://github.com/m1guelpf/dapp-starter"><img src="https://repository-images.githubusercontent.com/495231206/18769359-b482-4306-8ad7-a41db04b36a2" alt="GitHub - m1guelpf/dapp-starter: The template I use to kickstart all my web3 apps."></a></p>
<p>Finally had time to open-source the template I've been using for months to quickly ship lil apps. It includes Next.js, Tailwind CSS, Connectkit, wagmi, viem, &#x26; more!</p>]]></description>
            <link>https://miguel.build/b/web3-dapp-starter-kit</link>
            <guid isPermaLink="true">https://miguel.build/b/web3-dapp-starter-kit</guid>
            <pubDate>Mon, 23 May 2022 02:28:28 GMT</pubDate>
            <source:markdown>[![GitHub - m1guelpf/dapp-starter: The template I use to kickstart all my web3 apps.](https://repository-images.githubusercontent.com/495231206/18769359-b482-4306-8ad7-a41db04b36a2)](https://github.com/m1guelpf/dapp-starter)

Finally had time to open-source the template I&apos;ve been using for months to quickly ship lil apps. It includes Next.js, Tailwind CSS, Connectkit, wagmi, viem, &amp; more!</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Proof of KYC contract]]></title>
            <description><![CDATA[<p><a href="https://github.com/m1guelpf/proof-of-kyc"><img src="https://opengraph.githubassets.com/241c538ab9c841ad2627b48c3cd60f7116b5be899d0e8549ec1da578a5330695/m1guelpf/proof-of-kyc" alt="GitHub - m1guelpf/proof-of-kyc: An NFT that proves you&#x27;ve gone through an identity verification process, powered by Stripe Identity."></a></p>
<p>I've been thinking a lot about effective methods of sybil resistance since the RBN/Meka incidents. As an experiment, I built a sybil-resistance NFT claiming prototype powered by Stripe's identity verification flow.</p>]]></description>
            <link>https://miguel.build/b/proof-of-kyc-contract</link>
            <guid isPermaLink="true">https://miguel.build/b/proof-of-kyc-contract</guid>
            <pubDate>Sat, 16 Oct 2021 01:14:16 GMT</pubDate>
            <source:markdown>[![GitHub - m1guelpf/proof-of-kyc: An NFT that proves you&apos;ve gone through an identity verification process, powered by Stripe Identity.](https://opengraph.githubassets.com/241c538ab9c841ad2627b48c3cd60f7116b5be899d0e8549ec1da578a5330695/m1guelpf/proof-of-kyc)](https://github.com/m1guelpf/proof-of-kyc)

I&apos;ve been thinking a lot about effective methods of sybil resistance since the RBN/Meka incidents. As an experiment, I built a sybil-resistance NFT claiming prototype powered by Stripe&apos;s identity verification flow.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Building a Redis server from scratch 🦀]]></title>
            <description><![CDATA[<p><a href="https://github.com/m1guelpf/lil-redis"><img src="https://opengraph.githubassets.com/d2ae27656987cde8f70956cd7f0476d2bdde1a52f2038df2ac5cdabc0f975578/m1guelpf/lil-redis" alt="GitHub - m1guelpf/lil-redis: An intentionally-limited Rust implementation of the Redis server with no external dependencies."></a></p>
<p>I've taken on learning Rust recently, and decided to build a very simple Redis server from scratch to practice.</p>]]></description>
            <link>https://miguel.build/b/building-a-redis-server-from-scratch</link>
            <guid isPermaLink="true">https://miguel.build/b/building-a-redis-server-from-scratch</guid>
            <pubDate>Fri, 16 Dec 2022 11:38:25 GMT</pubDate>
            <source:markdown>[![GitHub - m1guelpf/lil-redis: An intentionally-limited Rust implementation of the Redis server with no external dependencies.](https://opengraph.githubassets.com/d2ae27656987cde8f70956cd7f0476d2bdde1a52f2038df2ac5cdabc0f975578/m1guelpf/lil-redis)](https://github.com/m1guelpf/lil-redis)

I&apos;ve taken on learning Rust recently, and decided to build a very simple Redis server from scratch to practice.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[A new approach to wallet activity]]></title>
            <description><![CDATA[<p><a href="https://github.com/m1guelpf/wallet-activity"><img src="https://opengraph.githubassets.com/1bc48a3d0545f77cab85d1e07658a607f39c9d29b6bd9063e27c4f296dfe7c27/m1guelpf/wallet-activity" alt="GitHub - m1guelpf/wallet-activity: User-friendly Ethereum transaction descriptions."></a></p>
<p>Wallet history is notoriously hard to explain to users. At best you show a bunch of swaps, but every other tx is a "contract interaction". I spent the past week working on a solution (and recreating the iOS lockscreen on web to showcase it).</p>]]></description>
            <link>https://miguel.build/b/a-new-approach-to-wallet-activity</link>
            <guid isPermaLink="true">https://miguel.build/b/a-new-approach-to-wallet-activity</guid>
            <pubDate>Thu, 03 Mar 2022 03:13:14 GMT</pubDate>
            <source:markdown>[![GitHub - m1guelpf/wallet-activity: User-friendly Ethereum transaction descriptions.](https://opengraph.githubassets.com/1bc48a3d0545f77cab85d1e07658a607f39c9d29b6bd9063e27c4f296dfe7c27/m1guelpf/wallet-activity)](https://github.com/m1guelpf/wallet-activity)

Wallet history is notoriously hard to explain to users. At best you show a bunch of swaps, but every other tx is a &quot;contract interaction&quot;. I spent the past week working on a solution (and recreating the iOS lockscreen on web to showcase it).</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Adding macOS GPU support to Point-E]]></title>
            <description><![CDATA[<p><a href="https://github.com/m1guelpf/point-e-macos"><img src="https://opengraph.githubassets.com/598c7b68fab89469b09ab9ecfa82cf44c089291d8e3b8735992334f94bb597b2/m1guelpf/point-e-macos" alt="GitHub - m1guelpf/point-e-macos: lil fork of OpenAI&#x27;s Point-E, adding mps backend support"></a></p>
<p>OpenAI released Point-E (their first attempt at a DALL-E-but-3D model) today. When I was trying it out, noticed it ran a bit slow on my mac. I managed to add basic support for M1/M2 GPUs (instead of running it on the CPU), and it got noticeably faster!</p>]]></description>
            <link>https://miguel.build/b/adding-macos-gpu-support-to-point-e</link>
            <guid isPermaLink="true">https://miguel.build/b/adding-macos-gpu-support-to-point-e</guid>
            <pubDate>Wed, 21 Dec 2022 03:21:16 GMT</pubDate>
            <source:markdown>[![GitHub - m1guelpf/point-e-macos: lil fork of OpenAI&apos;s Point-E, adding mps backend support](https://opengraph.githubassets.com/598c7b68fab89469b09ab9ecfa82cf44c089291d8e3b8735992334f94bb597b2/m1guelpf/point-e-macos)](https://github.com/m1guelpf/point-e-macos)

OpenAI released Point-E (their first attempt at a DALL-E-but-3D model) today. When I was trying it out, noticed it ran a bit slow on my mac. I managed to add basic support for M1/M2 GPUs (instead of running it on the CPU), and it got noticeably faster!</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[PR'd ChatGPT support to async-openai 🦀]]></title>
            <description><![CDATA[<p><a href="https://github.com/64bit/async-openai/pull/43"><img src="https://opengraph.githubassets.com/c64e5205b8ea1894523732fc27f57113a506a71458bde6eed6d8cdde34eafc7c/64bit/async-openai/pull/43" alt="Support for ChatGPT API by m1guelpf · Pull Request #43 · 64bit/async-openai"></a></p>
<p>Opened a Pull Request adding support for the new Chat API to the async-openai Rust library (which Clippy uses), so other rust-based projects could benefit from it too!</p>]]></description>
            <link>https://miguel.build/b/prd-chatgpt-support-to-async-openai</link>
            <guid isPermaLink="true">https://miguel.build/b/prd-chatgpt-support-to-async-openai</guid>
            <pubDate>Wed, 01 Mar 2023 20:16:16 GMT</pubDate>
            <source:markdown>[![Support for ChatGPT API by m1guelpf · Pull Request #43 · 64bit/async-openai](https://opengraph.githubassets.com/c64e5205b8ea1894523732fc27f57113a506a71458bde6eed6d8cdde34eafc7c/64bit/async-openai/pull/43)](https://github.com/64bit/async-openai/pull/43)

Opened a Pull Request adding support for the new Chat API to the async-openai Rust library (which Clippy uses), so other rust-based projects could benefit from it too!</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[ERC20 NFT airdrop contract]]></title>
            <description><![CDATA[<p><a href="https://github.com/m1guelpf/nft-token-drop"><img src="https://opengraph.githubassets.com/ec538db62d7ce7bbe9d69ea37805ce2d9a078fed8f8279666c90d07313b8e88f/m1guelpf/nft-token-drop" alt="GitHub - m1guelpf/nft-token-drop: A drop-in contract to airdrop all current holders of an NFT with an ERC20 token"></a></p>
<p>Seeding an ERC20 currency with holders of an NFT seems to be becoming more of a common trend (see $AGLD, $BSTICK, $ZURR). So I built a simple contract to issue a token for any NFT (using Foundry &#x26; Rari Capital's solmate for gas optimization magic)</p>]]></description>
            <link>https://miguel.build/b/erc20-nft-airdrop-contract</link>
            <guid isPermaLink="true">https://miguel.build/b/erc20-nft-airdrop-contract</guid>
            <pubDate>Tue, 04 Jan 2022 18:32:59 GMT</pubDate>
            <source:markdown>[![GitHub - m1guelpf/nft-token-drop: A drop-in contract to airdrop all current holders of an NFT with an ERC20 token](https://opengraph.githubassets.com/ec538db62d7ce7bbe9d69ea37805ce2d9a078fed8f8279666c90d07313b8e88f/m1guelpf/nft-token-drop)](https://github.com/m1guelpf/nft-token-drop)

Seeding an ERC20 currency with holders of an NFT seems to be becoming more of a common trend (see $AGLD, $BSTICK, $ZURR). So I built a simple contract to issue a token for any NFT (using Foundry &amp; Rari Capital&apos;s solmate for gas optimization magic)</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Ethereum Virtual Machine in PHP]]></title>
            <description><![CDATA[<p><a href="https://github.com/m1guelpf/php-evm"><img src="https://opengraph.githubassets.com/db414348996776744423f8852ce9f9bc22bb027fa355286b1c938f3f965a0fab/m1guelpf/php-evm" alt="GitHub - m1guelpf/php-evm: &#x22;lol. lmao&#x22; - m1guelpf.eth"></a></p>
<p>A simple implementation of the Ethereum Virtual Machine in PHP. Made as a joke at 3am, do not take seriously.</p>]]></description>
            <link>https://miguel.build/b/ethereum-virtual-machine-in-php</link>
            <guid isPermaLink="true">https://miguel.build/b/ethereum-virtual-machine-in-php</guid>
            <pubDate>Thu, 10 Feb 2022 04:47:19 GMT</pubDate>
            <source:markdown>[![GitHub - m1guelpf/php-evm: &quot;lol. lmao&quot; - m1guelpf.eth](https://opengraph.githubassets.com/db414348996776744423f8852ce9f9bc22bb027fa355286b1c938f3f965a0fab/m1guelpf/php-evm)](https://github.com/m1guelpf/php-evm)

A simple implementation of the Ethereum Virtual Machine in PHP. Made as a joke at 3am, do not take seriously.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[The best OpenAI DevEx in Swift]]></title>
            <description><![CDATA[<p><a href="https://github.com/m1guelpf/swift-openai-responses"><img src="https://repository-images.githubusercontent.com/948951076/223f524f-8164-40f7-9c1d-0a219a2463ec" alt="GitHub - m1guelpf/swift-openai-responses: Hand-crafted Swift SDK for the OpenAI Responses API."></a></p>
<p>I spent most of the summer updating my OpenAI Responses Swift library to support the latest API changes and make it as developer-friendly as possible.</p>
<p>Some of the highlights include schema-generating macros to massively reduce function-calling boilerplate, and updating the <code>Conversation</code> utility to handle everything you could ever need. Try it out!</p>]]></description>
            <link>https://miguel.build/b/the-best-openai-devex-in-swift</link>
            <guid isPermaLink="true">https://miguel.build/b/the-best-openai-devex-in-swift</guid>
            <pubDate>Wed, 24 Sep 2025 16:48:28 GMT</pubDate>
            <source:markdown>[![GitHub - m1guelpf/swift-openai-responses: Hand-crafted Swift SDK for the OpenAI Responses API.](https://repository-images.githubusercontent.com/948951076/223f524f-8164-40f7-9c1d-0a219a2463ec)](https://github.com/m1guelpf/swift-openai-responses)

I spent most of the summer updating my OpenAI Responses Swift library to support the latest API changes and make it as developer-friendly as possible.

Some of the highlights include schema-generating macros to massively reduce function-calling boilerplate, and updating the `Conversation` utility to handle everything you could ever need. Try it out!</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[A faster CLI for Whisper 🦀]]></title>
            <description><![CDATA[<p><a href="https://github.com/m1guelpf/whisper-cli-rs"><img src="https://opengraph.githubassets.com/34b74c175cb525a4274958e6c5cccff1865e31bbf10cc401b4427625072f0105/m1guelpf/whisper-cli-rs" alt="GitHub - m1guelpf/whisper-cli-rs: A Whisper CLI, built with Rust."></a></p>
<p>Was playing around with OpenAI's Whisper C++ bindings, and ended up with a simple CLI in Rust that mimics the original one. Turns out it's orders of magnitude faster than the Python version on my M1 🚀</p>]]></description>
            <link>https://miguel.build/b/a-faster-cli-for-whisper</link>
            <guid isPermaLink="true">https://miguel.build/b/a-faster-cli-for-whisper</guid>
            <pubDate>Sun, 25 Dec 2022 15:58:02 GMT</pubDate>
            <source:markdown>[![GitHub - m1guelpf/whisper-cli-rs: A Whisper CLI, built with Rust.](https://opengraph.githubassets.com/34b74c175cb525a4274958e6c5cccff1865e31bbf10cc401b4427625072f0105/m1guelpf/whisper-cli-rs)](https://github.com/m1guelpf/whisper-cli-rs)

Was playing around with OpenAI&apos;s Whisper C++ bindings, and ended up with a simple CLI in Rust that mimics the original one. Turns out it&apos;s orders of magnitude faster than the Python version on my M1 🚀</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Showing my Lens posts on my website]]></title>
            <description><![CDATA[<p><a href="/lens"><img src="https://static.hey.xyz/images/og/cover.png" alt="Hey"></a></p>
<p>Built a small Lens Protocol client into my website to show my posts. Having tried to do the same with Twitter a while ago, the developer experience is incredible.</p>]]></description>
            <link>https://miguel.build/b/showing-my-lens-posts-on-my-website</link>
            <guid isPermaLink="true">https://miguel.build/b/showing-my-lens-posts-on-my-website</guid>
            <pubDate>Sat, 21 May 2022 03:31:24 GMT</pubDate>
            <source:markdown>[![Hey](https://static.hey.xyz/images/og/cover.png)](/lens)

Built a small Lens Protocol client into my website to show my posts. Having tried to do the same with Twitter a while ago, the developer experience is incredible.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Human verification for Lens Protocol]]></title>
            <description><![CDATA[<p><a href="https://human.withlens.app">https://human.withlens.app</a></p>
<p>Social has always has a big problem with bots &#x26; spam. Together with Lens Protocol we worked on a simple solution: Have users verify themselves as human in a completely anonymous way, using World ID. The human status is then made available to all apps via the Lens API.</p>]]></description>
            <link>https://miguel.build/b/human-verification-for-lens-protocol</link>
            <guid isPermaLink="true">https://miguel.build/b/human-verification-for-lens-protocol</guid>
            <pubDate>Fri, 26 Aug 2022 18:06:07 GMT</pubDate>
            <source:markdown>[https://human.withlens.app](https://human.withlens.app)

Social has always has a big problem with bots &amp; spam. Together with Lens Protocol we worked on a simple solution: Have users verify themselves as human in a completely anonymous way, using World ID. The human status is then made available to all apps via the Lens API.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[A video about falling asleep]]></title>
            <description><![CDATA[<p><a href="https://youtu.be/aJzbulMSRoo"><img src="https://i.ytimg.com/vi/aJzbulMSRoo/maxresdefault.jpg" alt="I built a device to help me fall asleep"></a></p>
<p>It's been way too long since I made a video, especially with it being one of my main goals right now.</p>
<p>I worked on this one in the last few weeks of 2024 hoping to release it before the year ended, but ended up going a little over. Still, I'm super happy with it and I think you'll love it!</p>]]></description>
            <link>https://miguel.build/b/a-video-about-falling-asleep</link>
            <guid isPermaLink="true">https://miguel.build/b/a-video-about-falling-asleep</guid>
            <pubDate>Fri, 03 Jan 2025 16:42:24 GMT</pubDate>
            <source:markdown>[![I built a device to help me fall asleep](https://i.ytimg.com/vi/aJzbulMSRoo/maxresdefault.jpg)](https://youtu.be/aJzbulMSRoo)

It&apos;s been way too long since I made a video, especially with it being one of my main goals right now.

I worked on this one in the last few weeks of 2024 hoping to release it before the year ended, but ended up going a little over. Still, I&apos;m super happy with it and I think you&apos;ll love it!</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[My first video]]></title>
            <description><![CDATA[<p><a href="https://youtu.be/h2wpofmnNgc">- YouTube</a></p>
<p>Yesterday I promised I'd stop procrastinating on video content and make a video on something. It's super basic (me talking to a camera), the editing is somewhat annoying, and could generally be improved A LOT, but it's here, and the next one will be better.</p>]]></description>
            <link>https://miguel.build/b/my-first-video</link>
            <guid isPermaLink="true">https://miguel.build/b/my-first-video</guid>
            <pubDate>Tue, 20 Sep 2022 03:25:12 GMT</pubDate>
            <source:markdown>[- YouTube](https://youtu.be/h2wpofmnNgc)

Yesterday I promised I&apos;d stop procrastinating on video content and make a video on something. It&apos;s super basic (me talking to a camera), the editing is somewhat annoying, and could generally be improved A LOT, but it&apos;s here, and the next one will be better.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Explaining SMPC in 12 minutes]]></title>
            <description><![CDATA[<p><a href="https://youtu.be/xQDXr8AZFGM"><img src="https://i.ytimg.com/vi/xQDXr8AZFGM/maxresdefault.jpg" alt="Worldcoin&#x27;s SMPC system explained"></a></p>
<p>Worldcoin recently announced a groundbreaking SMPC implementation, used to secure the biometric data captured by the Orb.</p>
<p>To accompany the announcement, I flew to Poland to get a lil maths lecture from <a href="https://xn--2-umb.com/">Remco</a> covering the basics of SMPC and turn it into a video, so everyone can get a feel for how it works.</p>]]></description>
            <link>https://miguel.build/b/explaining-smpc-in-12-minutes</link>
            <guid isPermaLink="true">https://miguel.build/b/explaining-smpc-in-12-minutes</guid>
            <pubDate>Wed, 15 May 2024 13:48:30 GMT</pubDate>
            <source:markdown>[![Worldcoin&apos;s SMPC system explained](https://i.ytimg.com/vi/xQDXr8AZFGM/maxresdefault.jpg)](https://youtu.be/xQDXr8AZFGM)

Worldcoin recently announced a groundbreaking SMPC implementation, used to secure the biometric data captured by the Orb.

To accompany the announcement, I flew to Poland to get a lil maths lecture from [Remco](https://xn--2-umb.com/) covering the basics of SMPC and turn it into a video, so everyone can get a feel for how it works.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[A 1h web3 crash course, for non-technical people]]></title>
            <description><![CDATA[<p><a href="https://youtu.be/jX8K8c93lv0"><img src="https://i.ytimg.com/vi/jX8K8c93lv0/maxresdefault.jpg" alt="Explaining crypto, Ethereum, NFTs &#x26; more FROM SCRATCH"></a></p>
<p>A few months ago, I made a stream where I got a non-technical friend and explained everything crypto to them, from blockchains and PoS, to smart contracts, ENS &#x26; more. I finally had time to edit the 5h of stream into a consumable video.</p>]]></description>
            <link>https://miguel.build/b/a-1h-web3-crash-course-for-non-technical-people</link>
            <guid isPermaLink="true">https://miguel.build/b/a-1h-web3-crash-course-for-non-technical-people</guid>
            <pubDate>Sat, 22 Jan 2022 18:28:03 GMT</pubDate>
            <source:markdown>[![Explaining crypto, Ethereum, NFTs &amp; more FROM SCRATCH](https://i.ytimg.com/vi/jX8K8c93lv0/maxresdefault.jpg)](https://youtu.be/jX8K8c93lv0)

A few months ago, I made a stream where I got a non-technical friend and explained everything crypto to them, from blockchains and PoS, to smart contracts, ENS &amp; more. I finally had time to edit the 5h of stream into a consumable video.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Twitter cross-posting for Lens]]></title>
            <description><![CDATA[<p><a href="https://reflect.withlens.app">https://reflect.withlens.app</a></p>
<p>With new social networks come new possibilities, but also the hassle of manually cross-posting content. To fix this, I built a simple tool that automatically tweets your Lens posts.</p>]]></description>
            <link>https://miguel.build/b/twitter-cross-posting-for-lens</link>
            <guid isPermaLink="true">https://miguel.build/b/twitter-cross-posting-for-lens</guid>
            <pubDate>Thu, 02 Jun 2022 18:38:33 GMT</pubDate>
            <source:markdown>[https://reflect.withlens.app](https://reflect.withlens.app)

With new social networks come new possibilities, but also the hassle of manually cross-posting content. To fix this, I built a simple tool that automatically tweets your Lens posts.</source:markdown>
            
        </item>
        <item>
            <title><![CDATA[Contextual search for podcasts]]></title>
            <description><![CDATA[<p><a href="https://podcast-search.m1guelpf.me">https://podcast-search.m1guelpf.me</a></p>
<p>I've been looking into semantic search this last week, and decided to build a simple demo. It indexes the Indie Hackers podcast (which I transcribed using Whisper) and lets you search through all episodes by topic of conversation. Also had lots of fun building the UI!</p>]]></description>
            <link>https://miguel.build/b/contextual-search-for-podcasts</link>
            <guid isPermaLink="true">https://miguel.build/b/contextual-search-for-podcasts</guid>
            <pubDate>Wed, 11 Jan 2023 19:38:32 GMT</pubDate>
            <source:markdown>[https://podcast-search.m1guelpf.me](https://podcast-search.m1guelpf.me)

I&apos;ve been looking into semantic search this last week, and decided to build a simple demo. It indexes the Indie Hackers podcast (which I transcribed using Whisper) and lets you search through all episodes by topic of conversation. Also had lots of fun building the UI!</source:markdown>
            
        </item>
    </channel>
</rss>