How to set up the Ghost → ATProto Bridge (standard.site support)

By@KeneFeb 5, 2026
Subscribe

Hey everyone, I’m sharing a quick setup guide for the Ghost → ATProto bridge, including publishing to standard.site.

What this does

  • Connects any Ghost blog to ATProto
  • Publishes posts as standard.site documents
  • Optional dual‑post to Bluesky social feed

Prereqs

  • Ghost blog (Ghost(Pro) or self‑hosted)
  • Ghost Admin API key
  • Bluesky handle + app password
  • MySQL database

Basic setup (backend)

cd ghost-atproto-fullstack/backend
npm install
npx prisma migrate deploy
npm run dev

Create user + login

curl -X POST http://localhost:5001/api/auth/signup \
  -H "Content-Type: application/json" \
  -d '{"email":"[email protected]","password":"testpass123","role":"AUTHOR","name":"Your Name"}'
curl -X POST http://localhost:5001/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email":"[email protected]","password":"testpass123"}'

Configure Ghost + Bluesky

curl -X PUT http://localhost:5001/api/auth/me \
  -H "Authorization: Bearer $JWT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "ghostUrl": "https://your-ghost-site.com",
    "ghostApiKey": "YOUR_GHOST_ADMIN_API_KEY",
    "blueskyHandle": "yourhandle.bsky.social",
    "blueskyPassword": "YOUR_APP_PASSWORD"
  }'

Enable standard.site

curl -X POST http://localhost:5001/api/standard-site/enable \
  -H "Authorization: Bearer $JWT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "publicationName": "My Blog",
    "publicationDescription": "Testing standard.site",
    "dualPost": false
  }'

Sync + publish

curl -X POST http://localhost:5001/api/ghost/sync-posts \
  -H "Authorization: Bearer $JWT_TOKEN"

curl -X POST http://localhost:5001/api/atproto/publish \
  -H "Authorization: Bearer $JWT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "postId": "YOUR_POST_ID",
    "customText": "New article on my Ghost blog!"
  }'

Verify

curl http://localhost:5001/api/standard-site/status \
  -H "Authorization: Bearer $JWT_TOKEN"

curl "http://localhost:5001/.well-known/site.standard.publication?handle=yourhandle.bsky.social"