SkyScheduler is a lightweight Cloudflare Workers-based microservice application that allows you and/or your team to schedule/repost posts to a Bluesky account effortlessly. Perfect for content creators and social media managers who want to plan their social media content in advance.
- Multiple user/account handling: Manage multiple users/bsky accounts easily
- Bluesky Post Scheduling: Schedule multiple posts to your Bluesky account
- Hourly Time Slots: Time selection is limited to hourly intervals to optimize worker execution and reduce unnecessary runs
- Simple and Lightweight: Fairly minimal setup and easy to use
- Supports media posts: Automatically handles content tagging and formatting your media so that it looks the best on BSky. Image transforms via Cloudflare Images
- Handles Link Embeds: Post your content with a link embed easily!
- Automatic reposting: Schedule how many times you want your post to be retweeted on the network. Get more visibility and engagement without having to do more work
- Invite Keys: Want to throttle the signups to your portal or keep the pool to friends/org only? Use invite keys to manage signups
- Node.js (v24.x or later)
- Package Manager
- Cloudflare Pro Workers account (otherwise you will hit the cpu limit)
- Clone the repository
git clone https://github.com/socksthewolf/skyscheduler.git
cd skyscheduler- Copy environment variables template
cp .dev.vars.example .dev.vars- Configure your
.dev.varsfile with the following environment variables:BETTER_AUTH_SECRET- the cryptographic hash to use better auth (you can generate one from this page)BETTER_AUTH_URL- the working url of your site (this should be "*" in dev).DEFAULT_ADMIN_USER- the admin bsky handleDEFAULT_ADMIN_PASS- the admin passwordDEFAULT_ADMIN_BSKY_PASS- the above account's bsky app passwordTURNSTILE_PUBLIC_KEY- the turnstile public key for captchaTURNSTILE_SECRET_KEY- the turnstile secret key for captcha
Note: When deploying, these variables should also be configured as secrets in your Cloudflare worker dashboard. You can also do this via npx wrangler secret put <NAME_OF_SECRET>.
-
Update your
wrangler.tomlwith changes that reflect your account.- You'll need to update the values for the kv, r2, d1 to reflect the bindings on your account.
- Also make sure you update the
BETTER_AUTH_URLto your working url as well. - Do remember to remove the domain bindings!
-
Install dependencies
npm install- Run the development server
npm run dev- Deploy the application to Cloudflare Workers. You might need to login to your Cloudflare account if you haven't already.
npm run deploy- Create your D1 tables using the following command, this will set up your tables both locally and remotely
npm run migrate:all-
Modify the metatags located in the
metaTags.tsx(these are currently set up for the website attached to this project) -
Run your application and go to
/setup. This will create the admin account.
Ensure you have configured the .dev.vars file with the necessary credentials and settings. The file is git-ignored to protect your sensitive information.
skyscheduler/
├── assets/
├── src/
│ ├── auth/
│ ├── db/
│ ├── endpoints/
│ ├── middleware/
│ ├── layout/
│ ├── pages/
│ ├── utils/
│ └── validation/
├── migrations/
├── .dev.vars
├── drizzle.config.ts
├── package.json
└── wrangler.toml
We welcome contributions!
- Report bugs
- Suggest enhancements
- Submit pull requests
This project is licensed under the MIT License - see the LICENSE file for details.
