How to set up the Ghost → ATProto Bridge (standard.site support)
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 devCreate 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"