<![CDATA[Miguel Piedrafita]]> https://miguel.build Limbhad Mon, 16 Mar 2026 10:37:09 GMT <![CDATA[Pokemon Go, but for payphones (?)]]>

Riley Waltz recently launched a new game where you go out and hunt down California payphones. 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://miguel.build/b/pokemon-go-but-for-payphones https://miguel.build/b/pokemon-go-but-for-payphones Mon, 02 Mar 2026 23:34:45 GMT <video controls><source src="https://web-assets.miguel.build/payphonego/video.mp4" poster="https://web-assets.miguel.build/payphonego/poster.jpg" muted type="video/mp4"></video> [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)
<![CDATA[A brand new World ID (RFC)]]> A diagram showing the proposed architecture for World ID v4

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).

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!

Share your feedback

]]>
https://miguel.build/b/a-brand-new-world-id-rfc https://miguel.build/b/a-brand-new-world-id-rfc Thu, 22 Jan 2026 17:27:10 GMT ![A diagram showing the proposed architecture for World ID v4](https://web-assets.miguel.build/world-id-4-rfc.jpg) 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). 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! [Share your feedback](https://github.com/worldcoin/world-id-protocol/blob/main/docs/world-id-4-specs/README.md)
<![CDATA[Speeding up the Cloudflare dashboard]]>

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.

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://miguel.build/b/speeding-up-the-cloudflare-dashboard https://miguel.build/b/speeding-up-the-cloudflare-dashboard Sun, 04 Jan 2026 19:30:14 GMT <video controls><source src="https://web-assets.miguel.build/cf-url/video.mp4" poster="https://web-assets.miguel.build/cf-url/poster.jpg" muted type="video/mp4"></video> 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. 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)
<![CDATA[A game to keep up with the news]]>

A few days ago, I found a really cool game which turns the news into simple games (trivia & 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://miguel.build/b/a-game-to-keep-up-with-the-news https://miguel.build/b/a-game-to-keep-up-with-the-news Fri, 02 Jan 2026 15:55:53 GMT <video controls><source src="https://web-assets.miguel.build/timelines-app/video.mp4" poster="https://web-assets.miguel.build/timelines-app/poster.jpg" muted type="video/mp4"></video> A few days ago, I found a really cool game which turns the news into simple games (trivia & 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/)
<![CDATA[Exploring Spotify's leaked data]]>

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.

]]>
https://miguel.build/b/exploring-spotifys-leaked-data https://miguel.build/b/exploring-spotifys-leaked-data Wed, 24 Dec 2025 20:01:22 GMT <video controls><source src="https://web-assets.miguel.build/spotify-dump/video.mp4" poster="https://web-assets.miguel.build/spotify-dump/poster.jpg" type="video/mp4"></video> 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.
<![CDATA[Turning photos into 3D environments]]>

Apple recently released an experimental ML model called 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.

]]>
https://miguel.build/b/turning-photos-into-3d-environments https://miguel.build/b/turning-photos-into-3d-environments Sun, 21 Dec 2025 01:48:34 GMT <video controls><source src="https://web-assets.miguel.build/macos-sharp/video.mp4" poster="https://web-assets.miguel.build/macos-sharp/poster.jpg" type="video/mp4"></video> 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.
<![CDATA[Decentralized gift-giving on World App]]>

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.

Try it out

]]>
https://miguel.build/b/decentralized-gift-giving-on-world-app https://miguel.build/b/decentralized-gift-giving-on-world-app Fri, 12 Dec 2025 23:14:44 GMT <video controls><source src="https://web-assets.miguel.build/wld-gifts/video.mp4" poster="https://web-assets.miguel.build/wld-gifts/poster.jpg" type="video/mp4"></video> 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. [Try it out](https://world.org/giftofgiving)
<![CDATA[Rendering Miis]]>

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

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.

]]>
https://miguel.build/b/rendering-miis https://miguel.build/b/rendering-miis Thu, 23 Oct 2025 14:42:04 GMT <video controls><source src="https://web-assets.miguel.build/3d-mii/video.mp4" poster="https://web-assets.miguel.build/3d-mii/poster.jpg" muted type="video/mp4"></video> The other day I stumbled upon a C++ decompilation of the Wii U library that renders Miis. 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.
<![CDATA[A Swift SDK for Sora]]> 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 )

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://miguel.build/b/a-swift-sdk-for-sora https://miguel.build/b/a-swift-sdk-for-sora Mon, 06 Oct 2025 19:36:20 GMT ```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 ) ``` 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)
<![CDATA[Glass icon for an upcoming app]]> A 3D render of an iPhone, showing the home screen with various app icons. Highlighted is the Pocket app icon.

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.

]]>
https://miguel.build/b/glass-icon-for-an-upcoming-app https://miguel.build/b/glass-icon-for-an-upcoming-app Tue, 23 Sep 2025 21:14:59 GMT ![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'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.
<![CDATA[Cleaning up my Twitter followers]]> A follower count, showing a drop of 20,248 followers in a single day.

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.

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!

]]>
https://miguel.build/b/cleaning-up-my-twitter-followers https://miguel.build/b/cleaning-up-my-twitter-followers Tue, 23 Sep 2025 16:44:26 GMT ![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'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!
<![CDATA[Real-time AI in two lines of code]]> 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 ) } } }

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://miguel.build/b/real-time-ai-in-two-lines-of-code https://miguel.build/b/real-time-ai-in-two-lines-of-code Thu, 28 Aug 2025 18:40:34 GMT ```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 ) } } } ``` 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)
<![CDATA[A skeumorphic voice journal]]>

A few weeks ago, my girlfriend and I challenged ourselves to make an app that didn'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'm obviously biased, but i think it turned out great. Try it out!

Download on the App Store

]]>
https://miguel.build/b/a-skeumorphic-voice-journal https://miguel.build/b/a-skeumorphic-voice-journal Fri, 04 Jul 2025 16:36:29 GMT <video controls><source src="https://web-assets.miguel.build/audio-diary/video.mp4" poster="https://web-assets.miguel.build/audio-diary/poster.jpg" muted type="video/mp4"></video> A few weeks ago, [my girlfriend](https://twitter.com/ruedart) and I challenged ourselves to make an app that didn'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'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)
<![CDATA[The Nintendo DS Clock, on your phone]]> 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.

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

To celebrate, my girlfriend and I spent the weekend recreating the original Nintendo DS clock as an iOS widget. It's now live on the App Store!

Download on the App Store

]]>
https://miguel.build/b/the-nintendo-ds-clock-on-your-phone https://miguel.build/b/the-nintendo-ds-clock-on-your-phone Tue, 03 Jun 2025 16:49:58 GMT ![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'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's now live on the App Store! [Download on the App Store](https://apps.apple.com/us/app/dsclock-retro-clock-widget/id6746729918)
<![CDATA[A Swift SDK for the OpenAI Images API]]> 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" )

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.

View on GitHub

]]>
https://miguel.build/b/a-swift-sdk-for-the-openai-images-api https://miguel.build/b/a-swift-sdk-for-the-openai-images-api Thu, 24 Apr 2025 04:34:44 GMT ```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" ) ``` 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. [View on GitHub](https://github.com/m1guelpf/swift-openai-images)
<![CDATA[A library to let AI take over your computer]]> 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) }

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).

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://miguel.build/b/a-library-to-let-ai-take-over-your-computer https://miguel.build/b/a-library-to-let-ai-take-over-your-computer Thu, 03 Apr 2025 05:15:43 GMT ```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) } ``` 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). 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)
<![CDATA[Imagining an app that turns your friends into stickers]]>

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

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.

]]>
https://miguel.build/b/imagining-an-app-that-turns-your-friends-into-stickers https://miguel.build/b/imagining-an-app-that-turns-your-friends-into-stickers Fri, 28 Mar 2025 23:49:13 GMT <video controls><source src="https://web-assets.miguel.build/glimmer-splash/video.mp4" poster="https://web-assets.miguel.build/glimmer-splash/poster.jpg" muted type="video/mp4"></video> OpenAI just released an incredibly update to their image generation tooling, and I've had a blast playing with all the different styles. 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.
<![CDATA[Making AI-powered iOS apps effortless]]> 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) } }

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://miguel.build/b/making-ai-powered-ios-apps-effortless https://miguel.build/b/making-ai-powered-ios-apps-effortless Fri, 21 Mar 2025 22:32:59 GMT ```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) } } ``` 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)
<![CDATA[A Rust SDK for the OpenAI Responses API]]> 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());

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'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!

View on GitHub

]]>
https://miguel.build/b/a-rust-sdk-for-the-openai-responses-api https://miguel.build/b/a-rust-sdk-for-the-openai-responses-api Wed, 12 Mar 2025 20:30:07 GMT ```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()); ``` 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'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! [View on GitHub](https://github.com/m1guelpf/openai-responses-rs)
<![CDATA[Disappearing Text Effect]]>

Saw a particularly neat effect on the Devouring Details 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://miguel.build/b/disappearing-text-effect https://miguel.build/b/disappearing-text-effect Tue, 04 Mar 2025 01:53:49 GMT <video controls><source src="https://web-assets.miguel.build/text-vanish/video.mp4" poster="https://web-assets.miguel.build/text-vanish/poster.jpg" muted type="video/mp4"></video> 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)
<![CDATA[Love or Bot]]>

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!

Play on World App

]]>
https://miguel.build/b/love-or-bot https://miguel.build/b/love-or-bot Fri, 14 Feb 2025 15:34:22 GMT <video controls><source src="https://web-assets.miguel.build/loveorbot/video.mp4" poster="https://web-assets.miguel.build/loveorbot/poster.jpg" type="video/mp4"></video> 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! [Play on World App](https://world.org/ecosystem/app_f9d14c86a530b4e66b44b6d01e6ba454)
<![CDATA[React Server Actions, for PHP]]> 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 ( <div> <h1>Sign In</h1> {response && <pre>{JSON.stringify(response)}</pre>} <input type="email" value={email} onChange={e => setEmail(e.target.value)} /> <input type="password" value={password} onChange={e => setPassword(e.target.value)} /> <button onClick={() => // [!code focus] startTransition(async () => signIn(email, password).then(response => setResponse(response))) // [!code focus] } // [!code focus] >Log In</button> </div> ) } export default ExamplePage

I recently saw Fusion, 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.

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!

View on GitHub

]]>
https://miguel.build/b/react-server-actions-for-php https://miguel.build/b/react-server-actions-for-php Sat, 08 Feb 2025 20:44:55 GMT ```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 ( <div> <h1>Sign In</h1> {response && <pre>{JSON.stringify(response)}</pre>} <input type="email" value={email} onChange={e => setEmail(e.target.value)} /> <input type="password" value={password} onChange={e => setPassword(e.target.value)} /> <button onClick={() => // [!code focus] startTransition(async () => signIn(email, password).then(response => setResponse(response))) // [!code focus] } // [!code focus] >Log In</button> </div> ) } 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'd try my hand at a React version. 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! [View on GitHub](https://github.com/m1guelpf/php-server-actions)
<![CDATA[A lightweight pipeline system for 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'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.

View on GitHub

]]>
https://miguel.build/b/a-lightweight-pipeline-system-for-swift https://miguel.build/b/a-lightweight-pipeline-system-for-swift Mon, 03 Feb 2025 13:44:55 GMT ```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'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. [View on GitHub](https://github.com/m1guelpf/swift-pipeline)
<![CDATA[A simple Swift library for watching over your Mac]]> 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)") } } }

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.

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

View on GitHub

]]>
https://miguel.build/b/a-simple-swift-library-for-watching-over-your-mac https://miguel.build/b/a-simple-swift-library-for-watching-over-your-mac Mon, 27 Jan 2025 03:48:49 GMT ```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)") } } } ``` 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. I built a lil helper class for my app, and thought I'd also release it as a library for others to use. [View on GitHub](https://github.com/m1guelpf/WatchEye)
<![CDATA[A nice SwiftUI landing screen]]>

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!

]]>
https://miguel.build/b/a-nice-swiftui-landing-screen https://miguel.build/b/a-nice-swiftui-landing-screen Thu, 26 Dec 2024 07:23:25 GMT <video controls><source src="https://web-assets.miguel.build/lodge/video.mp4" poster="https://web-assets.miguel.build/lodge/poster.jpg" muted type="video/mp4"></video> 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!
<![CDATA[Making OpenAI's new APIs production-ready]]> 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)) }

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'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://miguel.build/b/making-openais-new-apis-production-ready https://miguel.build/b/making-openais-new-apis-production-ready Tue, 01 Oct 2024 22:10:02 GMT ```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)) } ``` 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'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)
<![CDATA[Polishing up this site]]> 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, which let me strip most of the JS in the site (with little "islands" of interactivity). It now loads much faster!

]]>
https://miguel.build/b/polishing-up-this-site https://miguel.build/b/polishing-up-this-site Sun, 16 Jun 2024 03:35:10 GMT 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 "islands" of interactivity). It now loads much faster!
<![CDATA[A better way to organize AI prompts in 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: &str, user: &str) -> String { // // returns the prompt with the variables replaced, and the indentation normalized // }

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.

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://miguel.build/b/a-better-way-to-organize-ai-prompts-in-rust https://miguel.build/b/a-better-way-to-organize-ai-prompts-in-rust Mon, 29 Apr 2024 09:49:02 GMT ```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: &str, user: &str) -> String { // // returns the prompt with the variables replaced, and the indentation normalized // } ``` 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. 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)
<![CDATA[An app to easily find liked tweets]]> Promotional image for Perch – a refreshingly simple app for managing your Twitter likes, designed to make finding "that one tweet" a breeze.

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.

Download on the App Store

]]>
https://miguel.build/b/an-app-to-easily-find-liked-tweets https://miguel.build/b/an-app-to-easily-find-liked-tweets Thu, 18 Apr 2024 16:31:24 GMT ![Promotional image for Perch – a refreshingly simple app for managing your Twitter likes, designed to make finding "that one tweet" a breeze.](https://web-assets.miguel.build/perch-appstore.jpg) 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. [Download on the App Store](https://apple.co/448gDz6)
<![CDATA[Reverse-engineering my 3D printer's API]]> use bambulab_cloud::cloud::{Client, Region}; let client = Client::login(Region::Europe, "[email protected]", "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", // ... // }, // ]

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.

View on GitHub

]]>
https://miguel.build/b/reverse-engineering-my-3d-printers-api https://miguel.build/b/reverse-engineering-my-3d-printers-api Wed, 10 Apr 2024 20:52:43 GMT ```rust use bambulab_cloud::cloud::{Client, Region}; let client = Client::login(Region::Europe, "[email protected]", "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", // ... // }, // ] ``` 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. [View on GitHub](https://github.com/m1guelpf/bambulab-rs)
<![CDATA[Bringing a calmer feed to life]]>

Scrolling through Twitter, I found a pretty sick text-only Twitter concept. 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.

View on GitHub

]]>
https://miguel.build/b/bringing-a-calmer-feed-to-life https://miguel.build/b/bringing-a-calmer-feed-to-life Sat, 02 Mar 2024 14:50:42 GMT <video controls><source src="https://web-assets.miguel.build/textos/video.mp4" poster="https://web-assets.miguel.build/textos/poster.jpg" type="video/mp4"></video> Scrolling through Twitter, I found [a pretty sick text-only Twitter concept](https://twitter.com/samdape/status/1762179245697122614). 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. [View on GitHub](https://github.com/m1guelpf/textos-twitter)
<![CDATA[My first SwiftUI app]]>

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!

View on GitHub

]]>
https://miguel.build/b/my-first-swiftui-app https://miguel.build/b/my-first-swiftui-app Thu, 01 Feb 2024 02:04:15 GMT <video controls><source src="https://web-assets.miguel.build/indigo/video.mp4" poster="https://web-assets.miguel.build/indigo/poster.jpg" type="video/mp4"></video> 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! [View on GitHub](https://github.com/m1guelpf/indigo)
<![CDATA[A Rust SDK for World ID]]>

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.

View on GitHub

]]>
https://miguel.build/b/a-rust-sdk-for-world-id https://miguel.build/b/a-rust-sdk-for-world-id Tue, 30 Jan 2024 17:27:05 GMT <video controls><source src="https://web-assets.miguel.build/idkit-rs/video.mp4" poster="https://web-assets.miguel.build/idkit-rs/poster.jpg" type="video/mp4"></video> 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. [View on GitHub](https://github.com/worldcoin/idkit-rs)
<![CDATA[Monitoring air quality with 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'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.

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://miguel.build/b/monitoring-air-quality-with-rust https://miguel.build/b/monitoring-air-quality-with-rust Thu, 11 Jan 2024 01:19:25 GMT ```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'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. 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)
<![CDATA[Exploring dependency injection in Rust.]]> use silhouette::facade::Container; struct DBPool {} struct DBConnection {} // will always use the same pool Container::singleton(&|_| DBPool::new())?; // will resolve a new connection each time Container::bind(&|container| -> DBConnection { let shared_pool = container.resolve::<DBPool>().unwrap(); shared_pool.get_conn() })?; // somewhere else in your app... let connection: DBConnection = Container::resolve()?;

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.

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://miguel.build/b/exploring-dependency-injection-in-rust https://miguel.build/b/exploring-dependency-injection-in-rust Thu, 21 Dec 2023 14:30:00 GMT ```rust use silhouette::facade::Container; struct DBPool {} struct DBConnection {} // will always use the same pool Container::singleton(&|_| DBPool::new())?; // will resolve a new connection each time Container::bind(&|container| -> DBConnection { let shared_pool = container.resolve::<DBPool>().unwrap(); shared_pool.get_conn() })?; // somewhere else in your app... let connection: DBConnection = Container::resolve()?; ``` 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. 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)
<![CDATA[An elegant event listener package for 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(&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://miguel.build/b/an-elegant-event-listener-package-for-rust https://miguel.build/b/an-elegant-event-listener-package-for-rust Wed, 20 Dec 2023 14:30:01 GMT ```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(&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)
<![CDATA[A filesystem abstraction layer for 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::<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?; }

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!

View on GitHub

]]>
https://miguel.build/b/a-filesystem-abstraction-layer-for-rust https://miguel.build/b/a-filesystem-abstraction-layer-for-rust Mon, 18 Dec 2023 00:14:30 GMT ```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::<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?; } ``` 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! [View on GitHub](https://github.com/m1guelpf/flysystem)
<![CDATA[An expressive Rust library for interacting with a cache.]]> 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::<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?; }

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.

View on GitHub

]]>
https://miguel.build/b/an-expressive-rust-library-for-interacting-with-a-cache https://miguel.build/b/an-expressive-rust-library-for-interacting-with-a-cache Fri, 15 Dec 2023 22:17:12 GMT ```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::<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?; } ``` 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. [View on GitHub](https://github.com/m1guelpf/amnesia)
<![CDATA[World ID 2.0]]>

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.

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://miguel.build/b/world-id-20 https://miguel.build/b/world-id-20 Wed, 13 Dec 2023 16:42:03 GMT <video controls><source src="https://web-assets.miguel.build/world-id-v2/video.mp4" poster="https://web-assets.miguel.build/world-id-v2/poster.jpg" type="video/mp4"></video> 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. 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)
<![CDATA[A personal wearable AI]]>

I recently flew to SF to help my friend Avi 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.

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!

Watch Avi introduce Tab

]]>
https://miguel.build/b/a-personal-wearable-ai https://miguel.build/b/a-personal-wearable-ai Wed, 04 Oct 2023 00:24:38 GMT ![](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'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'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! [Watch Avi introduce Tab](https://twitter.com/AviSchiffmann/status/1708439854005321954)
<![CDATA[Building the ultimate Mario game]]>

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.

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

Watch on YouTube

]]>
https://miguel.build/b/building-the-ultimate-mario-game https://miguel.build/b/building-the-ultimate-mario-game Sun, 10 Sep 2023 08:13:46 GMT <video controls><source src="https://web-assets.miguel.build/mariogpt/video.mp4" poster="https://web-assets.miguel.build/mariogpt/poster.jpg" type="video/mp4"></video> 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. I'm super happy with how everything turned out, and I hope you'll enjoy it! [Watch on YouTube](https://youtu.be/Wqm1c0A6zkk)
<![CDATA[My Rust ML library is finally ready!]]> 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<Self>; /// Run a prediction on the model fn predict(&self, input: Self::Request) -> Result<Self::Response>; } cog_rust::start!(MyModel);

When I started working on a Rust version of Cog (Replicate'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!

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.

View on GitHub

]]>
https://miguel.build/b/my-rust-ml-library-is-finally-ready https://miguel.build/b/my-rust-ml-library-is-finally-ready Wed, 16 Aug 2023 17:21:37 GMT ```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<Self>; /// Run a prediction on the model fn predict(&self, input: Self::Request) -> Result<Self::Response>; } cog_rust::start!(MyModel); ``` When I [started working on a Rust version of Cog](#rust-containers-for-machine-learning) ([Replicate](https://replicate.com)'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'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)
<![CDATA[The quickest way to commit your code]]>

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.

It was inspired by this TailwindUI template, 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://miguel.build/b/the-quickest-way-to-commit-your-code https://miguel.build/b/the-quickest-way-to-commit-your-code Mon, 14 Aug 2023 15:01:26 GMT <video controls><source src="https://web-assets.miguel.build/commit/video.mp4" poster="https://web-assets.miguel.build/commit/poster.jpg" muted type="video/mp4"></video> 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. 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)
<![CDATA[Taking the pain out of running AI models locally]]>

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 Replicate of sorts, which makes running a new model as easy as writing its name and using the auto-generated interface or API.

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!

View on GitHub

]]>
https://miguel.build/b/taking-the-pain-out-of-running-ai-models-locally https://miguel.build/b/taking-the-pain-out-of-running-ai-models-locally Tue, 18 Jul 2023 20:04:18 GMT ![](https://web-assets.miguel.build/dyson.jpeg) 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 [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'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! [View on GitHub](https://github.com/m1guelpf/dyson)
<![CDATA[Rust containers for Machine Learning]]> 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<Self> { Ok(Self { prefix: "hello".to_string(), }) } fn predict(&self, input: Self::Request) -> Result<Self::Response> { Ok(format!("{} {}", self.prefix, input.text)) } } cog_rust::start!(ExampleModel);

In the past I've used Cog (a Python library by Replicate) to very quickly build and deploy new models. As the state of non-Python models slowly advances (mostly thanks to @ggerganov), I thought a Rust version could unlock extra performance.

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

View on GitHub

]]>
https://miguel.build/b/rust-containers-for-machine-learning https://miguel.build/b/rust-containers-for-machine-learning Wed, 07 Jun 2023 20:59:13 GMT ```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<Self> { Ok(Self { prefix: "hello".to_string(), }) } fn predict(&self, input: Self::Request) -> Result<Self::Response> { Ok(format!("{} {}", self.prefix, input.text)) } } cog_rust::start!(ExampleModel); ``` In the past I'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's already usable locally! [View on GitHub](https://github.com/m1guelpf/cog-rust)
<![CDATA[web3 app starter]]>

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'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://miguel.build/b/web3-app-starter https://miguel.build/b/web3-app-starter Wed, 31 May 2023 01:51:46 GMT <video controls><source src="https://web-assets.miguel.build/web3-app-starter/demo.mp4" poster="https://web-assets.miguel.build/web3-app-starter/poster.jpeg" muted type="video/mp4"></video> 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'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)
<![CDATA[New website!]]>

I've felt like my old website 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.

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!

Share your thoughts on Twitter

]]>
https://miguel.build/b/new-website https://miguel.build/b/new-website Thu, 25 May 2023 06:16:04 GMT <video controls><source src="https://web-assets.miguel.build/new-website/video.mp4" poster="https://web-assets.miguel.build/new-website/poster.jpeg" muted type="video/mp4"></video> I've felt like [my old website](https://2022.miguel.build) 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. 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! [Share your thoughts on Twitter](https://twitter.com/m1guelpf/status/1661617108742971392)
<![CDATA[An API for ENS data]]> enstate.rs - querying ens information should be easy.

I really like the idea of ENS being "the universal profile", 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 to build a dead-simple API that returns all relevant attributes for an ENS name.

View on GitHub

]]>
https://miguel.build/b/an-api-for-ens-data https://miguel.build/b/an-api-for-ens-data Sat, 20 May 2023 18:15:31 GMT ![enstate.rs - querying ens information should be easy.](https://web-assets.miguel.build/enstate-card.jpeg) I really like the idea of ENS being "the universal profile", 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)
<![CDATA[My first real attempt at a YouTube video]]>

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!

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://miguel.build/b/my-first-real-attempt-at-a-youtube-video https://miguel.build/b/my-first-real-attempt-at-a-youtube-video Sun, 26 Mar 2023 16:00:43 GMT <video controls><source src="https://web-assets.miguel.build/first-youtube-video/trailer.mp4" poster="https://web-assets.miguel.build/first-youtube-video/poster.jpeg" type="video/mp4"></video> 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! 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)
<![CDATA[A new design for the Worldcoin Docs]]>

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://miguel.build/b/a-new-design-for-the-worldcoin-docs https://miguel.build/b/a-new-design-for-the-worldcoin-docs Tue, 14 Mar 2023 22:11:12 GMT ![](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)
<![CDATA[ChatGPT for your docs]]>

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.

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.

]]>
https://miguel.build/b/chatgpt-for-your-docs https://miguel.build/b/chatgpt-for-your-docs Mon, 06 Feb 2023 22:24:20 GMT <video controls><source src="https://web-assets.miguel.build/clippy/video.mp4" poster="https://web-assets.miguel.build/clippy/poster.jpg" muted type="video/mp4"></video> 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. 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.
<![CDATA[Baby's first Transformer model]]>

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 ✨

Watch the lecture

]]>
https://miguel.build/b/babys-first-transformer-model https://miguel.build/b/babys-first-transformer-model Thu, 19 Jan 2023 03:24:03 GMT ![](https://web-assets.miguel.build/first-transformer.jpg) 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 ✨ [Watch the lecture](https://www.youtube.com/watch?v=kCc8FmEb1nY)
<![CDATA[An iOS widget for Worldcoin]]>

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? 👀

]]>
https://miguel.build/b/an-ios-widget-for-worldcoin https://miguel.build/b/an-ios-widget-for-worldcoin Wed, 18 Jan 2023 03:00:07 GMT ![](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't share the code, but hopefully we have some public endpoints soon? 👀
<![CDATA[Copilot, but for your terminal]]>

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://miguel.build/b/copilot-but-for-your-terminal https://miguel.build/b/copilot-but-for-your-terminal Wed, 14 Dec 2022 13:25:16 GMT <video controls><source src="https://web-assets.miguel.build/plz-cli/video.mp4" poster="https://web-assets.miguel.build/plz-cli/poster.jpg" muted type="video/mp4"></video> 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)
<![CDATA[Adding live output to my ChatGPT Telegram bot]]>

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!

Try it out

]]>
https://miguel.build/b/adding-live-output-to-my-chatgpt-telegram-bot https://miguel.build/b/adding-live-output-to-my-chatgpt-telegram-bot Tue, 06 Dec 2022 20:28:44 GMT <video controls><source src="https://web-assets.miguel.build/chatgpt-telegram-live/video.mp4" poster="https://web-assets.miguel.build/chatgpt-telegram-live/poster.jpg" muted type="video/mp4"></video> 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! [Try it out](https://github.com/m1guelpf/chatgpt-telegram)
<![CDATA[A Telegram bot for ChatGPT]]>

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://miguel.build/b/a-telegram-bot-for-chatgpt https://miguel.build/b/a-telegram-bot-for-chatgpt Sun, 04 Dec 2022 04:09:27 GMT ![](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)
<![CDATA[A better ChatGPT interface]]>

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.

]]>
https://miguel.build/b/a-better-chatgpt-interface https://miguel.build/b/a-better-chatgpt-interface Fri, 02 Dec 2022 20:39:19 GMT <video controls><source src="https://web-assets.miguel.build/chatgpt-concept/video.mp4" poster="https://web-assets.miguel.build/chatgpt-concept/poster.jpg" muted type="video/mp4"></video> 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.
<![CDATA[Deploying Stable Diffusion models to Replicate]]>

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).

Watch on YouTube

]]>
https://miguel.build/b/deploying-stable-diffusion-models-to-replicate https://miguel.build/b/deploying-stable-diffusion-models-to-replicate Thu, 24 Nov 2022 03:00:23 GMT <video controls><source src="https://web-assets.miguel.build/replicate-guide/trailer.mp4" poster="https://web-assets.miguel.build/replicate-guide/poster.jpg" type="video/mp4"></video> 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). [Watch on YouTube](https://youtu.be/Kxlcj7BnO8I)
<![CDATA[Using GPT-3 to write commit messages]]>

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.

Try it out

]]>
https://miguel.build/b/using-gpt-3-to-write-commit-messages https://miguel.build/b/using-gpt-3-to-write-commit-messages Mon, 31 Oct 2022 17:00:14 GMT <video controls><source src="https://web-assets.miguel.build/auto-commit/video.mp4" poster="https://web-assets.miguel.build/auto-commit/poster.jpg" muted type="video/mp4"></video> 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. [Try it out](https://github.com/m1guelpf/auto-commit)
<![CDATA[Script-writing app progress update]]>

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.

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

Get on the waitlist

]]>
https://miguel.build/b/script-writing-app-progress-update https://miguel.build/b/script-writing-app-progress-update Sat, 22 Oct 2022 07:51:47 GMT ![](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'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. Feels really crazy how fast I can go from "i wish this existed" to a prototype, coding really is a magical skill ✨ [Get on the waitlist](https://scripty.vercel.app)
<![CDATA[Concept for a script-writing app]]> 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 "Script", "Scenes", "Inspiration", "Feeling Stuck?", and "All Projects"), 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 "Edit scene" menu is shown, with some form fields ("name", "highlight color" and "description"), and a list of scene appearances.

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.

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.

Get on the waitlist

]]>
https://miguel.build/b/concept-for-a-script-writing-app https://miguel.build/b/concept-for-a-script-writing-app Mon, 17 Oct 2022 08:43:35 GMT ![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 "Script", "Scenes", "Inspiration", "Feeling Stuck?", and "All Projects"), 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 "Edit scene" menu is shown, with some form fields ("name", "highlight color" and "description"), and a list of scene appearances.](https://web-assets.miguel.build/scripty-concept.jpg) 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. 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. [Get on the waitlist](https://scripty.vercel.app)
<![CDATA[Explaining web3 to a non-crypto friend]]>

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.

]]>
https://miguel.build/b/explaining-web3-to-a-non-crypto-friend https://miguel.build/b/explaining-web3-to-a-non-crypto-friend Sun, 09 Oct 2022 15:49:06 GMT <video controls><source src="https://web-assets.miguel.build/web3-explainer/video.mp4" poster="https://web-assets.miguel.build/web3-explainer/poster.jpg" type="video/mp4"></video> 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.
<![CDATA[New World ID docs]]>

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://miguel.build/b/new-world-id-docs https://miguel.build/b/new-world-id-docs Fri, 30 Sep 2022 13:46:49 GMT ![](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)
<![CDATA[Image support for Lens Reflect]]>

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://miguel.build/b/image-support-for-lens-reflect https://miguel.build/b/image-support-for-lens-reflect Thu, 29 Sep 2022 15:09:26 GMT ![](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)
<![CDATA[A simple API for Whisper]]> // 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' }, }), })

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!

Try it out!

]]>
https://miguel.build/b/a-simple-api-for-whisper https://miguel.build/b/a-simple-api-for-whisper Mon, 26 Sep 2022 17:51:19 GMT ```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' }, }), }) ``` 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! [Try it out!](https://replicate.com/m1guelpf/whisper-subtitles)
<![CDATA[Dynamic location for my website]]>

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's how I built it

]]>
https://miguel.build/b/dynamic-location-for-my-website https://miguel.build/b/dynamic-location-for-my-website Wed, 07 Sep 2022 10:00:13 GMT ![](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's how I built it](https://twitter.com/m1guelpf/status/1567452672877563904)
<![CDATA["Now Playing" tile for my website]]>

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.

]]>
https://miguel.build/b/now-playing-tile-for-my-website https://miguel.build/b/now-playing-tile-for-my-website Tue, 06 Sep 2022 02:38:02 GMT <video controls><source src="https://web-assets.miguel.build/now-playing/video.mp4" poster="https://web-assets.miguel.build/now-playing/poster.jpg" type="video/mp4"></video> 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.
<![CDATA[Prototype for ⌘K authentication]]>

Still from a project I never got to release, which used a ⌘K menu for wallet management.

]]>
https://miguel.build/b/prototype-for-k-authentication https://miguel.build/b/prototype-for-k-authentication Sun, 17 Jul 2022 21:56:35 GMT ![](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.
<![CDATA[Gave a TEDx talk]]>

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://miguel.build/b/gave-a-tedx-talk https://miguel.build/b/gave-a-tedx-talk Sat, 18 Jun 2022 16:52:51 GMT ![](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)
<![CDATA[Lenster for iOS]]>

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.

Join the Testflight

]]>
https://miguel.build/b/lenster-for-ios https://miguel.build/b/lenster-for-ios Fri, 27 May 2022 02:25:28 GMT ![](https://web-assets.miguel.build/lenster-ios.jpg) 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. [Join the Testflight](https://testflight.apple.com/join/yrsLAMu5)
<![CDATA[Cleaning up my Twitter timeline]]>

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.

]]>
https://miguel.build/b/cleaning-up-my-twitter-timeline https://miguel.build/b/cleaning-up-my-twitter-timeline Sun, 15 May 2022 06:30:14 GMT <video controls><source src="https://web-assets.miguel.build/feedclean/video.mp4" poster="https://web-assets.miguel.build/feedclean/poster.jpg" muted type="video/mp4"></video> 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.
<![CDATA[Recording a TV documentary]]>

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!

]]>
https://miguel.build/b/recording-a-tv-documentary https://miguel.build/b/recording-a-tv-documentary Sun, 13 Mar 2022 14:16:55 GMT ![](https://web-assets.miguel.build/documentary/room.jpg) ![](https://web-assets.miguel.build/documentary/cam.jpg) 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!
<![CDATA[Running an Ethereum archive at home]]> Finally managed to get an Ethereum archive node running at home, and point all my wallets & apps to it. Self-sovereignty feels great, and RPC calls are much faster too!

]]>
https://miguel.build/b/running-an-ethereum-archive-at-home https://miguel.build/b/running-an-ethereum-archive-at-home Sat, 12 Mar 2022 16:55:28 GMT Finally managed to get an Ethereum archive node running at home, and point all my wallets & apps to it. Self-sovereignty feels great, and RPC calls are much faster too!
<![CDATA[Making web apps in Solidity]]>

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://miguel.build/b/making-web-apps-in-solidity https://miguel.build/b/making-web-apps-in-solidity Sat, 01 Jan 2022 21:18:18 GMT <video controls><source src="https://web-assets.miguel.build/solidity-web/video.mp4" poster="https://web-assets.miguel.build/solidity-web/poster.jpg" muted type="video/mp4"></video> 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)
<![CDATA[Animated fractal experiments]]>

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://miguel.build/b/animated-fractal-experiments https://miguel.build/b/animated-fractal-experiments Wed, 24 Nov 2021 04:05:21 GMT <video controls><source src="https://web-assets.miguel.build/fractal-experiments/video.mp4" poster="https://web-assets.miguel.build/fractal-experiments/poster.jpg" muted type="video/mp4"></video> 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)
<![CDATA[Necromint contract]]> //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 < 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); } }

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

View on Etherscan

]]>
https://miguel.build/b/necromint-contract https://miguel.build/b/necromint-contract Fri, 08 Oct 2021 16:23:39 GMT ```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 < 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); } } ``` Built an ERC721 contract that allows you to resurrect burned NFTs, inspired by Dom Hofmann [View on Etherscan](https://etherscan.io/address/0x9A652E434250f29972A79B726F2e78974140BB8c)
<![CDATA[Roam Research iOS app]]>

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.

Join the TestFlight

]]>
https://miguel.build/b/roam-research-ios-app https://miguel.build/b/roam-research-ios-app Sun, 08 Aug 2021 03:21:38 GMT <video controls><source src="https://web-assets.miguel.build/roam-research-app/video.mp4" poster="https://web-assets.miguel.build/roam-research-app/poster.jpg" muted type="video/mp4"></video> 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. [Join the TestFlight](https://testflight.apple.com/join/80wiqrUd)
<![CDATA[DM Newsletters on Twitter]]>

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://miguel.build/b/dm-newsletters-on-twitter https://miguel.build/b/dm-newsletters-on-twitter Tue, 09 Mar 2021 16:41:21 GMT ![](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)
<![CDATA[Spoke at Laravel Worldwide Meetup]]>

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

Watch on YouTube

]]>
https://miguel.build/b/spoke-at-laravel-worldwide-meetup https://miguel.build/b/spoke-at-laravel-worldwide-meetup Tue, 23 Mar 2021 20:31:09 GMT ![](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)
<![CDATA[3D experiments]]>

Played around with physics-based animations in Blender. Not super fancy-looking but hey, physics!

]]>
https://miguel.build/b/3d-experiments https://miguel.build/b/3d-experiments Fri, 19 Feb 2021 12:39:17 GMT <video controls><source src="https://web-assets.miguel.build/3d-experiments/video.mp4" poster="https://web-assets.miguel.build/3d-experiments/poster.jpg" muted type="video/mp4"></video> Played around with physics-based animations in Blender. Not super fancy-looking but hey, physics!
<![CDATA[Sign in with Apple on the web]]>

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

View on GitHub

]]>
https://miguel.build/b/sign-in-with-apple-on-the-web https://miguel.build/b/sign-in-with-apple-on-the-web Wed, 27 Jan 2021 03:00:00 GMT <video controls><source src="https://web-assets.miguel.build/laravel-apple-sign-in/video.mp4" poster="https://web-assets.miguel.build/laravel-apple-sign-in/poster.jpg" muted type="video/mp4"></video> Built a Laravel package to easily add Sign in with Apple to your app. [View on GitHub](https://github.com/m1guelpf/laravel-apple-login)
<![CDATA[A WebAuthn Laravel package]]>

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

View on GitHub

]]>
https://miguel.build/b/a-webauthn-laravel-package https://miguel.build/b/a-webauthn-laravel-package Fri, 22 Jan 2021 16:54:42 GMT <video controls><source src="https://web-assets.miguel.build/laravel-webauthn/demo.mp4" poster="https://web-assets.miguel.build/laravel-webauthn/poster.jpg" muted type="video/mp4"></video> Built a simple Laravel package that makes integrating WebAuthn into your app a breeze. [View on GitHub](https://github.com/m1guelpf/laravel-fastlogin)
<![CDATA[Landing page design]]>

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.

]]>
https://miguel.build/b/landing-page-design https://miguel.build/b/landing-page-design Sun, 07 Jun 2020 00:11:59 GMT ![](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.
<![CDATA[A new book-reading experience]]>

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.

See the process

]]>
https://miguel.build/b/a-new-book-reading-experience https://miguel.build/b/a-new-book-reading-experience Wed, 20 May 2020 11:41:47 GMT <video controls><source src="https://web-assets.miguel.build/book-stories/video.mp4" poster="https://web-assets.miguel.build/book-stories/poster.jpg" muted type="video/mp4"></video> 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. [See the process](https://twitter.com/m1guelpf/status/1263072424771440641)
<![CDATA[Shortcut macOS app]]>

I wanted a desktop app for Shortcut (previously Clubhouse), but they aren't planning to release one soon, so I made it myself.

]]>
https://miguel.build/b/shortcut-macos-app https://miguel.build/b/shortcut-macos-app Sun, 15 Mar 2020 13:03:38 GMT <video controls><source src="https://web-assets.miguel.build/clubhouse-macos/video.mp4" poster="https://web-assets.miguel.build/clubhouse-macos/poster.jpg" muted type="video/mp4"></video> I wanted a desktop app for Shortcut (previously Clubhouse), but they aren't planning to release one soon, so I made it myself.
<![CDATA[Neumorphic Sitesauce prototype]]>

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 & UX I could provide.

View full redesign

]]>
https://miguel.build/b/neumorphic-sitesauce-prototype https://miguel.build/b/neumorphic-sitesauce-prototype Tue, 18 Feb 2020 00:13:32 GMT <video controls><source src="https://web-assets.miguel.build/neumorphic-sitesauce/video.mp4" poster="https://web-assets.miguel.build/neumorphic-sitesauce/poster.jpg" muted type="video/mp4"></video> 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 & UX I could provide. [View full redesign](https://twitter.com/m1guelpf/status/1229559537289637890)
<![CDATA[Reverse-engineering Byte]]>

Spent some time reverse-engineering the Byte API, and managed to upload a video from outside the app!

]]>
https://miguel.build/b/reverse-engineering-byte https://miguel.build/b/reverse-engineering-byte Sat, 25 Jan 2020 18:48:46 GMT <video controls><source src="https://web-assets.miguel.build/byte-re/video.mp4" poster="https://web-assets.miguel.build/byte-re/poster.jpg" muted type="video/mp4"></video> Spent some time reverse-engineering the Byte API, and managed to upload a video from outside the app!
<![CDATA[Sitesauce UI refresh]]>

I took some time this weekend to rebuild the entire Sitesauce UI from scratch (for like 3rd time!). Happy with this iteration so far.

]]>
https://miguel.build/b/sitesauce-ui-refresh https://miguel.build/b/sitesauce-ui-refresh Sun, 10 Nov 2019 17:57:26 GMT <video controls><source src="https://web-assets.miguel.build/sitesauce-ui/video.mp4" poster="https://web-assets.miguel.build/sitesauce-ui/poster.jpg" type="video/mp4"></video> I took some time this weekend to rebuild the entire Sitesauce UI from scratch (for like 3rd time!). Happy with this iteration so far.
<![CDATA[Skeuomorphic credit card input]]>

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.

]]>
https://miguel.build/b/skeuomorphic-credit-card-input https://miguel.build/b/skeuomorphic-credit-card-input Thu, 24 Oct 2019 21:20:11 GMT <video controls><source src="https://web-assets.miguel.build/skeuomorphic-cc/video.mp4" poster="https://web-assets.miguel.build/skeuomorphic-cc/poster.jpg" muted type="video/mp4"></video> 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.
<![CDATA[Secret project prototype]]>

Secret project video update: Been working on polishing UX & onboarding experience. Hoping to announce it very soon!

]]>
https://miguel.build/b/secret-project-prototype https://miguel.build/b/secret-project-prototype Fri, 06 Sep 2019 16:22:25 GMT <video controls><source src="https://web-assets.miguel.build/sitesauce-prototype/video.mp4" poster="https://web-assets.miguel.build/sitesauce-prototype/poster.jpg" muted type="video/mp4"></video> Secret project video update: Been working on polishing UX & onboarding experience. Hoping to announce it very soon!
<![CDATA[My first ever (un)conference talk!]]>

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?

]]>
https://miguel.build/b/my-first-ever-unconference-talk https://miguel.build/b/my-first-ever-unconference-talk Sun, 01 Sep 2019 21:46:35 GMT ![](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'll be on the main stage next year?
<![CDATA[Custom backgrounds]]>

Designed some new backgrounds for my devices, showing all the logos from past projects and my branding ✨

]]>
https://miguel.build/b/custom-backgrounds https://miguel.build/b/custom-backgrounds Wed, 17 Jul 2019 15:47:01 GMT ![](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 ✨
<![CDATA[A Chrome extension to focus on your email]]>

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://miguel.build/b/a-chrome-extension-to-focus-on-your-email https://miguel.build/b/a-chrome-extension-to-focus-on-your-email Wed, 17 Jul 2019 11:13:40 GMT ![](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)
<![CDATA[A theme uploader for Ghost]]>

A Ghost theme marketplace prototype that could directly upload and update Ghost themes using undocumented API endpoints. Built in under two hours while streaming!

]]>
https://miguel.build/b/a-theme-uploader-for-ghost https://miguel.build/b/a-theme-uploader-for-ghost Fri, 28 Jun 2019 12:41:25 GMT <video controls><source src="https://web-assets.miguel.build/connla/video.mp4" poster="https://web-assets.miguel.build/connla/poster.jpg" muted type="video/mp4"></video> A Ghost theme marketplace prototype that could directly upload and update Ghost themes using undocumented API endpoints. Built in under two hours while streaming!
<![CDATA[Launchpad OBS controls]]>

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!

]]>
https://miguel.build/b/launchpad-obs-controls https://miguel.build/b/launchpad-obs-controls Wed, 26 Jun 2019 10:54:10 GMT <video controls><source src="https://web-assets.miguel.build/launchpad-obs/video.mp4" poster="https://web-assets.miguel.build/launchpad-obs/poster.jpg" muted type="video/mp4"></video> 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!
<![CDATA[Blog redesign prototype]]>

An early version of my website's redesign which I ended up discarding.

]]>
https://miguel.build/b/blog-redesign-prototype https://miguel.build/b/blog-redesign-prototype Sat, 22 Jun 2019 14:09:52 GMT <video controls><source src="https://web-assets.miguel.build/old-blog-themes/video.mp4" poster="https://web-assets.miguel.build/old-blog-themes/poster.jpg" muted type="video/mp4"></video> An early version of my website's redesign which I ended up discarding.
<![CDATA[Things web logger]]>

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.

View on GitHub

]]>
https://miguel.build/b/things-web-logger https://miguel.build/b/things-web-logger Thu, 13 Jun 2019 13:30:22 GMT <video controls><source src="https://web-assets.miguel.build/things-web-logger/video.mp4" poster="https://web-assets.miguel.build/things-web-logger/poster.jpg" muted type="video/mp4"></video> 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. [View on GitHub](https://github.com/m1guelpf/send-to-things)
<![CDATA[Blogcast onboarding prototype]]>

Built a nice onboarding for Blogcast, which explains the service and guides you while adding your first article, importing and enabling sync.

]]>
https://miguel.build/b/blogcast-onboarding-prototype https://miguel.build/b/blogcast-onboarding-prototype Mon, 22 Apr 2019 22:44:21 GMT <video controls><source src="https://web-assets.miguel.build/blogcast-onboarding/video.mp4" poster="https://web-assets.miguel.build/blogcast-onboarding/poster.jpg" muted type="video/mp4"></video> Built a nice onboarding for Blogcast, which explains the service and guides you while adding your first article, importing and enabling sync.
<![CDATA[Snaptier designs]]>

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.

]]>
https://miguel.build/b/snaptier-designs https://miguel.build/b/snaptier-designs Sun, 31 Mar 2019 22:44:21 GMT ![](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.
<![CDATA[Turn your blog into a podcast]]>

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!

View on Product Hunt

]]>
https://miguel.build/b/turn-your-blog-into-a-podcast https://miguel.build/b/turn-your-blog-into-a-podcast Thu, 21 Mar 2019 07:00:16 GMT ![](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'm happy to say I did it! [View on Product Hunt](https://www.producthunt.com/posts/blogcast)
<![CDATA[Website redesign]]>

Redesigned my website yet again, this time with a much cleaner look and cards for the articles. Also, dark mode!

]]>
https://miguel.build/b/website-redesign https://miguel.build/b/website-redesign Wed, 23 Jan 2019 00:02:59 GMT ![](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!
<![CDATA[Blogcast UI]]>

Finally finished working on the UI flow for my new article-to-audio product! Still things to tweak, but here's an early preview.

]]>
https://miguel.build/b/blogcast-ui https://miguel.build/b/blogcast-ui Fri, 18 Jan 2019 17:55:53 GMT <video controls><source src="https://web-assets.miguel.build/blogcast-ui/video.mp4" poster="https://web-assets.miguel.build/blogcast-ui/poster.jpg" muted type="video/mp4"></video> Finally finished working on the UI flow for my new article-to-audio product! Still things to tweak, but here's an early preview.
<![CDATA[A better Patreon for makers]]>

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.

]]>
https://miguel.build/b/a-better-patreon-for-makers https://miguel.build/b/a-better-patreon-for-makers Mon, 24 Dec 2018 00:30:23 GMT ![](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.
<![CDATA[An extension to toggle CSS from a website]]>

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!

Install extension

]]>
https://miguel.build/b/an-extension-to-toggle-css-from-a-website https://miguel.build/b/an-extension-to-toggle-css-from-a-website Fri, 07 Dec 2018 08:17:34 GMT ![](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's now available on the Chrome Web Store! [Install extension](https://chrome.google.com/webstore/detail/unstyler/iniahmhgmcmkimliphhbgfkmichgccjd)
<![CDATA[Personal Dashboard]]>

A dynamic dashboard showing my calendar, Twitter interactions, current music, and more. Built with Laravel and Vue.js.

]]>
https://miguel.build/b/personal-dashboard https://miguel.build/b/personal-dashboard Thu, 29 Nov 2018 22:00:28 GMT ![](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.
<![CDATA[Video Embeds for Statamic]]>

My second Statamic addon, which lets you embed videos from YouTube, Vimeo, and Wistia. It also supports custom embeds, and is fully configurable.

]]>
https://miguel.build/b/video-embeds-for-statamic https://miguel.build/b/video-embeds-for-statamic Wed, 18 Jul 2018 19:11:54 GMT <video controls><source src="https://web-assets.miguel.build/statamic-embeds/video.mp4" poster="https://web-assets.miguel.build/statamic-embeds/poster.jpg" muted type="video/mp4"></video> My second Statamic addon, which lets you embed videos from YouTube, Vimeo, and Wistia. It also supports custom embeds, and is fully configurable.
<![CDATA[Beautiful docs for everyone]]>

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!

]]>
https://miguel.build/b/beautiful-docs-for-everyone https://miguel.build/b/beautiful-docs-for-everyone Tue, 19 Jun 2018 09:05:08 GMT ![](https://web-assets.miguel.build/unmarkdocs.png) 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!
<![CDATA[Contributed to the Laravel framework]]> {{-- 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

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

View on GitHub

]]>
https://miguel.build/b/contributed-to-the-laravel-framework https://miguel.build/b/contributed-to-the-laravel-framework Mon, 17 Jul 2017 16:07:53 GMT ```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 ``` 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)
<![CDATA[Learning Laravel]]> 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.

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've been working on an app for joining GitHub organizations, more on that soon!

First OrgManager commit

]]>
https://miguel.build/b/learning-laravel https://miguel.build/b/learning-laravel Fri, 13 Jan 2017 21:01:44 GMT 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. 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've been working on an app for joining GitHub organizations, more on that soon! [First OrgManager commit](https://github.com/orgmanager/orgmanager/commit/f3d37fe15f2d97d758597359346a8c0b9f1a98d8)
<![CDATA[My first 3DS homebrew]]>

Finally managed to get DevKitPro working, and write my first 3DS homebrew!

]]>
https://miguel.build/b/my-first-3ds-homebrew https://miguel.build/b/my-first-3ds-homebrew Tue, 03 Jan 2017 21:01:44 GMT ![](https://web-assets.miguel.build/3ds-homebrew.jpg) Finally managed to get DevKitPro working, and write my first 3DS homebrew!
<![CDATA[ConstitutionDAO]]> [ConstitutionDAO (📜, 📜) (@ConstitutionDAO) on Twitter: We didn'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' 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.

]]>
https://miguel.build/b/constitutiondao https://miguel.build/b/constitutiondao Sat, 13 Nov 2021 04:43:01 GMT [ConstitutionDAO (📜, 📜) (@ConstitutionDAO) on Twitter: We didn'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' 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.
<![CDATA[Laracon Online talk]]> 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

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

Watch on YouTube

]]>
https://miguel.build/b/laracon-online-talk https://miguel.build/b/laracon-online-talk Wed, 17 Mar 2021 19:33:44 GMT [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)
<![CDATA[A Stable Diffusion Twitter bot]]> [Miguel Piedrafita ✨ (@m1guelpf) on Twitter: ✨ Stable Diffusion is amazing, but unfortunately it isn'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's see what you can come up with! 👇](https://twitter.com/m1guelpf/status/1569487042345861121)

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.

]]>
https://miguel.build/b/a-stable-diffusion-twitter-bot https://miguel.build/b/a-stable-diffusion-twitter-bot Tue, 13 Sep 2022 00:44:05 GMT [Miguel Piedrafita ✨ (@m1guelpf) on Twitter: ✨ Stable Diffusion is amazing, but unfortunately it isn'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's see what you can come up with! 👇](https://twitter.com/m1guelpf/status/1569487042345861121) 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.
<![CDATA[A digital pet on the blockchain]]> A digital pet, on the blockchain

🚀 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!

]]>
https://miguel.build/b/a-digital-pet-on-the-blockchain https://miguel.build/b/a-digital-pet-on-the-blockchain Sat, 11 Sep 2021 06:14:09 GMT [![A digital pet, on the blockchain](https://onchain.pet/images/card.jpg)](https://onchain.pet) 🚀 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!
<![CDATA[A new social network]]> Auralite: A new social network for the future - Auralite

Auralite is a new social network built for people. It's mindful of your attention and your privacy. It's gonna be great.

]]>
https://miguel.build/b/a-new-social-network https://miguel.build/b/a-new-social-network Wed, 24 Jun 2020 15:36:49 GMT [![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's mindful of your attention and your privacy. It's gonna be great.
<![CDATA[Embeds for Lens Protocol]]> Easily embed Lens posts anywhere

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 & mirrors.

]]>
https://miguel.build/b/embeds-for-lens-protocol https://miguel.build/b/embeds-for-lens-protocol Sun, 29 May 2022 02:25:30 GMT [![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 & mirrors.
<![CDATA[Breaking on-chain captchas]]> Auto-solving Algoz.xyz's on-chain captchas

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.

]]>
https://miguel.build/b/breaking-on-chain-captchas https://miguel.build/b/breaking-on-chain-captchas Thu, 19 May 2022 03:54:30 GMT [![Auto-solving Algoz.xyz'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.
<![CDATA[Content-gated links for your Lens followers]]> Gated Garden: Links only your Lens followers can access

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.

]]>
https://miguel.build/b/content-gated-links-for-your-lens-followers https://miguel.build/b/content-gated-links-for-your-lens-followers Sun, 05 Jun 2022 02:17:26 GMT [![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 "pay to access" portal when coupled with Lens' superfollows feature.
<![CDATA[A mature content filter using Stable Diffusion]]> Is This Image NSFW?

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!

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.

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://miguel.build/b/a-mature-content-filter-using-stable-diffusion https://miguel.build/b/a-mature-content-filter-using-stable-diffusion Tue, 17 Jan 2023 05:00:07 GMT [![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'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! 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. 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)
<![CDATA[ENS Delegate Checker]]> Who is voting with my $ENS?

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.

]]>
https://miguel.build/b/ens-delegate-checker https://miguel.build/b/ens-delegate-checker Sun, 06 Feb 2022 06:08:45 GMT [![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're currently delegating your $ENS to. Built in response to a controversy one of the top delegates was involved in.
<![CDATA[Hacker News for Lens]]> Refract: Top Links in Crypto

I love Hacker News because of all the amazing articles & repos I've found there over the years. To carry that sentiment into web3, I built a Lens-powered link board.

]]>
https://miguel.build/b/hacker-news-for-lens https://miguel.build/b/hacker-news-for-lens Thu, 26 May 2022 04:52:25 GMT [![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 & repos I've found there over the years. To carry that sentiment into web3, I built a Lens-powered link board.
<![CDATA[An infinite canvas built for brainstorming.]]> 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'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!

View on GitHub

]]>
https://miguel.build/b/an-infinite-canvas-built-for-brainstorming https://miguel.build/b/an-infinite-canvas-built-for-brainstorming Wed, 12 Oct 2022 15:33:19 GMT [![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'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! [View on GitHub](https://github.com/m1guelpf/thought.surf)
<![CDATA[A cute raffle website for rAAVE Bogotá]]> We're giving away 5 rAAVE Bogotá tickets!

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!

]]>
https://miguel.build/b/a-cute-raffle-website-for-raave-bogot https://miguel.build/b/a-cute-raffle-website-for-raave-bogot Tue, 11 Oct 2022 18:33:19 GMT [![We'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!
<![CDATA[Taking back my feed]]> Take back your feed | 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.

]]>
https://miguel.build/b/taking-back-my-feed https://miguel.build/b/taking-back-my-feed Thu, 01 Sep 2022 16:06:32 GMT [![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.
<![CDATA[A simple page about me]]> Miguel Piedrafita

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.

See the inspiration

]]>
https://miguel.build/b/a-simple-page-about-me https://miguel.build/b/a-simple-page-about-me Tue, 26 Jul 2022 02:41:56 GMT [![Miguel Piedrafita](https://miguel.build/images/_site/cv-card.jpg)](/cv) 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. [See the inspiration](https://twitter.com/jackbutcher/status/1551588118947631111)
<![CDATA[Meta tweet]]> Miguel Piedrafita ✨ (@m1guelpf) on Twitter: https://t.co/BUjkIncxfG

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.

]]>
https://miguel.build/b/meta-tweet https://miguel.build/b/meta-tweet Sat, 05 Mar 2022 02:18:49 GMT [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's cache using a reverse-engineered API.
<![CDATA[Spotify OBS widget]]> A Spotify Embed for your Twitch Streams

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.

]]>
https://miguel.build/b/spotify-obs-widget https://miguel.build/b/spotify-obs-widget Thu, 29 Apr 2021 00:01:32 GMT [![A Spotify Embed for your Twitch Streams](https://spotify.m1guelpf.me/card.jpg)](https://spotify.m1guelpf.me/) 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.
<![CDATA[Wallet to Twitter]]> How Traceable is your Ethereum Address?

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.

]]>
https://miguel.build/b/wallet-to-twitter https://miguel.build/b/wallet-to-twitter Wed, 23 Feb 2022 21:53:34 GMT [![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.
<![CDATA[Announcing Sitesauce]]> [Miguel Piedrafita ✨ (@m1guelpf) on Twitter: 🎉 I'm incredibly excited to finally unveil what I'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've been working on it for over a month now, and I'm super excited to see where it goes!

]]>
https://miguel.build/b/announcing-sitesauce https://miguel.build/b/announcing-sitesauce Sun, 13 Oct 2019 15:31:23 GMT [Miguel Piedrafita ✨ (@m1guelpf) on Twitter: 🎉 I'm incredibly excited to finally unveil what I'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've been working on it for over a month now, and I'm super excited to see where it goes!
<![CDATA[Soulbound NFT creator]]> Soulminter

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!

]]>
https://miguel.build/b/soulbound-nft-creator https://miguel.build/b/soulbound-nft-creator Thu, 12 May 2022 17:33:01 GMT [![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!
<![CDATA[A super-simple URL shortener]]> 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.

]]>
https://miguel.build/b/a-super-simple-url-shortener https://miguel.build/b/a-super-simple-url-shortener Tue, 15 Sep 2020 01:55:50 GMT [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.
<![CDATA[A WalletConnect iOS Bridge]]> 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://miguel.build/b/a-walletconnect-ios-bridge https://miguel.build/b/a-walletconnect-ios-bridge Thu, 12 Aug 2021 12:24:03 GMT [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)
<![CDATA[World is now live in the US]]> Ethereum (@ethereum) on Twitter: Ethereum is for humans.

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! 😁

]]>
https://miguel.build/b/world-is-now-live-in-the-us https://miguel.build/b/world-is-now-live-in-the-us Thu, 01 May 2025 07:31:04 GMT [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! 😁
<![CDATA[Launching Sitesauce]]> A static site for your dynamically-generated website

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!

]]>
https://miguel.build/b/launching-sitesauce https://miguel.build/b/launching-sitesauce Fri, 01 May 2020 09:04:39 GMT [![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've been working on it for almost a year now, and I'm super excited to finally share it!
<![CDATA[A lil website to show some of my favourite clothes]]> Miguel's Wardrobe

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!

]]>
https://miguel.build/b/a-lil-website-to-show-some-of-my-favourite-clothes https://miguel.build/b/a-lil-website-to-show-some-of-my-favourite-clothes Sat, 03 Jan 2026 19:40:22 GMT [![Miguel'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'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!
<![CDATA[Announcing World ID]]> Introducing World ID and SDK

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.

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" ⚡

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 😁

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.

]]>
https://miguel.build/b/announcing-world-id https://miguel.build/b/announcing-world-id Tue, 14 Mar 2023 09:41:59 GMT [![Introducing World ID and SDK](https://images.prismic.io/worldcoin-company-website/aTgueHNYClf9n-Q-_introducing-world-id-and-sdk.gif?auto=format%2Ccompress&rect=0%2C0%2C1800%2C945&w=2400&h=1260?v=1)](https://worldcoin.org/blog/announcements/introducing-world-id-and-sdk) 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. 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" ⚡ 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 😁 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.
<![CDATA[Hotlinking for Decentralized Social]]> Lens links that open with your preferred frontend

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.

]]>
https://miguel.build/b/hotlinking-for-decentralized-social https://miguel.build/b/hotlinking-for-decentralized-social Tue, 31 May 2022 21:28:36 GMT [![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'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.
<![CDATA[A leaderboard for Lens]]> Lens Leaderboard: Most followed, active, collected & shared profiles

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.

]]>
https://miguel.build/b/a-leaderboard-for-lens https://miguel.build/b/a-leaderboard-for-lens Mon, 23 May 2022 17:19:18 GMT [![Lens Leaderboard: Most followed, active, collected & shared profiles](https://leaderboard.withlens.app/_next/static/media/card.f9f60b93.jpg)](https://leaderboard.withlens.app) 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.
<![CDATA[A native app for Overseerr]]> Pocket for Seerr App - App Store

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.

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!

View on the App Store

]]>
https://miguel.build/b/a-native-app-for-overseerr https://miguel.build/b/a-native-app-for-overseerr Fri, 28 Nov 2025 14:42:04 GMT [![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'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 "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! [View on the App Store](https://apps.apple.com/app/pocket-for-seerr/id6746105104)
<![CDATA[A new approach to wallet activity]]> GitHub - m1guelpf/wallet-activity: User-friendly Ethereum transaction descriptions.

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).

]]>
https://miguel.build/b/a-new-approach-to-wallet-activity https://miguel.build/b/a-new-approach-to-wallet-activity Thu, 03 Mar 2022 03:13:14 GMT [![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 "contract interaction". I spent the past week working on a solution (and recreating the iOS lockscreen on web to showcase it).
<![CDATA[Worldcoin is out]]> World - The real human network.

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. Download the World App, find your nearest orb, and join the network!

]]>
https://miguel.build/b/worldcoin-is-out https://miguel.build/b/worldcoin-is-out Mon, 24 Jul 2023 13:25:04 GMT [![World - The real human network.](https://images.prismic.io/worldcoin-company-website/aV58k3NYClf9o3Py_General.png?auto=format%2Ccompress&w=2400&h=1260)](https://worldcoin.org/home) 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. [Download the World App](https://worldcoin.org/download), find your nearest orb, and join the network!
<![CDATA[YouTube subtitle generator update]]> GitHub - m1guelpf/yt-whisper: Using OpenAI's Whisper to automatically generate YouTube subtitles

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

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.

]]>
https://miguel.build/b/youtube-subtitle-generator-update https://miguel.build/b/youtube-subtitle-generator-update Fri, 14 Oct 2022 22:39:44 GMT [![GitHub - m1guelpf/yt-whisper: Using OpenAI's Whisper to automatically generate YouTube subtitles](https://opengraph.githubassets.com/546ed4c727d9d06e94b35869cd05fcdfdc2474de2735b48b832c145d686be6df/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's Whisper model). 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.
<![CDATA[Sign in with Ethereum for Next.js v13 Template]]> GitHub - m1guelpf/nextjs13-connectkit-siwe: Using ConnectKit's SIWE with the Next.js v13 App Router

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.

]]>
https://miguel.build/b/sign-in-with-ethereum-for-nextjs-v13-template https://miguel.build/b/sign-in-with-ethereum-for-nextjs-v13-template Sun, 14 May 2023 09:51:25 GMT [![GitHub - m1guelpf/nextjs13-connectkit-siwe: Using ConnectKit'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's integration only supports API routes, so I built a lil starter kit showing how to use it with app routes.
<![CDATA[Axum Middleware for Signed URLs]]> GitHub - m1guelpf/axum-signed-urls: Signed URL middleware for Axum, using extractors.

After experimenting with Rust backends recently, I decided to rebuild one of my favourite features from the Laravel framework: Signed URLs.

]]>
https://miguel.build/b/axum-middleware-for-signed-urls https://miguel.build/b/axum-middleware-for-signed-urls Thu, 09 Feb 2023 04:12:29 GMT [![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.
<![CDATA[Proof of KYC contract]]> GitHub - m1guelpf/proof-of-kyc: An NFT that proves you've gone through an identity verification process, powered by Stripe Identity.

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.

]]>
https://miguel.build/b/proof-of-kyc-contract https://miguel.build/b/proof-of-kyc-contract Sat, 16 Oct 2021 01:14:16 GMT [![GitHub - m1guelpf/proof-of-kyc: An NFT that proves you'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'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.
<![CDATA[Writing a Docker image runner from scratch 🦀]]> GitHub - m1guelpf/lil-docker: An intentionally-limited Rust implementation of the Docker runtime with no external dependencies.

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!

]]>
https://miguel.build/b/writing-a-docker-image-runner-from-scratch https://miguel.build/b/writing-a-docker-image-runner-from-scratch Sat, 24 Dec 2022 16:08:47 GMT [![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!
<![CDATA[Showing my Lens posts on my website]]> Hey

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.

]]>
https://miguel.build/b/showing-my-lens-posts-on-my-website https://miguel.build/b/showing-my-lens-posts-on-my-website Sat, 21 May 2022 03:31:24 GMT [![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.
<![CDATA[A simple ERC721 drop contract]]> GitHub - m1guelpf/erc721-drop: A simple ERC721 drop implementation, using Forge and Solmate.

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.

]]>
https://miguel.build/b/a-simple-erc721-drop-contract https://miguel.build/b/a-simple-erc721-drop-contract Thu, 30 Dec 2021 01:19:41 GMT [![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.
<![CDATA[The best OpenAI DevEx in Swift]]> GitHub - m1guelpf/swift-openai-responses: Hand-crafted Swift SDK for the OpenAI Responses API.

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!

]]>
https://miguel.build/b/the-best-openai-devex-in-swift https://miguel.build/b/the-best-openai-devex-in-swift Wed, 24 Sep 2025 16:48:28 GMT [![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!
<![CDATA[Copilot, but worse]]> GitHub - m1guelpf/ai-code: copilot, but worse

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.

]]>
https://miguel.build/b/copilot-but-worse https://miguel.build/b/copilot-but-worse Fri, 04 Nov 2022 03:02:25 GMT [![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's code on the fly, and then runs it.
<![CDATA[Nouns text-to-image dataset]]> GitHub - m1guelpf/nouns-dataset: A HuggingFace text-to-image dataset for Nouns

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://miguel.build/b/nouns-text-to-image-dataset https://miguel.build/b/nouns-text-to-image-dataset Sun, 25 Sep 2022 06:44:25 GMT [![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)
<![CDATA[A simple job queue for Rust]]> GitHub - m1guelpf/redeez-rs: A simplified general-purpose queueing system for Rust apps.

I had my friend Luc over last weekend, and he walked me through basic Redis commands & 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!

]]>
https://miguel.build/b/a-simple-job-queue-for-rust https://miguel.build/b/a-simple-job-queue-for-rust Mon, 16 Jan 2023 14:00:16 GMT [![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 & 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!
<![CDATA[Building a web framework from scratch 🦀]]> GitHub - m1guelpf/lil-http-rs: A Rust web framework with no external dependencies

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.

Wouldn't recommend using it in prod, but I'm super happy with how the DX turned out.

]]>
https://miguel.build/b/building-a-web-framework-from-scratch https://miguel.build/b/building-a-web-framework-from-scratch Wed, 28 Dec 2022 09:52:29 GMT [![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'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't recommend using it in prod, but I'm super happy with how the DX turned out.
<![CDATA[Universal airdrop contract]]> GitHub - worldcoin/hyperdrop-contracts: A contract that splits any token it receives between all humans

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!

]]>
https://miguel.build/b/universal-airdrop-contract https://miguel.build/b/universal-airdrop-contract Sat, 14 May 2022 01:17:49 GMT [![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!
<![CDATA[Onchain Connect 4]]> GitHub - m1guelpf/connect4-sol: An optimised Connect4 game implementation on Solidity

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).

]]>
https://miguel.build/b/onchain-connect-4 https://miguel.build/b/onchain-connect-4 Mon, 31 Jan 2022 04:29:34 GMT [![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).
<![CDATA[A fridge for your zorbs]]> GitHub - m1guelpf/zorb-fridge: Zorbs shift when transferred. The Zorb Fridge allows you to freeze them.

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 & Solmate).

]]>
https://miguel.build/b/a-fridge-for-your-zorbs https://miguel.build/b/a-fridge-for-your-zorbs Mon, 03 Jan 2022 03:16:37 GMT [![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't change (built with Foundry & Solmate).
<![CDATA[Rebuilding the ENS contracts]]> GitHub - m1guelpf/ens-contracts-blindrun: For Solidity practice, I tried to rebuild the base ENS contracts from the EIP-137.

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).

]]>
https://miguel.build/b/rebuilding-the-ens-contracts https://miguel.build/b/rebuilding-the-ens-contracts Sun, 02 Jan 2022 20:23:57 GMT [![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).
<![CDATA[ERC20 NFT airdrop contract]]> GitHub - m1guelpf/nft-token-drop: A drop-in contract to airdrop all current holders of an NFT with an ERC20 token

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 & Rari Capital's solmate for gas optimization magic)

]]>
https://miguel.build/b/erc20-nft-airdrop-contract https://miguel.build/b/erc20-nft-airdrop-contract Tue, 04 Jan 2022 18:32:59 GMT [![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 & Rari Capital's solmate for gas optimization magic)
<![CDATA[A better DX for Rive data binding on iOS]]> 🚧 Automatically generate data-binding types from Rive files by m1guelpf · Pull Request #377 · rive-app/rive-ios

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.

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!

]]>
https://miguel.build/b/a-better-dx-for-rive-data-binding-on-ios https://miguel.build/b/a-better-dx-for-rive-data-binding-on-ios Wed, 11 Jun 2025 22:21:29 GMT [![🚧 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'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's just a proof of concept right now, but hopefully will eventually get pulled in!
<![CDATA[Standard Webhooks for Swift]]> GitHub - m1guelpf/swift-standard-webhooks: A Swift implementation of the Standard Webhooks specification.

I recently learned about the Standard Webhooks spec, 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's webhooks (which follow the standard) on a Swift server, so I ended up building a package that handles both signing and verifying.

]]>
https://miguel.build/b/standard-webhooks-for-swift https://miguel.build/b/standard-webhooks-for-swift Fri, 11 Jul 2025 20:07:11 GMT [![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's webhooks (which follow the standard) on a Swift server, so I ended up building a package that handles both signing and verifying.
<![CDATA[Named routes for server-side Swift]]> GitHub - m1guelpf/ziggy-vapor: Named routes for your Vapor app, both on Swift and on Javascript!

Continuing my exploration of server-side Swift, I've built a small library that lets you name your Vapor 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!

]]>
https://miguel.build/b/named-routes-for-server-side-swift https://miguel.build/b/named-routes-for-server-side-swift Fri, 24 May 2024 14:07:05 GMT [![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'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!
<![CDATA[Ethereum Virtual Machine in PHP]]> GitHub - m1guelpf/php-evm: "lol. lmao" - m1guelpf.eth

A simple implementation of the Ethereum Virtual Machine in PHP. Made as a joke at 3am, do not take seriously.

]]>
https://miguel.build/b/ethereum-virtual-machine-in-php https://miguel.build/b/ethereum-virtual-machine-in-php Thu, 10 Feb 2022 04:47:19 GMT [![GitHub - m1guelpf/php-evm: "lol. lmao" - 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.
<![CDATA[YouTube subtitles with Whisper]]> GitHub - m1guelpf/yt-whisper: Using OpenAI's Whisper to automatically generate YouTube subtitles

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.

]]>
https://miguel.build/b/youtube-subtitles-with-whisper https://miguel.build/b/youtube-subtitles-with-whisper Thu, 22 Sep 2022 16:35:36 GMT [![GitHub - m1guelpf/yt-whisper: Using OpenAI's Whisper to automatically generate YouTube subtitles](https://opengraph.githubassets.com/546ed4c727d9d06e94b35869cd05fcdfdc2474de2735b48b832c145d686be6df/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.
<![CDATA[Deploying Laravel apps from GitHub Actions]]> GitHub - m1guelpf/orbit: Simple & safe zero-downtime deployments for Laravel.

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.

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!

]]>
https://miguel.build/b/deploying-laravel-apps-from-github-actions https://miguel.build/b/deploying-laravel-apps-from-github-actions Tue, 23 Jul 2024 21:53:23 GMT [![GitHub - m1guelpf/orbit: Simple & safe zero-downtime deployments for Laravel.](https://repository-images.githubusercontent.com/831705369/82ffbe17-f68a-4b52-a318-fe79ee920c1e)](https://github.com/m1guelpf/orbit) 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. 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!
<![CDATA[Navigation primitives for SwiftUI]]> GitHub - m1guelpf/NavigationKit: Typed SwiftUI navigation primitives with a single, app-defined destination model.

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.

]]>
https://miguel.build/b/navigation-primitives-for-swiftui https://miguel.build/b/navigation-primitives-for-swiftui Tue, 30 Dec 2025 16:48:16 GMT [![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.
<![CDATA[Exploring server-side Swift]]> GitHub - m1guelpf/swift-wallet-bridge: A Swift implementation of Worldcoin's end-to-end encrypted ZKP bridge

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.

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.

]]>
https://miguel.build/b/exploring-server-side-swift https://miguel.build/b/exploring-server-side-swift Thu, 28 Mar 2024 16:39:48 GMT [![GitHub - m1guelpf/swift-wallet-bridge: A Swift implementation of Worldcoin's end-to-end encrypted ZKP bridge](https://opengraph.githubassets.com/a343e07880d67a2b8e24d03655dea2bfebcf8ea6706a6606c662a4a2a4d21912/m1guelpf/swift-wallet-bridge)](https://github.com/m1guelpf/swift-wallet-bridge) 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. 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.
<![CDATA[lil web3]]> GitHub - m1guelpf/lil-web3: Simple, intentionally-limited versions of web3 protocols & apps.

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!

]]>
https://miguel.build/b/lil-web3 https://miguel.build/b/lil-web3 Thu, 06 Jan 2022 14:21:02 GMT [![GitHub - m1guelpf/lil-web3: Simple, intentionally-limited versions of web3 protocols & 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!
<![CDATA[A Chess bot in C#]]> GitHub - m1guelpf/Chess-Challenge: My entry for Sebastian Lague's C# Chess Bot Challenge

Sebastian Lague 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.

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!

]]>
https://miguel.build/b/a-chess-bot-in-c https://miguel.build/b/a-chess-bot-in-c Sat, 29 Jul 2023 04:50:55 GMT [![GitHub - m1guelpf/Chess-Challenge: My entry for Sebastian Lague'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're given a C#&nbsp;framework that manages the board, generates moves, etc. and you have to write a "brain" for a chess bot. 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!
<![CDATA[Playwright for Swift]]> GitHub - m1guelpf/swift-playwright: Playwright for Swift is a browser automation library to control Chromium, Firefox and WebKit with a single API.

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.

I have gone to extreme lenghts 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

]]>
https://miguel.build/b/playwright-for-swift https://miguel.build/b/playwright-for-swift Sat, 14 Mar 2026 02:43:57 GMT [![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/609d03636768e1a79c4c318ab3c375e9562cfcbff52abffcd5a21650e2531028/m1guelpf/swift-playwright)](https://github.com/m1guelpf/swift-playwright) 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. 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
<![CDATA[Reverse-engineering Instagram's new app]]> GitHub - m1guelpf/threads-api: Reverse-engineered Rust client for Instagram's Threads app.

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.

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!

]]>
https://miguel.build/b/reverse-engineering-instagrams-new-app https://miguel.build/b/reverse-engineering-instagrams-new-app Thu, 06 Jul 2023 17:41:57 GMT [![GitHub - m1guelpf/threads-api: Reverse-engineered Rust client for Instagram's Threads app.](https://opengraph.githubassets.com/ebf4b6e762002050df21b7dce4173c19a92721327e79c00a2052c84a9116b4c5/m1guelpf/threads-api)](https://github.com/m1guelpf/threads-api) 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. 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!
<![CDATA[Adding macOS GPU support to Point-E]]> GitHub - m1guelpf/point-e-macos: lil fork of OpenAI's Point-E, adding mps backend support

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!

]]>
https://miguel.build/b/adding-macos-gpu-support-to-point-e https://miguel.build/b/adding-macos-gpu-support-to-point-e Wed, 21 Dec 2022 03:21:16 GMT [![GitHub - m1guelpf/point-e-macos: lil fork of OpenAI'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!
<![CDATA[Working with streaming JSON in Rust]]> GitHub - m1guelpf/repair-json: Repair incomplete JSON (e.g. from streaming APIs or AI models) so it can be parsed as it's received.

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.

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.

]]>
https://miguel.build/b/working-with-streaming-json-in-rust https://miguel.build/b/working-with-streaming-json-in-rust Wed, 17 Jan 2024 12:29:22 GMT [![GitHub - m1guelpf/repair-json: Repair incomplete JSON (e.g. from streaming APIs or AI models) so it can be parsed as it'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't use the results in real-time, since the returned JSON isn'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.
<![CDATA[Massively simplifying AWS Nitro Enclaves]]> GitHub - worldcoin/pontifex: Rust library for building and interacting with AWS Nitro enclaves.

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.

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.

]]>
https://miguel.build/b/massively-simplifying-aws-nitro-enclaves https://miguel.build/b/massively-simplifying-aws-nitro-enclaves Fri, 25 Apr 2025 18:29:02 GMT [![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'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. 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.
<![CDATA[A tiny vector database in Rust]]> GitHub - m1guelpf/tinyvector: A tiny embedding database in pure Rust.

After seeing my friend Will 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.

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!

]]>
https://miguel.build/b/a-tiny-vector-database-in-rust https://miguel.build/b/a-tiny-vector-database-in-rust Tue, 04 Jul 2023 06:44:27 GMT [![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'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)!
<![CDATA[Building a Redis server from scratch 🦀]]> GitHub - m1guelpf/lil-redis: An intentionally-limited Rust implementation of the Redis server with no external dependencies.

I've taken on learning Rust recently, and decided to build a very simple Redis server from scratch to practice.

]]>
https://miguel.build/b/building-a-redis-server-from-scratch https://miguel.build/b/building-a-redis-server-from-scratch Fri, 16 Dec 2022 11:38:25 GMT [![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've taken on learning Rust recently, and decided to build a very simple Redis server from scratch to practice.
<![CDATA[A faster CLI for Whisper 🦀]]> GitHub - m1guelpf/whisper-cli-rs: A Whisper CLI, built with Rust.

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 🚀

]]>
https://miguel.build/b/a-faster-cli-for-whisper https://miguel.build/b/a-faster-cli-for-whisper Sun, 25 Dec 2022 15:58:02 GMT [![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'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 🚀
<![CDATA[Web3 dApp Starter Kit]]> GitHub - m1guelpf/dapp-starter: The template I use to kickstart all my web3 apps.

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, & more!

]]>
https://miguel.build/b/web3-dapp-starter-kit https://miguel.build/b/web3-dapp-starter-kit Mon, 23 May 2022 02:28:28 GMT [![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've been using for months to quickly ship lil apps. It includes Next.js, Tailwind CSS, Connectkit, wagmi, viem, & more!
<![CDATA[A modern Swift SDK for OpenAI's Realtime API]]> GitHub - m1guelpf/swift-realtime-openai: A modern Swift SDK for OpenAI's Realtime API

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'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!).

]]>
https://miguel.build/b/a-modern-swift-sdk-for-openais-realtime-api https://miguel.build/b/a-modern-swift-sdk-for-openais-realtime-api Thu, 03 Oct 2024 01:32:47 GMT [![GitHub - m1guelpf/swift-realtime-openai: A modern Swift SDK for OpenAI'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'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!).
<![CDATA[Onchain human verification for Lens]]> GitHub - worldcoin/world-id-lens: ARCHIVED. Human verification for Lens Protocol with World ID.

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.

]]>
https://miguel.build/b/onchain-human-verification-for-lens https://miguel.build/b/onchain-human-verification-for-lens Wed, 18 May 2022 20:15:13 GMT [![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.
<![CDATA[PR'd ChatGPT support to async-openai 🦀]]> Support for ChatGPT API by m1guelpf · Pull Request #43 · 64bit/async-openai

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!

]]>
https://miguel.build/b/prd-chatgpt-support-to-async-openai https://miguel.build/b/prd-chatgpt-support-to-async-openai Wed, 01 Mar 2023 20:16:16 GMT [![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!
<![CDATA[Contributing to Laravel Echo]]> [1.x] Try to get CSRF token from cookie by m1guelpf · Pull Request #242 · laravel/echo

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!

]]>
https://miguel.build/b/contributing-to-laravel-echo https://miguel.build/b/contributing-to-laravel-echo Fri, 06 Sep 2019 15:24:29 GMT [![[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!
<![CDATA[Potato website]]> GitHub - m1guelpf/formtato: A lil web3 form for Ana's potato comissions

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.

Order a potato NFT

]]>
https://miguel.build/b/potato-website https://miguel.build/b/potato-website Tue, 22 Feb 2022 20:13:28 GMT [![GitHub - m1guelpf/formtato: A lil web3 form for Ana's potato comissions](https://opengraph.githubassets.com/03e08f19b93a07dcd4490aa27be7aa64249ede681da6c986ec879bd42585dc39/m1guelpf/formtato)](https://github.com/m1guelpf/formtato) 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. [Order a potato NFT](https://formtato.m1guelpf.me)
<![CDATA[A deep-dive into the Orb's source]]> Worldcoin Orb codebase walkthrough

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.

Read the announcement

]]>
https://miguel.build/b/a-deep-dive-into-the-orbs-source https://miguel.build/b/a-deep-dive-into-the-orbs-source Fri, 22 Mar 2024 13:06:57 GMT [![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 "improvised interview" 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)
<![CDATA[My first video]]> - YouTube

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.

]]>
https://miguel.build/b/my-first-video https://miguel.build/b/my-first-video Tue, 20 Sep 2022 03:25:12 GMT [- YouTube](https://youtu.be/h2wpofmnNgc) 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.
<![CDATA[Human Colossus interview]]> Miguel Piedrafita // ConstitutionDAO, Learning by Debugging, Crypto

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.

]]>
https://miguel.build/b/human-colossus-interview https://miguel.build/b/human-colossus-interview Tue, 04 Oct 2022 14:26:06 GMT [![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 "learning by debugging", my builder journey, and ConstitutionDAO.
<![CDATA[Selling access to GitHub repos]]> Sell access to your GitHub repos with Gumroad

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.

]]>
https://miguel.build/b/selling-access-to-github-repos https://miguel.build/b/selling-access-to-github-repos Fri, 16 Oct 2020 12:58:42 GMT [![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'd build a one-time payment version. GumHub uses Gumroad and Vercel to easily sell access to your GitHub repos.
<![CDATA[A video about falling asleep]]> I built a device to help me fall asleep

It'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'm super happy with it and I think you'll love it!

]]>
https://miguel.build/b/a-video-about-falling-asleep https://miguel.build/b/a-video-about-falling-asleep Fri, 03 Jan 2025 16:42:24 GMT [![I built a device to help me fall asleep](https://i.ytimg.com/vi/aJzbulMSRoo/maxresdefault.jpg)](https://youtu.be/aJzbulMSRoo) It'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'm super happy with it and I think you'll love it!
<![CDATA[A 1h web3 crash course, for non-technical people]]> Explaining crypto, Ethereum, NFTs & more FROM SCRATCH

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 & more. I finally had time to edit the 5h of stream into a consumable video.

]]>
https://miguel.build/b/a-1h-web3-crash-course-for-non-technical-people https://miguel.build/b/a-1h-web3-crash-course-for-non-technical-people Sat, 22 Jan 2022 18:28:03 GMT [![Explaining crypto, Ethereum, NFTs & 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 & more. I finally had time to edit the 5h of stream into a consumable video.
<![CDATA[Explaining SMPC in 12 minutes]]> Worldcoin's SMPC system explained

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 covering the basics of SMPC and turn it into a video, so everyone can get a feel for how it works.

]]>
https://miguel.build/b/explaining-smpc-in-12-minutes https://miguel.build/b/explaining-smpc-in-12-minutes Wed, 15 May 2024 13:48:30 GMT [![Worldcoin'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.
<![CDATA[Human verification for Lens Protocol]]> https://human.withlens.app

Social has always has a big problem with bots & 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.

]]>
https://miguel.build/b/human-verification-for-lens-protocol https://miguel.build/b/human-verification-for-lens-protocol Fri, 26 Aug 2022 18:06:07 GMT [https://human.withlens.app](https://human.withlens.app) Social has always has a big problem with bots & 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.
<![CDATA[Automatically overlay subtitles into any video]]> GitHub - m1guelpf/auto-subtitle: Automatically generate and overlay subtitles for any video.

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.

]]>
https://miguel.build/b/automatically-overlay-subtitles-into-any-video https://miguel.build/b/automatically-overlay-subtitles-into-any-video Wed, 28 Sep 2022 01:12:22 GMT [![GitHub - m1guelpf/auto-subtitle: Automatically generate and overlay subtitles for any video.](https://opengraph.githubassets.com/4386ebdd0d4adcc5c6da9655adedffdd8781f4e7488e7875aab57722704e2fd1/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's just one command away.
<![CDATA[Twitter cross-posting for Lens]]> 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.

]]>
https://miguel.build/b/twitter-cross-posting-for-lens https://miguel.build/b/twitter-cross-posting-for-lens Thu, 02 Jun 2022 18:38:33 GMT [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.
<![CDATA[Contextual search for podcasts]]> https://podcast-search.m1guelpf.me

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!

]]>
https://miguel.build/b/contextual-search-for-podcasts https://miguel.build/b/contextual-search-for-podcasts Wed, 11 Jan 2023 19:38:32 GMT [https://podcast-search.m1guelpf.me](https://podcast-search.m1guelpf.me) 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!