After a few days of hard work, I've finally hit the milestone where I can confidently tag the first release of perlsky as 0.1.0 more like 0.1.1 after writing this post.
This was my first PDS project and I've learned a lot from it. During the process I've also birthed atproto-smoke, which is quite possible the most complete smoke/e2e testing suite for people developing PDSes.
What happened is that I really wanted to write more Perl and I figured that— just kidding. There is nothing wrong with Perl, but what Really happened is that I saw 's Pegasus, a PDS written in OCaml and figured it'd be fun to build one myself that's at least somewhat cursed. Alas, it started as a joke and quickly spiraled out of hand.
At the beginning, I gave a very simple prompt to GPT 5.4 in codex and let it run overnight. Somewhat surprisingly I woke up to a PDS that was already somewhat functional.
From there it was a matter of two more days of hard prompting to get it to release, adding what's missing, and developing atproto-smoke through this process which can now be used against any PDS by writing a small adapter and a config file.
I, of course, ran the "David test", i.e. running @retr0.id's cursed repo through Perlsky and seeing where things break.
There was another overnight pass where the agent meticulously combed through its own tests and compared them to the reference PDS implementation, which did shake out a lot of subtle bugs. Truly, there are more edge cases than stars in the sky.
The last big thing to implement was OAuth. Testing things against Tangled, Leaflet and a few other big projects helped a lot, especially with granular scopes.
I don't quite dare to call Perlsky production-ready, and it could use a bunch more performance optimizations. But it has been extensively tested, and aims for accuracy and parity with the official PDS.
Most importantly, I've learned a lot through this process, and its byproduct, atproto-smoke is arguably the best thing that came out of it. Hell, during the writing of the post I've learned that you have to turn off gzip for com.atproto.sync.getBlob for reasons, otherwise I can't upload images to Leaflet, hence 0.1.1.
FAQ
Wait so is this entirely vibecoded?
GPT 5.4 high and xhigh wrote all the code, but I did all the prompting.
Aren't you worried that—
Eh, not that much. I've learned a lot from it, that's what's counts.