# projects

date: 2024-10-03T01:32:47.000Z
title: A modern Swift SDK for OpenAI's Realtime API
url: https://miguel.build/p/a-modern-swift-sdk-for-openais-realtime-api
media: {"type":"url","url":"https://github.com/m1guelpf/swift-realtime-openai"}
description:
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!).


date: 2024-10-01T22:10:02.000Z
title: Making OpenAI's new APIs production-ready
url: https://miguel.build/p/making-openais-new-apis-production-ready
cta: {"label":"View on GitHub","url":"https://github.com/m1guelpf/openai-realtime-proxy"}
description:
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!

media:
{"type":"code","code":{"language":"rust","code":"use axum::{extract::WebSocketUpgrade, response::IntoResponse, routing::get, Router};\n\n#[tokio::main]\nasync fn main() {\n    let app = Router::new().route(\"/ws\", get(ws_handler));\n\n    let listener = tokio::net::TcpListener::bind(\"0.0.0.0:3000\").await.unwrap();\n    axum::serve(listener, app).await.unwrap();\n}\n\nasync fn ws_handler(ws: WebSocketUpgrade) -> impl IntoResponse {\n    // check for authentication/access/etc. here\n\n    let proxy = realtime_proxy::Proxy::new(\n        std::env::var(\"OPENAI_API_KEY\").expect(\"OPENAI_API_TOKEN env var not set.\")\n    );\n\n    ws.on_upgrade(|socket| proxy.handle(socket))\n}"}}


date: 2024-07-23T21:53:23.000Z
title: Deploying Laravel apps from GitHub Actions
url: https://miguel.build/p/deploying-laravel-apps-from-github-actions
media: {"type":"url","url":"https://github.com/m1guelpf/orbit"}
description:
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!


date: 2024-06-16T03:35:10.150Z
title: Polishing up this site
url: https://miguel.build/p/polishing-up-this-site
description:
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!


date: 2024-05-24T14:07:05.000Z
title: Named routes for server-side Swift
url: https://miguel.build/p/named-routes-for-server-side-swift
media: {"type":"url","url":"https://github.com/m1guelpf/ziggy-vapor"}
description:
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!


date: 2024-05-15T13:48:30.000Z
title: Explaining SMPC in 12 minutes
url: https://miguel.build/p/explaining-smpc-in-12-minutes
media: {"type":"url","url":"https://youtu.be/xQDXr8AZFGM"}
description:
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.


date: 2024-04-29T09:49:02.000Z
title: A better way to organize AI prompts in Rust
url: https://miguel.build/p/a-better-way-to-organize-ai-prompts-in-rust
cta: {"label":"View on GitHub","url":"https://github.com/m1guelpf/prompt-organizer"}
description:
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.

media:
{"type":"code","code":{"language":"rust","code":"use prompt_organizer::prompt;\n\nprompt!{my_custom_prompt, r#\"\n    You are {name}, {user}'s AI assistant. When responding to a message,\n    you add \"quotes\" around the message and sign it with your name.\n\n    Make sure that the message is correctly formatted, and that the\n    user's name is always capitalized.\n\"#}\n// ^ expands to:\n// pub fn my_custom_prompt(name: &str, user: &str) -> String {\n//   // returns the prompt with the variables replaced, and the indentation normalized\n// }"}}


date: 2024-04-18T16:31:24.000Z
title: An app to easily find liked tweets
url: https://miguel.build/p/an-app-to-easily-find-liked-tweets
cta: {"label":"Download on the App Store","url":"https://apple.co/448gDz6"}
description:
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.

media:
{"type":"image","images":[{"src":"https://web-assets.miguel.build/perch-appstore.jpg","alt":"Promotional image for Perch – a refreshingly simple app for managing your Twitter likes, designed to make finding \"that one tweet\" a breeze."}]}


date: 2024-04-10T20:52:43.000Z
title: Reverse-engineering my 3D printer's API
url: https://miguel.build/p/reverse-engineering-my-3d-printers-api
cta: {"label":"View on GitHub","url":"https://github.com/m1guelpf/bambulab-rs"}
description:
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.

media:
{"type":"code","code":{"language":"rust","code":"use bambulab_cloud::cloud::{Client, Region};\n\nlet client = Client::login(Region::Europe, \"email@example.com\", \"password\").await?;\nlet tasks = client.get_tasks().await?;\n\ndbg!(tasks);\n// [src/main.rs:6] tasks = [\n//   Task {\n//      id: 67318297,\n//      length: 2783,\n//      weight: 81.66,\n//      cost_time: 6541s,\n//      cover: Url { ... },\n//      end_time: 2024-04-06T01:51:58Z,\n//      start_time: 2024-04-05T23:56:48Z,\n//      design_title: \"Cursed Benchys #1\",\n//      title: \"0.24mm layer, 3 walls, 30% infill\",\n//      ...\n//   },\n// ]"}}


date: 2024-03-28T16:39:48.000Z
title: Exploring server-side Swift
url: https://miguel.build/p/exploring-server-side-swift
media: {"type":"url","url":"https://github.com/m1guelpf/swift-wallet-bridge"}
description:
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.


date: 2024-03-22T13:06:57.000Z
title: A deep-dive into the Orb's source
url: https://miguel.build/p/a-deep-dive-into-the-orbs-source
media: {"type":"url","url":"https://www.youtube.com/watch?v=h6AjLyj6ics"}
description:
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.

cta:
{"label":"Read the announcement","url":"https://worldcoin.org/blog/engineering/worldcoin-foundation-open-sources-core-components-orb-software"}


date: 2024-03-02T14:50:42.000Z
title: Bringing a calmer feed to life
url: https://miguel.build/p/bringing-a-calmer-feed-to-life
cta: {"label":"View on GitHub","url":"https://github.com/m1guelpf/textos-twitter"}
description:
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.

media:
{"type":"video","src":"https://web-assets.miguel.build/textos/video.mp4","posterURL":"https://web-assets.miguel.build/textos/poster.jpg"}


date: 2024-02-01T02:04:15.000Z
title: My first SwiftUI app
url: https://miguel.build/p/my-first-swiftui-app
cta: {"label":"View on GitHub","url":"https://github.com/m1guelpf/indigo"}
description:
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!

media:
{"type":"video","src":"https://web-assets.miguel.build/indigo/video.mp4","posterURL":"https://web-assets.miguel.build/indigo/poster.jpg"}


date: 2024-01-30T17:27:05.000Z
title: A Rust SDK for World ID
url: https://miguel.build/p/a-rust-sdk-for-world-id
cta: {"label":"View on GitHub","url":"https://github.com/worldcoin/idkit-rs"}
description:
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.

media:
{"type":"video","src":"https://web-assets.miguel.build/idkit-rs/video.mp4","posterURL":"https://web-assets.miguel.build/idkit-rs/poster.jpg"}


date: 2024-01-17T12:29:22.000Z
title: Working with streaming JSON in Rust
url: https://miguel.build/p/working-with-streaming-json-in-rust
media: {"type":"url","url":"https://github.com/m1guelpf/repair-json"}
description:
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.


date: 2024-01-11T01:19:25.000Z
title: Monitoring air quality with Rust.
url: https://miguel.build/p/monitoring-air-quality-with-rust
cta: {"label":"View on GitHub","url":"https://github.com/m1guelpf/aranet-rs"}
description:
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.

media:
{"type":"code","code":{"language":"rust","code":"let device = aranet::connect().await?;\nlet measurements = device.measurements().await?;\n\ndbg!(measurements);\n// [src/main.rs:6] measurements = SensorData {\n//   со2: 962,\n//   battery: 76,\n//   humidity: 49,\n//   status: GREEN,\n//   pressure: 1017,\n//   interval: 300s,\n//   temperature: 25.75,\n//   since_last_update: 127s,\n// }"}}


date: 2023-12-21T14:30:00.000Z
title: Exploring dependency injection in Rust.
url: https://miguel.build/p/exploring-dependency-injection-in-rust
cta: {"label":"View on GitHub","url":"https://github.com/m1guelpf/silhouette"}
description:
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 😅

media:
{"type":"code","code":{"language":"rust","code":"use silhouette::facade::Container;\n\nstruct DBPool {}\nstruct DBConnection {}\n\n// will always use the same pool\nContainer::singleton(&|_| DBPool::new())?;\n\n// will resolve a new connection each time\nContainer::bind(&|container| -> DBConnection {\n    let shared_pool = container.resolve::<DBPool>().unwrap();\n\n    shared_pool.get_conn()\n})?;\n\n// somewhere else in your app...\nlet connection: DBConnection = Container::resolve()?;"}}


date: 2023-12-20T14:30:01.000Z
title: An elegant event listener package for Rust.
url: https://miguel.build/p/an-elegant-event-listener-package-for-rust
cta: {"label":"View on GitHub","url":"https://github.com/m1guelpf/epicenter"}
description:
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.

media:
{"type":"code","code":{"language":"rust","code":"use epicenter:: { Event, AsyncDispatcher };\n\n#[derive(Debug, Event)]\nstruct ExampleEvent { }\n\n// There'a also a SyncDispatcher you can use\nlet mut dispatcher = AsyncDispatcher::new ();\n\n// Register a callback to run when an event is dispatched\n// This gets access to the event, so it can retrieve data from it!\ndispatcher.listen(| event: ExampleEvent | async move {\n    // ...\n}).await;\n\n// Dispatch an event to all listeners\ndispatcher.dispatch(& ExampleEvent {}).await ?;"}}


date: 2023-12-18T00:14:30.000Z
title: A filesystem abstraction layer for Rust.
url: https://miguel.build/p/a-filesystem-abstraction-layer-for-rust
cta: {"label":"View on GitHub","url":"https://github.com/m1guelpf/flysystem"}
description:
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!

media:
{"type":"code","code":{"language":"rust","code":"use flysystem::{Filesystem, adapters::{S3Adapter, s3}};\n\n#[tokio::main]\nasync fn main() {\n    // instantly swap between storage backends (like S3/Local/FTP)\n    // by changing the type here 👇👇👇\n    let mut cache = Filesystem::<S3Adapter>::new(s3::Config {\n        region: env::var(\"S3_REGION\").ok(),\n        bucket: env::var(\"S3_BUCKET\").unwrap(),\n        endpoint: env::var(\"S3_ENDPOINT\").unwrap(),\n        access_key: env::var(\"S3_ACCESS_KEY\").unwrap(),\n        secret_key: env::var(\"S3_SECRET_KEY\").unwrap(),\n    }).await?;\n\n    filesystem.write(Path::new(\"my-first-file.txt\"), \"Hello, world!\").await?;\n}"}}


date: 2023-12-15T22:17:12.000Z
title: An expressive Rust library for interacting with a cache.
url: https://miguel.build/p/an-expressive-rust-library-for-interacting-with-a-cache
cta: {"label":"View on GitHub","url":"https://github.com/m1guelpf/amnesia"}
description:
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.

media:
{"type":"code","code":{"language":"rust","code":"use amnesia::{Cache, drivers::RedisDriver};\n\n#[tokio::main]\nasync fn main() {\n    // instantly swap between cache backends (like DynamoDB/MySQL/Postgres)\n    // by changing the type here 👇👇👇\n    let mut cache = Cache::<RedisDriver>::new(RedisConfig {\n        redis_url: \"...\"\n    }).await?;\n\n    // get `test-value` from the cache\n    // or store it for 10 seconds if it's not there yet\n    let my_value = cache.remember(\n        \"test-value\",\n        Duration::from_secs(10),\n        my_value\n    ).await?;\n\n    // aaaand it's gone\n    cache.forget(\"test-value\").await?;\n}"}}


date: 2023-12-13T16:42:03.000Z
title: World ID 2.0
url: https://miguel.build/p/world-id-20
description:
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!

media:
{"type":"video","src":"https://web-assets.miguel.build/world-id-v2/video.mp4","posterURL":"https://web-assets.miguel.build/world-id-v2/poster.jpg"}

cta:
{"label":"Read the announcement","url":"https://worldcoin.org/blog/announcements/introducing-world-id-2.0"}


date: 2023-10-04T00:24:38.000Z
title: A personal wearable AI
url: https://miguel.build/p/a-personal-wearable-ai
media: {"type":"image","images":[{"src":"https://web-assets.miguel.build/tab-all-nighter.jpg"}]}
description:
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!

cta:
{"label":"Watch Avi introduce Tab","url":"https://twitter.com/AviSchiffmann/status/1708439854005321954"}


date: 2023-09-10T08:13:46.000Z
title: Building the ultimate Mario game
url: https://miguel.build/p/building-the-ultimate-mario-game
cta: {"label":"Watch on YouTube","url":"https://youtu.be/Wqm1c0A6zkk"}
description:
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!

media:
{"type":"video","src":"https://web-assets.miguel.build/mariogpt/video.mp4","posterURL":"https://web-assets.miguel.build/mariogpt/poster.jpg"}


date: 2023-08-16T17:21:37.000Z
title: My Rust ML library is finally ready!
url: https://miguel.build/p/my-rust-ml-library-is-finally-ready
cta: {"label":"View on GitHub","url":"https://github.com/m1guelpf/cog-rust"}
description:
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.

media:
{"type":"code","code":{"language":"rust","fileName":"An example Cog model","code":"use cog_rust::Cog;\nuse schemars::JsonSchema;\nuse serde::{Serialize, Deserialize};\n\nstruct MyModel { ... }\n\nimpl Cog for MyModel {\n    type Request: Deserialize + JsonSchema;\n    type Response: Serialize + JsonSchema;\n\n    /// Setup the model\n    async fn setup() -> Result<Self>;\n\n    /// Run a prediction on the model\n    fn predict(&self, input: Self::Request) -> Result<Self::Response>;\n}\n\ncog_rust::start!(MyModel);"}}


date: 2023-08-14T15:01:26.000Z
title: The quickest way to commit your code
url: https://miguel.build/p/the-quickest-way-to-commit-your-code
cta: {"label":"Download on GitHub","url":"https://github.com/m1guelpf/commit"}
description:
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!

media:
{"mute":true,"type":"video","src":"https://web-assets.miguel.build/commit/video.mp4","posterURL":"https://web-assets.miguel.build/commit/poster.jpg"}


date: 2023-07-29T04:50:55.000Z
title: A Chess bot in C#
url: https://miguel.build/p/a-chess-bot-in-c
media: {"type":"url","url":"https://github.com/m1guelpf/Chess-Challenge"}
description:
[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!


date: 2023-07-24T13:25:04.000Z
title: Worldcoin is out
url: https://miguel.build/p/worldcoin-is-out
media: {"type":"url","url":"https://worldcoin.org/home"}
description:
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!


date: 2023-07-18T20:04:18.000Z
title: Taking the pain out of running AI models locally
url: https://miguel.build/p/taking-the-pain-out-of-running-ai-models-locally
media: {"type":"image","images":[{"src":"https://web-assets.miguel.build/dyson.jpeg"}]}
cta: {"label":"View on GitHub","url":"https://github.com/m1guelpf/dyson"}
description:
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!


date: 2023-07-06T17:41:57.000Z
title: Reverse-engineering Instagram's new app
url: https://miguel.build/p/reverse-engineering-instagrams-new-app
media: {"type":"url","url":"https://github.com/m1guelpf/threads-api"}
description:
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!


date: 2023-07-04T06:44:27.000Z
title: A tiny vector database in Rust
url: https://miguel.build/p/a-tiny-vector-database-in-rust
media: {"type":"url","url":"https://github.com/m1guelpf/tinyvector"}
description:
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)!


date: 2023-06-07T20:59:13.000Z
title: Rust containers for Machine Learning
url: https://miguel.build/p/rust-containers-for-machine-learning
cta: {"label":"View on GitHub","url":"https://github.com/m1guelpf/cog-rust"}
description:
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!

media:
{"type":"code","code":{"language":"rust","code":"use cog_rust::Cog;\nuse anyhow::Result;\nuse schemars::JsonSchema;\nuse async_trait::async_trait;\n\nstruct ExampleModel {\n    prefix: String,\n}\n\n#[derive(serde::Deserialize, JsonSchema)]\nstruct ModelRequest {\n    /// Text to prefix with 'hello '\n    text: String,\n}\n\n#[async_trait]\nimpl Cog for ExampleModel {\n    type Request = ModelRequest;\n    type Response = String;\n\n    async fn setup() -> Result<Self> {\n        Ok(Self {\n            prefix: \"hello\".to_string(),\n        })\n    }\n\n    fn predict(&self, input: Self::Request) -> Result<Self::Response> {\n        Ok(format!(\"{} {}\", self.prefix, input.text))\n    }\n}\n\ncog_rust::start!(ExampleModel);"}}


date: 2023-05-31T01:51:46.000Z
title: web3 app starter
url: https://miguel.build/p/web3-app-starter
cta: {"label":"View on GitHub","url":"https://github.com/m1guelpf/armchair"}
description:
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.).

media:
{"mute":true,"type":"video","src":"https://web-assets.miguel.build/web3-app-starter/demo.mp4","posterURL":"https://web-assets.miguel.build/web3-app-starter/poster.jpeg"}


date: 2023-05-25T06:16:04.000Z
title: New website!
url: https://miguel.build/p/new-website
description:
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!

media:
{"mute":true,"type":"video","src":"https://web-assets.miguel.build/new-website/video.mp4","posterURL":"https://web-assets.miguel.build/new-website/poster.jpeg"}

cta:
{"label":"Share your thoughts on Twitter","url":"https://twitter.com/m1guelpf/status/1661617108742971392"}


date: 2023-05-20T18:15:31.000Z
title: An API for ENS data
url: https://miguel.build/p/an-api-for-ens-data
cta: {"label":"View on GitHub","url":"https://github.com/v3xlabs/enstate"}
description:
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.

media:
{"type":"image","images":[{"alt":"enstate.rs - querying ens information should be easy.","src":"https://web-assets.miguel.build/enstate-card.jpeg"}]}


date: 2023-05-14T09:51:25.000Z
title: Sign in with Ethereum for Next.js v13 Template
url: https://miguel.build/p/sign-in-with-ethereum-for-nextjs-v13-template
media: {"type":"url","url":"https://github.com/m1guelpf/nextjs13-connectkit-siwe"}
description:
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.


date: 2023-03-26T16:00:43.000Z
title: My first real attempt at a YouTube video
url: https://miguel.build/p/my-first-real-attempt-at-a-youtube-video
cta: {"label":"Watch the video","url":"https://www.youtube.com/watch?v=ZpcNEskZabQ"}
description:
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!

media:
{"type":"video","src":"https://web-assets.miguel.build/first-youtube-video/trailer.mp4","posterURL":"https://web-assets.miguel.build/first-youtube-video/poster.jpeg"}


date: 2023-03-14T22:11:12.000Z
title: A new design for the Worldcoin Docs
url: https://miguel.build/p/a-new-design-for-the-worldcoin-docs
media: {"type":"image","images":[{"src":"https://web-assets.miguel.build/new-worldcoin-docs.jpeg"}]}
cta: {"label":"See the docs","url":"https://docs.worldcoin.org"}
description:
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!


date: 2023-03-14T09:41:59.000Z
title: Announcing World ID
url: https://miguel.build/p/announcing-world-id
media: {"type":"url","url":"https://worldcoin.org/blog/announcements/introducing-world-id-and-sdk"}
description:
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.


date: 2023-03-01T20:16:16.000Z
title: PR'd ChatGPT support to async-openai 🦀
url: https://miguel.build/p/prd-chatgpt-support-to-async-openai
media: {"type":"url","url":"https://github.com/64bit/async-openai/pull/43"}
description:
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!


date: 2023-02-09T04:12:29.000Z
title: Axum Middleware for Signed URLs
url: https://miguel.build/p/axum-middleware-for-signed-urls
media: {"type":"url","url":"https://github.com/m1guelpf/axum-signed-urls"}
description:
After experimenting with Rust backends recently, I decided to rebuild one of my favourite features from the Laravel framework: Signed URLs.


date: 2023-02-06T22:24:20.000Z
title: ChatGPT for your docs
url: https://miguel.build/p/chatgpt-for-your-docs
description:
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.

media:
{"mute":true,"type":"video","src":"https://web-assets.miguel.build/clippy/video.mp4","posterURL":"https://web-assets.miguel.build/clippy/poster.jpg"}


date: 2023-01-19T03:24:03.000Z
title: Baby's first Transformer model
url: https://miguel.build/p/babys-first-transformer-model
media: {"type":"image","images":[{"src":"https://web-assets.miguel.build/first-transformer.jpg"}]}
cta: {"label":"Watch the lecture","url":"https://www.youtube.com/watch?v=kCc8FmEb1nY"}
description:
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 ✨


date: 2023-01-18T03:00:07.000Z
title: An iOS widget for Worldcoin
url: https://miguel.build/p/an-ios-widget-for-worldcoin
media: {"type":"image","images":[{"src":"https://web-assets.miguel.build/worldcoin-widget.jpg"}]}
description:
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? 👀


date: 2023-01-17T05:00:07.000Z
title: A mature content filter using Stable Diffusion
url: https://miguel.build/p/a-mature-content-filter-using-stable-diffusion
media: {"type":"url","url":"https://nsfw.m1guelpf.me"}
cta: {"label":"View the code","url":"https://github.com/m1guelpf/cog-nsfw-filter"}
description:
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.


date: 2023-01-16T14:00:16.000Z
title: A simple job queue for Rust
url: https://miguel.build/p/a-simple-job-queue-for-rust
media: {"type":"url","url":"https://github.com/m1guelpf/redeez-rs"}
description:
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!


date: 2023-01-11T19:38:32.000Z
title: Contextual search for podcasts
url: https://miguel.build/p/contextual-search-for-podcasts
media: {"type":"url","url":"https://podcast-search.m1guelpf.me"}
description:
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!


date: 2022-12-28T09:52:29.000Z
title: Building a web framework from scratch 🦀
url: https://miguel.build/p/building-a-web-framework-from-scratch
media: {"type":"url","url":"https://github.com/m1guelpf/lil-http-rs"}
description:
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.


date: 2022-12-25T15:58:02.000Z
title: A faster CLI for Whisper 🦀
url: https://miguel.build/p/a-faster-cli-for-whisper
media: {"type":"url","url":"https://github.com/m1guelpf/whisper-cli-rs"}
description:
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 🚀


date: 2022-12-24T16:08:47.000Z
title: Writing a Docker image runner from scratch 🦀
url: https://miguel.build/p/writing-a-docker-image-runner-from-scratch
media: {"type":"url","url":"https://github.com/m1guelpf/lil-docker"}
description:
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!


date: 2022-12-21T03:21:16.000Z
title: Adding macOS GPU support to Point-E
url: https://miguel.build/p/adding-macos-gpu-support-to-point-e
media: {"type":"url","url":"https://github.com/m1guelpf/point-e-macos"}
description:
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!


date: 2022-12-16T11:38:25.000Z
title: Building a Redis server from scratch 🦀
url: https://miguel.build/p/building-a-redis-server-from-scratch
media: {"type":"url","url":"https://github.com/m1guelpf/lil-redis"}
description:
I've taken on learning Rust recently, and decided to build a very simple Redis server from scratch to practice.


date: 2022-12-14T13:25:16.000Z
title: Copilot, but for your terminal
url: https://miguel.build/p/copilot-but-for-your-terminal
cta: {"label":"Try it out","url":"https://github.com/m1guelpf/plz-cli"}
description:
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!

media:
{"type":"video","mute":true,"src":"https://web-assets.miguel.build/plz-cli/video.mp4","posterURL":"https://web-assets.miguel.build/plz-cli/poster.jpg"}


date: 2022-12-06T20:28:44.000Z
title: Adding live output to my ChatGPT Telegram bot
url: https://miguel.build/p/adding-live-output-to-my-chatgpt-telegram-bot
cta: {"label":"Try it out","url":"https://github.com/m1guelpf/chatgpt-telegram"}
description:
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!

media:
{"mute":true,"type":"video","src":"https://web-assets.miguel.build/chatgpt-telegram-live/video.mp4","posterURL":"https://web-assets.miguel.build/chatgpt-telegram-live/poster.jpg"}


date: 2022-12-04T04:09:27.000Z
title: A Telegram bot for ChatGPT
url: https://miguel.build/p/a-telegram-bot-for-chatgpt
media: {"type":"image","images":[{"src":"https://web-assets.miguel.build/chatgpt-telegram.jpg"}]}
cta: {"label":"Try it out","url":"https://github.com/m1guelpf/gptchat-telegram"}
description:
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!


date: 2022-12-02T20:39:19.000Z
title: A better ChatGPT interface
url: https://miguel.build/p/a-better-chatgpt-interface
description:
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.

media:
{"type":"video","mute":true,"src":"https://web-assets.miguel.build/chatgpt-concept/video.mp4","posterURL":"https://web-assets.miguel.build/chatgpt-concept/poster.jpg"}


date: 2022-11-24T03:00:23.000Z
title: Deploying Stable Diffusion models to Replicate
url: https://miguel.build/p/deploying-stable-diffusion-models-to-replicate
cta: {"label":"Watch on YouTube","url":"https://youtu.be/Kxlcj7BnO8I"}
description:
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).

media:
{"type":"video","src":"https://web-assets.miguel.build/replicate-guide/trailer.mp4","posterURL":"https://web-assets.miguel.build/replicate-guide/poster.jpg"}


date: 2022-11-04T03:02:25.000Z
title: Copilot, but worse
url: https://miguel.build/p/copilot-but-worse
media: {"type":"url","url":"https://github.com/m1guelpf/ai-code"}
description:
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.


date: 2022-10-31T17:00:14.000Z
title: Using GPT-3 to write commit messages
url: https://miguel.build/p/using-gpt-3-to-write-commit-messages
cta: {"label":"Try it out","url":"https://github.com/m1guelpf/auto-commit"}
description:
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. 

media:
{"mute":true,"type":"video","src":"https://web-assets.miguel.build/auto-commit/video.mp4","posterURL":"https://web-assets.miguel.build/auto-commit/poster.jpg"}


date: 2022-10-22T07:51:47.000Z
title: Script-writing app progress update
url: https://miguel.build/p/script-writing-app-progress-update
cta: {"label":"Get on the waitlist","url":"https://scripty.vercel.app"}
description:
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 ✨

media:
{"type":"image","images":[{"src":"https://web-assets.miguel.build/scripty-design/edit.jpg"},{"src":"https://web-assets.miguel.build/scripty-design/create-project.jpg"},{"src":"https://web-assets.miguel.build/scripty-design/landing.jpg"}]}


date: 2022-10-17T08:43:35.000Z
title: Concept for a script-writing app
url: https://miguel.build/p/concept-for-a-script-writing-app
cta: {"label":"Get on the waitlist","url":"https://scripty.vercel.app"}
description:
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.

media:
{"type":"image","images":[{"src":"https://web-assets.miguel.build/scripty-concept.jpg","alt":"A screenshot of a fictional app (called Scripty) is shown with a slight 3D tilt on a purple background. The screenshot shows a web app with a 3-column layout. The first column shows the navigation (with items \"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."}]}


date: 2022-10-14T22:39:44.000Z
title: YouTube subtitle generator update
url: https://miguel.build/p/youtube-subtitle-generator-update
media: {"type":"url","url":"https://github.com/m1guelpf/yt-whisper"}
description:
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.


date: 2022-10-12T15:33:19.000Z
title: An infinite canvas built for brainstorming.
url: https://miguel.build/p/an-infinite-canvas-built-for-brainstorming
media: {"type":"url","url":"https://thought.surf"}
cta: {"label":"View on GitHub","url":"https://github.com/m1guelpf/thought.surf"}
description:
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!


date: 2022-10-11T18:33:19.000Z
title: A cute raffle website for rAAVE Bogotá
url: https://miguel.build/p/a-cute-raffle-website-for-raave-bogot
media: {"type":"url","url":"https://raave-raffle-app.vercel.app"}
description:
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!


date: 2022-10-09T15:49:06.000Z
title: Explaining web3 to a non-crypto friend
url: https://miguel.build/p/explaining-web3-to-a-non-crypto-friend
description:
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.

media:
{"type":"video","src":"https://web-assets.miguel.build/web3-explainer/video.mp4","posterURL":"https://web-assets.miguel.build/web3-explainer/poster.jpg"}


date: 2022-10-04T14:26:06.000Z
title: Human Colossus interview
url: https://miguel.build/p/human-colossus-interview
media: {"type":"url","url":"https://www.youtube.com/watch?v=345OLOy1tBk"}
description:
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.


date: 2022-09-30T13:46:49.000Z
title: New World ID docs
url: https://miguel.build/p/new-world-id-docs
media: {"type":"image","images":[{"src":"https://web-assets.miguel.build/world-id-docs.jpg"}]}
cta: {"label":"Check them out!","url":"https://id.worldcoin.org"}
description:
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!


date: 2022-09-29T15:09:26.000Z
title: Image support for Lens Reflect
url: https://miguel.build/p/image-support-for-lens-reflect
media: {"type":"image","images":[{"src":"https://web-assets.miguel.build/reflect-images.jpg"}]}
cta: {"label":"Try it out!","url":"https://reflect.withlens.app"}
description:
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.


date: 2022-09-28T01:12:22.000Z
title: Automatically overlay subtitles into any video
url: https://miguel.build/p/automatically-overlay-subtitles-into-any-video
media: {"type":"url","url":"https://github.com/m1guelpf/auto-subtitle"}
description:
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.


date: 2022-09-26T17:51:19.000Z
title: A simple API for Whisper
url: https://miguel.build/p/a-simple-api-for-whisper
cta: {"label":"Try it out!","url":"https://replicate.com/m1guelpf/whisper-subtitles"}
description:
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!

media:
{"type":"code","code":{"language":"typescript","code":"// Reference: https://replicate.com/m1guelpf/whisper-subtitles\n\nfetch('https://api.replicate.com/v1/predictions', {\n    method: 'POST',\n    headers: {\n        'Content-Type': 'application/json',\n        Authorization: `Token ${process.env.REPLICATE_API_TOKEN}`,\n    },\n    body: JSON.stringify({\n        version: '7f686e243a96c7f6f0f481bcef24d688a1369ed3983cea348d1f43b879615766',\n        input: { audio_path: 'https://path/to/audio.mp3', format: 'srt' },\n    }),\n})"}}


date: 2022-09-25T06:44:25.000Z
title: Nouns text-to-image dataset
url: https://miguel.build/p/nouns-text-to-image-dataset
media: {"type":"url","url":"https://github.com/m1guelpf/nouns-dataset"}
cta: {"label":"View on HuggingFace","url":"https://huggingface.co/datasets/m1guelpf/nouns"}
description:
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.


date: 2022-09-22T16:35:36.000Z
title: YouTube subtitles with Whisper
url: https://miguel.build/p/youtube-subtitles-with-whisper
media: {"type":"url","url":"https://github.com/m1guelpf/yt-whisper"}
description:
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.


date: 2022-09-20T03:25:12.000Z
title: My first video
url: https://miguel.build/p/my-first-video
media: {"type":"url","url":"https://youtu.be/h2wpofmnNgc"}
description:
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.


date: 2022-09-13T00:44:05.000Z
title: A Stable Diffusion Twitter bot
url: https://miguel.build/p/a-stable-diffusion-twitter-bot
media: {"type":"tweet","id":"1569487042345861121"}
description:
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.


date: 2022-09-07T10:00:13.000Z
title: Dynamic location for my website
url: https://miguel.build/p/dynamic-location-for-my-website
media: {"type":"image","images":[{"src":"https://web-assets.miguel.build/website-location.jpg"}]}
cta: {"label":"Here's how I built it","url":"https://twitter.com/m1guelpf/status/1567452672877563904"}
description:
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.


date: 2022-09-06T02:38:02.000Z
title: "Now Playing" tile for my website
url: https://miguel.build/p/now-playing-tile-for-my-website
description:
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.

media:
{"type":"video","src":"https://web-assets.miguel.build/now-playing/video.mp4","posterURL":"https://web-assets.miguel.build/now-playing/poster.jpg"}


date: 2022-09-01T16:06:32.000Z
title: Taking back my feed
url: https://miguel.build/p/taking-back-my-feed
media: {"type":"url","url":"https://mute.guru"}
description:
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.


date: 2022-08-26T18:06:07.000Z
title: Human verification for Lens Protocol
url: https://miguel.build/p/human-verification-for-lens-protocol
media: {"type":"url","url":"https://human.withlens.app"}
description:
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.


date: 2022-07-26T02:41:56.000Z
title: A simple page about me
url: https://miguel.build/p/a-simple-page-about-me
media: {"type":"url","url":"/cv"}
cta: {"label":"See the inspiration","url":"https://twitter.com/jackbutcher/status/1551588118947631111"}
description:
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.


date: 2022-06-18T16:52:51.000Z
title: Gave a TEDx talk
url: https://miguel.build/p/gave-a-tedx-talk
media: {"type":"image","images":[{"src":"https://web-assets.miguel.build/tedx-talk.jpg"}]}
cta: {"label":"Watch the talk (in Spanish)","url":"https://www.youtube.com/watch?v=dvmJ_HyfBto"}
description:
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.


date: 2022-06-05T02:17:26.000Z
title: Content-gated links for your Lens followers
url: https://miguel.build/p/content-gated-links-for-your-lens-followers
media: {"type":"url","url":"https://garden.withlens.app"}
description:
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.


date: 2022-06-02T18:38:33.000Z
title: Twitter cross-posting for Lens
url: https://miguel.build/p/twitter-cross-posting-for-lens
media: {"type":"url","url":"https://reflect.withlens.app"}
description:
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.


date: 2022-05-31T21:28:36.000Z
title: Hotlinking for Decentralized Social
url: https://miguel.build/p/hotlinking-for-decentralized-social
media: {"type":"url","url":"https://open.withlens.app"}
description:
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.


date: 2022-05-29T02:25:30.000Z
title: Embeds for Lens Protocol
url: https://miguel.build/p/embeds-for-lens-protocol
media: {"type":"url","url":"https://embed.withlens.app"}
description:
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.


date: 2022-05-27T02:25:28.000Z
title: Lenster for iOS
url: https://miguel.build/p/lenster-for-ios
media: {"type":"image","images":[{"src":"https://web-assets.miguel.build/lenster-ios.jpg"}]}
cta: {"label":"Join the Testflight","url":"https://testflight.apple.com/join/yrsLAMu5"}
description:
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.


date: 2022-05-26T04:52:25.000Z
title: Hacker News for Lens
url: https://miguel.build/p/hacker-news-for-lens
media: {"type":"url","url":"https://refract.withlens.app"}
description:
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.


date: 2022-05-23T17:19:18.000Z
title: A leaderboard for Lens
url: https://miguel.build/p/a-leaderboard-for-lens
media: {"type":"url","url":"https://leaderboard.withlens.app"}
description:
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.


date: 2022-05-23T02:28:28.000Z
title: Web3 dApp Starter Kit
url: https://miguel.build/p/web3-dapp-starter-kit
media: {"type":"url","url":"https://github.com/m1guelpf/dapp-starter"}
description:
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!


date: 2022-05-21T03:31:24.000Z
title: Showing my Lens posts on my website
url: https://miguel.build/p/showing-my-lens-posts-on-my-website
media: {"type":"url","url":"/lens"}
description:
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.


date: 2022-05-19T03:54:30.000Z
title: Breaking on-chain captchas
url: https://miguel.build/p/breaking-on-chain-captchas
media: {"type":"url","url":"https://algoz-breaker.vercel.app"}
description:
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.


date: 2022-05-18T20:15:13.000Z
title: Onchain human verification for Lens
url: https://miguel.build/p/onchain-human-verification-for-lens
media: {"type":"url","url":"https://github.com/worldcoin/world-id-lens"}
description:
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.


date: 2022-05-15T06:30:14.000Z
title: Cleaning up my Twitter timeline
url: https://miguel.build/p/cleaning-up-my-twitter-timeline
description:
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.

media:
{"mute":true,"type":"video","src":"https://web-assets.miguel.build/feedclean/video.mp4","posterURL":"https://web-assets.miguel.build/feedclean/poster.jpg"}


date: 2022-05-14T01:17:49.000Z
title: Universal airdrop contract
url: https://miguel.build/p/universal-airdrop-contract
media: {"type":"url","url":"https://github.com/worldcoin/hyperdrop-contracts"}
description:
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!


date: 2022-05-12T17:33:01.000Z
title: Soulbound NFT creator
url: https://miguel.build/p/soulbound-nft-creator
media: {"type":"url","url":"https://soulminter.m1guelpf.me"}
description:
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!


date: 2022-03-13T14:16:55.000Z
title: Recording a TV documentary
url: https://miguel.build/p/recording-a-tv-documentary
description:
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!

media:
{"type":"image","images":[{"src":"https://web-assets.miguel.build/documentary/room.jpg"},{"src":"https://web-assets.miguel.build/documentary/cam.jpg"}]}


date: 2022-03-12T16:55:28.000Z
title: Running an Ethereum archive at home
url: https://miguel.build/p/running-an-ethereum-archive-at-home
description:
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!


date: 2022-03-05T02:18:49.000Z
title: Meta tweet
url: https://miguel.build/p/meta-tweet
media: {"card":false,"type":"tweet","id":"1499932412851146754"}
description:
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.


date: 2022-03-03T03:13:14.000Z
title: A new approach to wallet activity
url: https://miguel.build/p/a-new-approach-to-wallet-activity
media: {"type":"url","url":"https://github.com/m1guelpf/wallet-activity"}
description:
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).


date: 2022-02-23T21:53:34.000Z
title: Wallet to Twitter
url: https://miguel.build/p/wallet-to-twitter
media: {"type":"url","url":"https://twiteth.m1guelpf.me"}
description:
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.


date: 2022-02-22T20:13:28.000Z
title: Potato website
url: https://miguel.build/p/potato-website
media: {"type":"url","url":"https://github.com/m1guelpf/formtato"}
cta: {"label":"Order a potato NFT","url":"https://formtato.m1guelpf.me"}
description:
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.


date: 2022-02-10T04:47:19.000Z
title: Ethereum Virtual Machine in PHP
url: https://miguel.build/p/ethereum-virtual-machine-in-php
media: {"type":"url","url":"https://github.com/m1guelpf/php-evm"}
description:
A simple implementation of the Ethereum Virtual Machine in PHP. Made as a joke at 3am, do not take seriously.


date: 2022-02-06T06:08:45.000Z
title: ENS Delegate Checker
url: https://miguel.build/p/ens-delegate-checker
media: {"type":"url","url":"https://ens-delegatoor.vercel.app"}
description:
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.


date: 2022-01-22T18:28:03.000Z
title: A 1h web3 crash course, for non-technical people
url: https://miguel.build/p/a-1h-web3-crash-course-for-non-technical-people
media: {"type":"url","url":"https://youtu.be/jX8K8c93lv0"}
description:
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.


date: 2022-01-06T14:21:02.000Z
title: lil web3
url: https://miguel.build/p/lil-web3
media: {"type":"url","url":"https://github.com/m1guelpf/lil-web3"}
description:
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!


date: 2022-01-04T18:32:59.000Z
title: ERC20 NFT airdrop contract
url: https://miguel.build/p/erc20-nft-airdrop-contract
media: {"type":"url","url":"https://github.com/m1guelpf/nft-token-drop"}
description:
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)


date: 2022-01-03T03:16:37.000Z
title: A fridge for your zorbs
url: https://miguel.build/p/a-fridge-for-your-zorbs
media: {"type":"url","url":"https://github.com/m1guelpf/zorb-fridge"}
description:
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).


date: 2022-01-02T20:23:57.000Z
title: Rebuilding the ENS contracts
url: https://miguel.build/p/rebuilding-the-ens-contracts
media: {"type":"url","url":"https://github.com/m1guelpf/ens-contracts-blindrun"}
description:
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).


date: 2022-01-01T21:18:18.000Z
title: Making web apps in Solidity
url: https://miguel.build/p/making-web-apps-in-solidity
cta: {"label":"View on GitHub","url":"https://github.com/m1guelpf/solserve"}
description:
Have you ever wanted to build a web app in Solidity? Me neither, but I built a barely-working server for it anyways.

media:
{"mute":true,"type":"video","src":"https://web-assets.miguel.build/solidity-web/video.mp4","posterURL":"https://web-assets.miguel.build/solidity-web/poster.jpg"}


date: 2021-12-30T01:19:41.000Z
title: A simple ERC721 drop contract
url: https://miguel.build/p/a-simple-erc721-drop-contract
media: {"type":"url","url":"https://github.com/m1guelpf/erc721-drop"}
description:
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.


date: 2021-11-24T04:05:21.000Z
title: Animated fractal experiments
url: https://miguel.build/p/animated-fractal-experiments
cta: {"label":"View the source","url":"https://twitter.com/m1guelpf/status/1463360501153292292"}
description:
Played around with some fractal simulations now that I finally have a M1. Above is a Mandelbulb, a 3D version of the Mandelbrot set

media:
{"mute":true,"type":"video","src":"https://web-assets.miguel.build/fractal-experiments/video.mp4","posterURL":"https://web-assets.miguel.build/fractal-experiments/poster.jpg"}


date: 2021-11-13T04:43:01.000Z
title: ConstitutionDAO
url: https://miguel.build/p/constitutiondao
media: {"type":"tweet","id":"1461527514485035009"}
description:
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.


date: 2021-10-16T01:14:16.000Z
title: Proof of KYC contract
url: https://miguel.build/p/proof-of-kyc-contract
media: {"type":"url","url":"https://github.com/m1guelpf/proof-of-kyc"}
description:
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.


date: 2021-10-08T16:23:39.000Z
title: Necromint contract
description: Built an ERC721 contract that allows you to resurrect burned NFTs, inspired by Dom Hofmann
url: https://miguel.build/p/necromint-contract
media:
{"type":"code","code":{"language":"solidity","fileName":"necromint.sol","code":"//SPDX-License-Identifier: Unlicense\npragma solidity ^0.8.0;\n\nimport \"solmate/tokens/ERC721.sol\";\n\nstruct Ghost {\n    address contractAddress;\n    uint256 tokenId;\n}\n\ncontract Necromint is ERC721 {\n    uint256 private _tokenIds;\n\n    mapping(uint256 => Ghost) internal _ghostMap;\n    mapping(bytes32 => bool) internal _uniqueMap;\n\n    constructor() ERC721(\"Necromint\", \"DEAD\") {}\n\n    function resurrect(ERC721 spirit, uint256 soul) external returns (uint256) {\n        uint256 tokenId = _tokenIds++;\n        Ghost storage ghost = _ghostMap[tokenId];\n\n        require(tokenId < 6669, \"max supply\");\n        require(!_uniqueMap[keccak256(abi.encodePacked(spirit, soul))], \"already resurrected\");\n        require(spirit.ownerOf(soul) == address(0x000000000000000000000000000000000000dEaD), \"token not in cementery (yet?)\");\n\n        ghost.tokenId = soul;\n        ghost.contractAddress = address(spirit);\n        _uniqueMap[keccak256(abi.encodePacked(spirit, soul))] = true;\n\n        _mint(msg.sender, tokenId);\n\n        return tokenId;\n    }\n\n    function tokenURI(uint256 tokenId) public view override returns (string memory) {\n        require(_ownerOf(tokenId) != address(0), \"token does not exist\");\n        Ghost memory ghost = _ghostMap[tokenId];\n\n        return ERC721(ghost.contractAddress).tokenURI(ghost.tokenId);\n    }\n}"}}

cta:
{"label":"View on Etherscan","url":"https://etherscan.io/address/0x9A652E434250f29972A79B726F2e78974140BB8c"}


date: 2021-09-11T06:14:09.000Z
title: A digital pet on the blockchain
url: https://miguel.build/p/a-digital-pet-on-the-blockchain
media: {"type":"url","url":"https://onchain.pet"}
description:
🚀 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!


date: 2021-08-12T12:24:03.000Z
title: A WalletConnect iOS Bridge
url: https://miguel.build/p/a-walletconnect-ios-bridge
media: {"type":"url","url":"https://app.airport.community/app/recK081nDp6EcxKJr"}
cta: {"label":"Join the TestFlight","url":"https://testflight.apple.com/join/A56IxCVw"}
description:
Made a little iOS/iPadOS app that lets you use WalletConnect on sites where only MetaMask is supported.


date: 2021-08-08T03:21:38.000Z
title: Roam Research iOS app
url: https://miguel.build/p/roam-research-ios-app
cta: {"label":"Join the TestFlight","url":"https://testflight.apple.com/join/80wiqrUd"}
description:
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.

media:
{"mute":true,"type":"video","src":"https://web-assets.miguel.build/roam-research-app/video.mp4","posterURL":"https://web-assets.miguel.build/roam-research-app/poster.jpg"}


date: 2021-04-29T00:01:32.000Z
title: Spotify OBS widget
url: https://miguel.build/p/spotify-obs-widget
media: {"type":"url","url":"https://spotify.m1guelpf.me/"}
description:
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.


date: 2021-03-17T19:33:44.000Z
title: Laracon Online talk
url: https://miguel.build/p/laracon-online-talk
media: {"type":"tweet","metrics":false,"id":"1372269942020608001"}
cta: {"label":"Watch on YouTube","url":"https://www.youtube.com/watch?v=QCveo4y4uSU"}
description:
Gave a talk about the internals of the Laravel Framework to thousands of developers all over the world.


date: 2021-03-09T16:41:21.000Z
title: DM Newsletters on Twitter
url: https://miguel.build/p/dm-newsletters-on-twitter
media: {"type":"image","images":[{"src":"https://web-assets.miguel.build/dm-link.jpg"}]}
cta: {"label":"View on Twitter","url":"https://twitter.com/m1guelpf/status/1369327457514438656"}
description:
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.


date: 2021-03-23T20:31:09.000Z
title: Spoke at Laravel Worldwide Meetup
url: https://miguel.build/p/spoke-at-laravel-worldwide-meetup
media: {"type":"image","images":[{"src":"https://web-assets.miguel.build/laravel-meetup.jpg"}]}
cta: {"label":"Watch on YouTube","url":"https://www.youtube.com/watch?v=3-9es617heE"}
description:
Gave a talk about different methods of authentication for Laravel at the Laravel Worldwide Meetup. Was a lot of fun!


date: 2021-02-19T12:39:17.000Z
title: 3D experiments
description: Played around with physics-based animations in Blender. Not super fancy-looking but hey, physics!
url: https://miguel.build/p/3d-experiments
media:
{"mute":true,"type":"video","src":"https://web-assets.miguel.build/3d-experiments/video.mp4","posterURL":"https://web-assets.miguel.build/3d-experiments/poster.jpg"}


date: 2022-01-31T04:29:34.000Z
title: Onchain Connect 4
url: https://miguel.build/p/onchain-connect-4
media: {"type":"url","url":"http://github.com/m1guelpf/connect4-sol"}
description:
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).


date: 2021-01-27T03:00:00.000Z
title: Sign in with Apple on the web
description: Built a Laravel package to easily add Sign in with Apple to your app.
url: https://miguel.build/p/sign-in-with-apple-on-the-web
cta: {"label":"View on GitHub","url":"https://github.com/m1guelpf/laravel-apple-login"}
media:
{"mute":true,"type":"video","src":"https://web-assets.miguel.build/laravel-apple-sign-in/video.mp4","posterURL":"https://web-assets.miguel.build/laravel-apple-sign-in/poster.jpg"}


date: 2021-01-22T16:54:42.000Z
title: A WebAuthn Laravel package
description: Built a simple Laravel package that makes integrating WebAuthn into your app a breeze.
url: https://miguel.build/p/a-webauthn-laravel-package
cta: {"label":"View on GitHub","url":"https://github.com/m1guelpf/laravel-fastlogin"}
media:
{"mute":true,"type":"video","src":"https://web-assets.miguel.build/laravel-webauthn/demo.mp4","posterURL":"https://web-assets.miguel.build/laravel-webauthn/poster.jpg"}


date: 2020-10-16T12:58:42.000Z
title: Selling access to GitHub repos
url: https://miguel.build/p/selling-access-to-github-repos
media: {"type":"url","url":"https://gumhub.m1guelpf.me"}
description:
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.


date: 2020-09-15T01:55:50.000Z
title: A super-simple URL shortener
url: https://miguel.build/p/a-super-simple-url-shortener
media: {"type":"url","url":"https://microl.ink/"}
description:
After my previous shortener went offline, I decided to build a very simple alternative. No tracking or stats or anything crazy, just Vercel redirects.


date: 2020-06-24T15:36:49.000Z
title: A new social network
url: https://miguel.build/p/a-new-social-network
media: {"type":"url","url":"https://auralite.vercel.app"}
description:
Auralite is a new social network built for people. It's mindful of your attention and your privacy. It's gonna be great.


date: 2020-06-07T00:11:59.000Z
title: Landing page design
url: https://miguel.build/p/landing-page-design
media: {"type":"image","images":[{"src":"https://web-assets.miguel.build/landing-page.jpg"}]}
description:
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.


date: 2020-05-20T11:41:47.000Z
title: A new book-reading experience
url: https://miguel.build/p/a-new-book-reading-experience
cta: {"label":"See the process","url":"https://twitter.com/m1guelpf/status/1263072424771440641"}
description:
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.

media:
{"mute":true,"type":"video","src":"https://web-assets.miguel.build/book-stories/video.mp4","posterURL":"https://web-assets.miguel.build/book-stories/poster.jpg"}


date: 2020-05-01T09:04:39.000Z
title: Launching Sitesauce
url: https://miguel.build/p/launching-sitesauce
media: {"type":"url","url":"https://sitesauce.app"}
description:
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!


date: 2020-03-15T13:03:38.000Z
title: Shortcut macOS app
url: https://miguel.build/p/shortcut-macos-app
description:
I wanted a desktop app for Shortcut (previously Clubhouse), but they aren't planning to release one soon, so I made it myself.

media:
{"mute":true,"type":"video","src":"https://web-assets.miguel.build/clubhouse-macos/video.mp4","posterURL":"https://web-assets.miguel.build/clubhouse-macos/poster.jpg"}


date: 2020-02-18T00:13:32.000Z
title: Neumorphic Sitesauce prototype
url: https://miguel.build/p/neumorphic-sitesauce-prototype
cta: {"label":"View full redesign","url":"https://twitter.com/m1guelpf/status/1229559537289637890"}
description:
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.

media:
{"mute":true,"type":"video","src":"https://web-assets.miguel.build/neumorphic-sitesauce/video.mp4","posterURL":"https://web-assets.miguel.build/neumorphic-sitesauce/poster.jpg"}


date: 2020-01-25T18:48:46.000Z
title: Reverse-engineering Byte
url: https://miguel.build/p/reverse-engineering-byte
description:
Spent some time reverse-engineering the Byte API, and managed to upload a video from outside the app!

media:
{"mute":true,"type":"video","src":"https://web-assets.miguel.build/byte-re/video.mp4","posterURL":"https://web-assets.miguel.build/byte-re/poster.jpg"}


date: 2019-11-10T17:57:26.000Z
title: Sitesauce UI refresh
url: https://miguel.build/p/sitesauce-ui-refresh
description:
I took some time this weekend to rebuild the entire Sitesauce UI from scratch (for like 3rd time!). Happy with this iteration so far.

media:
{"type":"video","src":"https://web-assets.miguel.build/sitesauce-ui/video.mp4","posterURL":"https://web-assets.miguel.build/sitesauce-ui/poster.jpg"}


date: 2019-10-24T21:20:11.000Z
title: Skeuomorphic credit card input
url: https://miguel.build/p/skeuomorphic-credit-card-input
description:
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.

media:
{"mute":true,"type":"video","src":"https://web-assets.miguel.build/skeuomorphic-cc/video.mp4","posterURL":"https://web-assets.miguel.build/skeuomorphic-cc/poster.jpg"}


date: 2019-10-13T15:31:23.000Z
title: Announcing Sitesauce
url: https://miguel.build/p/announcing-sitesauce
media: {"type":"tweet","id":"1183404875465592832"}
description:
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!


date: 2019-09-06T16:22:25.000Z
title: Secret project prototype
url: https://miguel.build/p/secret-project-prototype
description:
Secret project video update: Been working on polishing UX & onboarding experience. Hoping to announce it very soon!

media:
{"mute":true,"type":"video","src":"https://web-assets.miguel.build/sitesauce-prototype/video.mp4","posterURL":"https://web-assets.miguel.build/sitesauce-prototype/poster.jpg"}


date: 2019-09-06T15:24:29.000Z
title: Contributing to Laravel Echo
url: https://miguel.build/p/contributing-to-laravel-echo
media: {"type":"url","url":"https://github.com/laravel/echo/pull/242"}
description:
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!


date: 2019-09-01T21:46:35.000Z
title: My first ever (un)conference talk!
url: https://miguel.build/p/my-first-ever-unconference-talk
media: {"type":"image","images":[{"src":"https://web-assets.miguel.build/unconference-talk.jpg"}]}
description:
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?


date: 2019-07-17T15:47:01.000Z
title: Custom backgrounds
url: https://miguel.build/p/custom-backgrounds
description:
Designed some new backgrounds for my devices, showing all the logos from past projects and my branding ✨

media:
{"type":"image","images":[{"src":"https://web-assets.miguel.build/custom-backgrounds/desktop.jpg"},{"src":"https://web-assets.miguel.build/custom-backgrounds/phone.jpg"}]}


date: 2019-07-17T11:13:40.000Z
title: A Chrome extension to focus on your email
url: https://miguel.build/p/a-chrome-extension-to-focus-on-your-email
media: {"type":"image","images":[{"src":"https://web-assets.miguel.build/gmail-focus.jpg"}]}
description:
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.

cta:
{"label":"Install extension","url":"https://chrome.google.com/webstore/detail/gmail-focus/ibkglcbdiifoobbgjpghnobobbnddojj"}


date: 2019-06-28T12:41:25.000Z
title: A theme uploader for Ghost
url: https://miguel.build/p/a-theme-uploader-for-ghost
description:
A Ghost theme marketplace prototype that could directly upload and update Ghost themes using undocumented API endpoints. Built in under two hours while streaming!

media:
{"mute":true,"type":"video","src":"https://web-assets.miguel.build/connla/video.mp4","posterURL":"https://web-assets.miguel.build/connla/poster.jpg"}


date: 2019-06-26T10:54:10.000Z
title: Launchpad OBS controls
url: https://miguel.build/p/launchpad-obs-controls
description:
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!

media:
{"mute":true,"type":"video","src":"https://web-assets.miguel.build/launchpad-obs/video.mp4","posterURL":"https://web-assets.miguel.build/launchpad-obs/poster.jpg"}


date: 2019-06-22T14:09:52.000Z
title: Blog redesign prototype
description: An early version of my website's redesign which I ended up discarding.
url: https://miguel.build/p/blog-redesign-prototype
media:
{"mute":true,"type":"video","src":"https://web-assets.miguel.build/old-blog-themes/video.mp4","posterURL":"https://web-assets.miguel.build/old-blog-themes/poster.jpg"}


date: 2019-06-13T13:30:22.000Z
title: Things web logger
url: https://miguel.build/p/things-web-logger
cta: {"label":"View on GitHub","url":"https://github.com/m1guelpf/send-to-things"}
description:
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.

media:
{"mute":true,"type":"video","src":"https://web-assets.miguel.build/things-web-logger/video.mp4","posterURL":"https://web-assets.miguel.build/things-web-logger/poster.jpg"}


date: 2019-04-22T22:44:21.000Z
title: Blogcast onboarding prototype
url: https://miguel.build/p/blogcast-onboarding-prototype
description:
Built a nice onboarding for Blogcast, which explains the service and guides you while adding your first article, importing and enabling sync.

media:
{"mute":true,"type":"video","src":"https://web-assets.miguel.build/blogcast-onboarding/video.mp4","posterURL":"https://web-assets.miguel.build/blogcast-onboarding/poster.jpg"}


date: 2019-03-31T22:44:21.000Z
title: Snaptier designs
url: https://miguel.build/p/snaptier-designs
description:
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.

media:
{"type":"image","images":[{"src":"https://web-assets.miguel.build/snaptier-designs/landing.png"},{"src":"https://web-assets.miguel.build/snaptier-designs/coming-soon.png"},{"src":"https://web-assets.miguel.build/snaptier-designs/404.png"}]}


date: 2019-03-21T07:00:16.000Z
title: Turn your blog into a podcast
url: https://miguel.build/p/turn-your-blog-into-a-podcast
media: {"type":"image","images":[{"src":"https://web-assets.miguel.build/blogcast.jpg"}]}
cta: {"label":"View on Product Hunt","url":"https://www.producthunt.com/posts/blogcast"}
description:
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!


date: 2019-01-23T00:02:59.000Z
title: Website redesign
url: https://miguel.build/p/website-redesign
media: {"type":"image","images":[{"src":"https://web-assets.miguel.build/website-redesign.jpg"}]}
description:
Redesigned my website yet again, this time with a much cleaner look and cards for the articles. Also, dark mode!


date: 2019-01-18T17:55:53.000Z
title: Blogcast UI
url: https://miguel.build/p/blogcast-ui
description:
Finally finished working on the UI flow for my new article-to-audio product! Still things to tweak, but here's an early preview.

media:
{"mute":true,"type":"video","src":"https://web-assets.miguel.build/blogcast-ui/video.mp4","posterURL":"https://web-assets.miguel.build/blogcast-ui/poster.jpg"}


date: 2018-12-24T00:30:23.000Z
title: A better Patreon for makers
url: https://miguel.build/p/a-better-patreon-for-makers
media: {"type":"image","images":[{"src":"https://web-assets.miguel.build/maker-army.jpg"}]}
description:
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.


date: 2018-12-07T08:17:34.000Z
title: An extension to toggle CSS from a website
url: https://miguel.build/p/an-extension-to-toggle-css-from-a-website
media: {"type":"image","images":[{"src":"https://web-assets.miguel.build/unstyler.jpg"}]}
description:
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!

cta:
{"label":"Install extension","url":"https://chrome.google.com/webstore/detail/unstyler/iniahmhgmcmkimliphhbgfkmichgccjd"}


date: 2018-11-29T22:00:28.000Z
title: Personal Dashboard
url: https://miguel.build/p/personal-dashboard
media: {"type":"image","images":[{"src":"https://web-assets.miguel.build/personal-dashboard.jpg"}]}
description:
A dynamic dashboard showing my calendar, Twitter interactions, current music, and more. Built with Laravel and Vue.js.


date: 2018-07-18T19:11:54.000Z
title: Video Embeds for Statamic
url: https://miguel.build/p/video-embeds-for-statamic
description:
My second Statamic addon, which lets you embed videos from YouTube, Vimeo, and Wistia. It also supports custom embeds, and is fully configurable.

media:
{"mute":true,"type":"video","src":"https://web-assets.miguel.build/statamic-embeds/video.mp4","posterURL":"https://web-assets.miguel.build/statamic-embeds/poster.jpg"}


date: 2018-06-19T09:05:08.000Z
title: Beautiful docs for everyone
url: https://miguel.build/p/beautiful-docs-for-everyone
media: {"type":"image","images":[{"src":"https://web-assets.miguel.build/unmarkdocs.png"}]}
description:
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!


date: 2017-07-17T16:07:53.000Z
title: Contributed to the Laravel framework
description: Added an @auth Blade directive, so you can easily check if a user is logged in or not.
url: https://miguel.build/p/contributed-to-the-laravel-framework
cta: {"label":"View on GitHub","url":"https://github.com/laravel/framework/pull/20087"}
media:
{"type":"code","code":{"language":"blade","code":"{{-- Tired of doing this? --}}\n\n@if (Auth::check())\n    @include('super-secret-stuff')\n@else\n    @include('nothing-to-see-here')\n@endif\n\n{{-- Maybe it's even worse... --}}\n\n@if (Auth::guard('api')->check())\n    @include('super-secret-stuff')\n@endif\n\n{{-- Now you can simply --}}\n\n@auth\n    @include('super-secret-stuff')\n@endauth\n\n@auth('api')\n    Yay, Auth Guards!\n@endauth"}}


