atplan #
A reimagining of the Unix .plan file tradition for the ATProto ecosystem.
🌐 atplan.io 📦 Lexicon: io.atplan.plan
What is this? #
In the early days of the internet, the finger protocol let you query what any user on a networked system was up to. Users maintained a .plan file — freeform text describing their current projects, status, or thoughts. It was proto-blogging before blogging existed.
atplan reimagines that tradition for ATProto — federated, user-owned, and linkable.
Publishing your .plan #
The easiest way to publish a plan is at atplan.io/edit. Sign in with your ATProto handle, fill in your plan, and save. No account, no setup, no self-hosting required. Your plan is stored as a record on your own PDS under the io.atplan.plan Lexicon.
To finger anyone's plan, visit atplan.io/finger/handle or use the form on the landing page.
Saving also mirrors your plan to a site.standard.document record, so standard.site-aware readers (Leaflet, Pckt, Offprint, Bluesky's link unfurl) can render it as an article. Since that record updates in place along with your .plan, a Bluesky post's card can go stale after you edit again — click create permalink on the edit screen to snapshot the current text as its own permanent, linkable post instead. Permalinked posts show up in a "past posts" list on your finger page.
Lexicon #
Records are stored under io.atplan.plan with the key self, meaning one plan per user, always updated in place.
Just want to publish your plan? Go to atplan.io/edit — no setup required. Sign in with your ATProto handle and start writing.
Components #
plan_read.py— CLI tool to finger any ATProto user by handleapp.py— Flask web app: public reader, man page landing, and ATProto OAuth editorcreate_publication.py— one-time script to create atplan.io'ssite.standard.publicationrecord
CLI Usage #
python3 plan_read.py handle.bsky.social
Web App Routes #
/— man page landing with live plan example/finger/<handle>— finger any ATProto user by handle/finger/<handle>/post/<rkey>— a permanent, standalone standard.site post/edit— ATProto OAuth editor, open to any ATProto user/embed/<handle>— embeddable iframe for any website/client-metadata.json— OAuth client metadata/lexicon/io.atplan.plan— Lexicon schema JSON/.well-known/site.standard.publication— standard.site domain verification