Skip to main content
write operations require authentication. use a test account when learning.
export ATPROTO_HANDLE=your.handle
export ATPROTO_PASSWORD=your-app-password

create

pdsx create app.bsky.feed.post text='hello world' langs='["en"]'
pdsx adds $type and createdAt automatically. validation happens server-side - check lexicon docs for required fields.

update

# get record key from ls output
pdsx ls app.bsky.feed.post -o json | jq -r '.[] | "\(.uri) - \(.value.text)"'

# update
pdsx edit app.bsky.feed.post/RKEY text='updated text'

# update profile
pdsx edit app.bsky.actor.profile/self description='new bio'

delete

pdsx rm app.bsky.feed.post/RKEY
delete is permanent - no undo.

workflow

# create
pdsx create app.bsky.feed.post text='test'

# verify
pdsx ls app.bsky.feed.post --limit 1 -o json | jq -r '.[0].value.text'

# edit
pdsx edit app.bsky.feed.post/RKEY text='updated'

# delete
pdsx rm app.bsky.feed.post/RKEY

what’s next