Node.js
Free Node.js Bluesky bot hosting.
The official SDK, a bot framework on top of it, or a Jetstream client. Upload a package.json, name your entry file, and it posts around the clock.
Libraries
Libraries that run here
@atproto/api
Bluesky's own TypeScript SDK. Everything the protocol can do, first, with the least hidden from you. Session persistence is a callback you provide.
@skyware/bot
A higher-level framework over the protocol: events for mentions, replies and follows, and helpers for posting. Far less code for a reply bot than the raw SDK.
@skyware/jetstream
A small client for Jetstream, the filtered JSON stream of the network. The piece to add when your bot watches for posts rather than waiting to be mentioned.
Deploying
Getting it running
- 1
Upload your project
Drag the folder into the file manager or push it over SFTP. Leave node_modules behind: it is installed for you on deploy.
- 2
Dependencies install themselves
Your package.json is read and installed before the bot starts. The protocol packages change quickly, so commit a version you have tested.
- 3
Point us at your entry file
Usually index.js. Handle and app password come from process.env; the session the bot creates goes into a JSON file it writes itself.
Memory
What actually fits in 256 MB
A posting or reply bot sits in tens of megabytes. Posts are small JSON records, and the SDK keeps no cache of the network on your behalf.
A Jetstream bot is the one to be careful with, and only if you subscribe to more than you need. Filter to the record type you care about, usually posts, and handle each event as it arrives rather than collecting them. Unfiltered, the stream is busy enough that a queue you meant to drain later can outgrow 256 MB in an afternoon.
Images are the other cost. Reading an image fully into memory to upload it is fine for one post and wasteful for a bot that posts dozens; stream from disk where the library allows it.
FAQ
Questions
@atproto/api or @skyware/bot?
@skyware/bot for a reply or command bot: mentions arrive as events and replying is one call. @atproto/api for a posting bot or for anything the framework does not cover. They work together, since the framework is built on the protocol.
How do I avoid logging in on every restart?
Save the session. With @atproto/api you pass a function that is called whenever the session is created or refreshed; write it to a JSON file there, and resume from that file at start-up before falling back to a fresh login.
Can I post on a schedule?
Yes, with setInterval inside the bot or a cron-style package. The process stays running, so there is no separate scheduler to host.
Can I write it in TypeScript?
Yes, and the SDK is written in it. Compile to JavaScript before uploading and point us at the compiled entry file, or read the Bun page and skip the compile step.
Do I need to upload node_modules?
No. Upload your source and your package.json and the dependencies install on deploy.
More on Bluesky bots
Hosting something else?
Control it from code