Skip to main content
pendpost runs as a single local process. It runs live by default: a lane with no credentials is live-but-unauthenticated and waits for you to connect it, so nothing publishes until you do. To walk the whole loop risk-free first, start it in mock mode with PENDPOST_MODE=mock. Pick whichever path fits your workflow.

Install and run

Clone the repository and enter it:
The server has zero runtime dependencies, so no root install is needed. Just start it. This builds the dashboard on first run, then boots:
Or run the binary directly. This is equivalent, the same build-on-first-run entry point:
Then open:

First run

Start it with PENDPOST_MODE=mock and every platform lane runs through the credential-free mock driver: no real API calls. Mock mode runs in a private demo workspace in your temp folder, which opens on an example Acme Launch campaign so the dashboard shows real content instead of an empty screen. Without PENDPOST_MODE=mock, pendpost is live, so an unconnected lane waits for its credential rather than publishing. On pendpost 2.8.0 and earlier, also set PENDPOST_ROOT=/tmp/pendpost-demo for mock mode (see Mock mode). From the dashboard you can walk the full loop: draft a post, approve it, schedule it, watch it publish through the mock driver, and read back fabricated insights. See Mock mode for the complete walkthrough. Mock runs do not exercise rate limits, native scheduling, or the Meta 368 breaker; those engage only on a live lane. See Mock mode for what mock does and does not cover.

Drive it headless

The same npx pendpost (or npm start) boot also exposes the MCP server, so an agent can run onboarding without the dashboard. Connect an MCP client, call pendpost_health to confirm readiness, then plan_list to read the workspace (a fresh install shows the example Acme Launch campaign), then campaign_create to start your own. See MCP to connect a client.
pendpost binds 127.0.0.1 (loopback) by default. The docker image binds 0.0.0.0 inside the container, but docker compose still maps the port to loopback on your host only.

Going live later

When you are ready to publish for real, add credentials for the platforms you use in your own .env. Every lane is already live; adding a credential is what lets that lane actually publish instead of waiting unauthenticated. (A lane only runs through the mock driver when you set PENDPOST_MODE=mock.) See:

Meta

Facebook and Instagram.

LinkedIn

Organization page posting.

YouTube

Video uploads with native scheduling.

X (Twitter)

OAuth 1.0a or 2.0 PKCE posting.

Telegram

Channel posting via a bot.

Discord

Channel posting via a webhook.

Reddit

Subreddit posting (beta).

Pinterest

Board pins (beta).

TikTok

Video uploads (beta).

Mastodon

Instance posting via an access token.

Nostr

Text notes to relays (Node 22+).

WordPress

Posts via an application password.

Ghost

Posts via the Admin API.

Google Business Profile

Local posts (beta).