Queue your posts.Publish on time, every time.
Bulk-schedule X posts through the official API. CLI, desktop app, or deploy daemon — your API keys, your machine, no hosted service.
- Official X API
- Bulk paste import
- Image posts
- Today · 09:00Morning thread hookPublished
- Today · 14:00Product update goes livePublished
- Today · 18:30End-of-day recapScheduled
0+
Posts scheduled (illustrative)
0%
On-time delivery (illustrative)
Illustrative metrics for design purposes — not live production data.
@alexbuilds
Finally a scheduler that doesn't need a browser tab open. Bulk paste + walk away.
@jordancreates
Self-hosted PostWave on Docker in an afternoon. My queue, my infra, my rules.
@samops
Official API only — no sketchy automation. Exactly what I wanted for batch posting.
Illustrative testimonials — representative personas, not real individuals.
How it works
Three steps to a self-running feed
Paste, schedule, close the laptop. The worker handles the rest.
Paste your posts
Drop a batch with date, time, and text — or compose one at a time.
Set the schedule
Timezone-aware scheduling publishes to the exact minute.
Close the laptop
The scheduling daemon publishes via the official X API while you are offline.
Features
Everything you need, nothing you don't
Bulk paste
Import dozens of posts in one paste.
Official X API
OAuth-connected, policy-compliant.
Timezone-aware
Schedule in your local time.
Failure alerts
Email on failure with one-click retry.
Drafts & edits
Tweak posts until they publish.
Self-hostable
Docker, AWS, Railway, or Fly.io.
Get started
Three ways to run PostWave
Same engine — pick the surface that fits how you work.
CLI
Scriptable scheduling for developers and headless servers.
npm install -g postwave postwave init postwave login postwave daemon
Deploy daemon
Always-on publishing on your Fly.io, Railway, or Docker host.
postwave deploy fly # or: docker compose --profile deploy up -d
SQLite
Local-first post storage
Min-heap
O(log n) scheduling
X API v2
Official OAuth publishing
Self-host
Run it on your infrastructure
All deploy options use your credentials and your accounts. You are the operator.
Docker
Run the deploy daemon with a persistent volume at /data.
docker compose --profile deploy up -d curl localhost:8081/health
Fly.io
Generate a Fly app with SQLite volume via the CLI wizard.
postwave deploy fly
See docs/INSTALL.md for the full setup guide. Disclaimer
Your credentials stay yours
OAuth-only X connection. Tokens encrypted at rest. Disconnect anytime. When you self-host, your data never leaves your infrastructure.
OAuth only
We never see your password.
Encrypted tokens
AES-256-GCM at rest.
Official API
No browser automation.
Disconnect anytime
Revoke in one click.
FAQ
Questions, answered straight
Is PostWave free?
Yes. PostWave is open source under the MIT license. Run the CLI or desktop app locally, or deploy the daemon to your own cloud. You only pay for your X API usage.
Will this get my X account flagged?
PostWave publishes through X's official API using OAuth — not browser automation. That is the sanctioned method third-party apps are expected to use.
Do I need to keep my computer on?
The CLI and desktop app need your machine awake at publish time, or a background daemon running. For 24/7 scheduling without your laptop, deploy the daemon to Docker, Fly.io, or Railway.
What's the bulk paste format?
One post per line: YYYY-MM-DD HH:mm | your text. Lines without a timestamp stay as drafts.
Why do link posts cost more on X?
X charges more for posts containing URLs through its API (~$0.20 vs ~$0.015 for text). That cost goes to your X Developer account, not PostWave.