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.
I taught myself to code by Inspect Element-ing around, and built a bunch of apps. Eventually got nerd-sniped by smart contracts and privacy-preserving protocols. Lately, I've been looking into thinking machines and learning how to tell stories. Who knows what's next?







Everything* I've ever built
well, not *everything*, but still a pretty good list of things I've built/done/published over the past few years
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.
apps.apple.com
Pocket for Seerr App - App Store
Download Pocket for Seerr by Miguel Piedrafita on the App Store. See screenshots, ratings and reviews, user tips, and more games like Pocket for Seerr.
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!
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.
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.
github.com
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!
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.
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!
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!
github.com
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.
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!
github.com
🚧 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!
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!

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! 😁
github.com
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.
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.
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!
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.
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.
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!
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!
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!
import { php } from '@/lib/php'
import { startTransition, useState } from 'react'
const ExamplePage = () => {
const [email, setEmail] = useState('')
const [password, setPassword] = useState('')
const [response, setResponse] = useState(null)
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={() =>
startTransition(async () => signIn(email, password).then(response => setResponse(response)))
}
>Log In</button>
</div>
)
}
export default ExamplePageI 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!
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.
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.
www.youtube.com
I built a device to help me fall asleep
Do you stay up late every night, thinking about all the things you need to do the next day? So did I, until now...If you liked the video, subscribe to the ch...
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!
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!
github.com
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!).
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!
github.com
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!
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!
github.com
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!
www.youtube.com
Worldcoin's SMPC system explained
Secure multi-party computation, or SMPC, is an exciting field of cryptography that's celebrated by privacy and security experts. In this video, Remco Bloemen...
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.
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.
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.
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.
github.com
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.
www.youtube.com
Worldcoin Orb codebase walkthrough
The Orb was built to give individuals a way to prove their humanness online with maximum privacy and security. Now, the core components of the Orb’s software...
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.
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.
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!
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.
github.com
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.
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.
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 😅
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.
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!
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.
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!
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!
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!
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.
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!
github.com
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!
worldcoin.org
World - The real human network.
Identity, finance and community for every human.
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!
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!
github.com
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!
github.com
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!
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!
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.).
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!
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.
github.com
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.
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!
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!
worldcoin.org
Introducing World ID and SDK
World ID is a new privacy-first protocol that brings global proof of personhood to the internet.
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.
github.com
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!
github.com
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.
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.
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 ✨
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? 👀
nsfw.m1guelpf.me
Is This Image NSFW?
An extremely fast machine learning NSFW image filter, powered by open-source models.
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.
github.com
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!
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!
github.com
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.
github.com
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 🚀
github.com
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!
github.com
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!
github.com
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.
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!
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!
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!
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.
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).
github.com
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.
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.
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 ✨
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.
github.com
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.
thought.surf
thought.surf
An (experimental) infinite multiplayer canvas interface for you to organize your ideas, inspiration, and pretty much anything else.
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!
raave-raffle-app.vercel.app
We're giving away 5 rAAVE Bogotá tickets!
We've partnered with Lens to give away 5 rAAVE Bogotá tickets to WorldID-verified Lens profiles. See you on the dance floor! 🕺
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!
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.
www.youtube.com
Miguel Piedrafita // ConstitutionDAO, Learning by Debugging, Crypto
We talk to Miguel Piedrafita, 20 year old builder, creator, and influencer, about how he became one of GenZ's most prolific builders, raised 42 million dolla...
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.
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!
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.
github.com
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.
// 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!
github.com
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.
github.com
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.
youtu.be
- YouTube
Enjoy the videos and music you love, upload original content, and share it all with friends, family, and the world on 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.
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.
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.
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.
mute.guru
Take back your feed | mute.guru
Obliterate all 🧵👇's from your feed with one-click, and go back to enjoying the content you actually care about.
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.
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.
miguel.build
Miguel Piedrafita
What I do. What I've done. What I want to do next.
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.
Still from a project I never got to release, which used a ⌘K menu for wallet management.
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.
garden.withlens.app
Gated Garden: Links only your Lens followers can access
Grow your Lens following by providing exclusive content, or enable "charge to follow" to generate some revenue from your content.
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.
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.
open.withlens.app
Lens links that open with your preferred frontend
Lens Protocol content can be rendered with multiple frontends. Using Hotlink, users always get their favourite one.
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.
embeds.withlens.app
Easily embed Lens posts anywhere
One-click embeds for all your links posts, mirrors & comments. Bring your content anywhere, effortlessly!
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.
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.
refract.withlens.app
Refract: Top Links in Crypto
Your crypto-friendly link board. Discover new projects, highlight interesting articles, and share new ideas. Curated by the community.
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.
leaderboard.withlens.app
Lens Leaderboard: Most followed, active, collected & shared profiles
Open protocols offer new levels of transparency. This leaderboard uses 100% public data to rank notable profiles on the Lens Protocol.
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.
github.com
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!
hey.xyz
Hey
Hey.xyz is a decentralized and permissionless social media app built with 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.
algoz-breaker.vercel.app
Auto-solving Algoz.xyz's on-chain captchas
Algo.xyz puts captchas on-chain. Unfortunately, their captchas can't fight modern OCR technology. Proof of Concept.
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.
github.com
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.
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.
github.com
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!
soulminter.m1guelpf.me
Soulminter
One-click mint for Soulbound NFTs on Ethereum, Optimism & Polygon.
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!
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!
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!
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.
github.com
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).
twiteth.m1guelpf.me
How Traceable is your Ethereum Address?
A lil tool that tries to associate your Ethereum Address with a Twitter account, using public sources.
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.
github.com
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.
github.com
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.
ens-delegatoor.vercel.app
Who is voting with my $ENS?
Delegates have control over what happens to the ENS DAO. Here's who you're currently delegating your $ENS to.
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.
www.youtube.com
Explaining crypto, Ethereum, NFTs & more FROM SCRATCH
Over the last few months, I went from knowing nothing about crypto to getting a job at a crypto startup. Then, I decided to rely my knowledge to a non-techni...
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.
github.com
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!
github.com
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)
github.com
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).
github.com
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).
Have you ever wanted to build a web app in Solidity? Me neither, but I built a barely-working server for it anyways.
github.com
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.
Played around with some fractal simulations now that I finally have a M1. Above is a Mandelbulb, a 3D version of the Mandelbrot set
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.
github.com
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.
//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
onchain.pet
A digital pet, on the blockchain
Adopt and take care of your very own $PET on the blockchain! Feed it, play with it, clean it and make sure it gets enough sleep.
🚀 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!
app.airport.community
Made a little iOS/iPadOS app that lets you use WalletConnect on sites where only MetaMask is supported.
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.
spotify.m1guelpf.me
A Spotify Embed for your Twitch Streams
Let your listeners know what music you're playing right now by showing it on screen at all times!
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.

Gave a talk about the internals of the Laravel Framework to thousands of developers all over the world.
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.
Gave a talk about different methods of authentication for Laravel at the Laravel Worldwide Meetup. Was a lot of fun!
Played around with physics-based animations in Blender. Not super fancy-looking but hey, physics!
github.com
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).
Built a Laravel package to easily add Sign in with Apple to your app.
Built a simple Laravel package that makes integrating WebAuthn into your app a breeze.
m1guelpf.gumroad.com
Sell access to your GitHub repos with Gumroad
GumHub is a one-click solution to sell access to your GitHub repos with Gumroad.When you purchase GumHub, you'll get access to the source code, along with instructions for getting it up-and-running with your own repos. The process is as simple as clicking a "Deploy to Vercel" button and filling in five fields.
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.
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.
auralite.io
Auralite: A new social network for the future - Auralite
Meet Auralite, a new kind a social network that respects your privacy and your attention
Auralite is a new social network built for people. It's mindful of your attention and your privacy. It's gonna be great.
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.
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.
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!
I wanted a desktop app for Shortcut (previously Clubhouse), but they aren't planning to release one soon, so I made it myself.
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.
Spent some time reverse-engineering the Byte API, and managed to upload a video from outside the app!
I took some time this weekend to rebuild the entire Sitesauce UI from scratch (for like 3rd time!). Happy with this iteration so far.
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.
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!
Secret project video update: Been working on polishing UX & onboarding experience. Hoping to announce it very soon!
github.com
[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!
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?
Designed some new backgrounds for my devices, showing all the logos from past projects and my branding ✨
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.
A Ghost theme marketplace prototype that could directly upload and update Ghost themes using undocumented API endpoints. Built in under two hours while streaming!
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!
An early version of my website's redesign which I ended up discarding.
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.
Built a nice onboarding for Blogcast, which explains the service and guides you while adding your first article, importing and enabling sync.
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.
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!
Redesigned my website yet again, this time with a much cleaner look and cards for the articles. Also, dark mode!
Finally finished working on the UI flow for my new article-to-audio product! Still things to tweak, but here's an early preview.
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.
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!
A dynamic dashboard showing my calendar, Twitter interactions, current music, and more. Built with Laravel and Vue.js.
My second Statamic addon, which lets you embed videos from YouTube, Vimeo, and Wistia. It also supports custom embeds, and is fully configurable.
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!
{{-- 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!
@endauthAdded an @auth Blade directive, so you can easily check if a user is logged in or not.
Finally managed to get DevKitPro working, and write my first 3DS homebrew!