pendpost is a social media planning and scheduling tool for AI agent workflows, designed to be free, open source (MIT), local-first, and MCP-native. It is not positioned as a "scheduler with agents," but rather as an operations layer built around an "agent + human" collaboration workflow.
-
Purpose It lets AI agents draft and schedule social media posts, but posts must go through human approval before publishing, avoiding handing account keys directly to agents and avoiding accounts being flagged by platforms. It is suitable for developers, agencies, and technical independent entrepreneurs who want agents to do the work but want to retain the final publishing decision themselves.
-
Main capabilities
-
Human approval gate: Each post has an approval status (draft, approved, rejected), using a fail-closed design—posts without approval will not be published. plan_create_post always creates a draft, and only approve_post or reject_post can change the status. The default approver is the user themselves, and auto-approve is limited to the owner and can be revoked.
-
Anti-ban circuit breaker: Meta error 368 (action blocked) triggers the circuit breaker, pausing the Meta channel and not automatically recovering; health probes do not send any Graph traffic while blocked; rate limits delay burst content rather than discarding it; a kill switch for pausing channels is also provided.
-
Humanizer brand copy check: Before publishing, copy is checked against editable rules in rules.json, and the humanizer layer flags traces of AI writing in English. Errors block publishing, while warnings are only advisory.
-
Honest native scheduling: Platforms that support native scheduling (Facebook scheduled posts, YouTube publishAt) can publish on time even if the computer is turned off; Instagram, LinkedIn, and X do not have native scheduling and require pendpost to be running in order to publish, and it can be deployed on an always-on host.
-
Dual interfaces: The web dashboard and any MCP client drive the same contract, and consistency tests ensure that both sides have equivalent capabilities.
-
Localization: The dashboard, summaries, and notifications support English or Swiss German (de-CH, with correct umlauts and 24-hour Swiss dates), and can be switched in settings.
-
How to use
- One-line command, no setup required: No account, no registration needed; pendpost runs locally and starts immediately; the first run includes a demoExample: the "Acme Launch" campaign (located in data/plans) lets you see real content immediately. Before the platform is connected in Setup, it is in an "enabled but unauthenticated" state; publishing will only wait for a connection and will not fake anything.
- Claude Desktop: install the pendpost .mcpb package attached to each GitHub release; it automatically starts npx -y pendpost --stdio and opens the approval dashboard in the same process.
- Any stdio MCP client: pendpost provides MCP over native stdio, and the client automatically starts the server.
- Advanced/development (HTTP transport): pendpost also provides MCP at /mcp over streamable-HTTP, and the server must first be started via npx pendpost.
- Platform connections: copying the AI prompt on the Setup page and using it with Claude for Chrome lets the agent drive the OAuth flow for each platform's developer portal; all login/authorization steps are completed by the user themselves, and credentials are generated locally by the CLI, never passing through the agent or chat.
IV. Scope of Application Currently live platforms: Instagram, Facebook, LinkedIn, YouTube, X, Telegram, Discord, Mastodon, Nostr, WordPress, Ghost. Beta stage: Reddit, Pinterest, TikTok, Google Business Profile.
V. Limitations and Notes
- Platforms without native scheduling require pendpost to keep running in order to publish on time.
- By default, pendpost binds to 127.0.0.1 (loopback address), does not send any data back, and keys are stored only in the local .env (already gitignored).
- Data is stored in the local data/ directory; the optional 24/7 cloud service stores plans, encrypted tokens, and audit records, and after unsubscribing, hosted copies are deleted after a brief security window.
- See pendpost.com/privacy for the privacy policy.
- See docs.pendpost.com for the full reference documentation.
- Maintained part-time by a small team and in an early stage, so rough edges may exist.
- Licensed under MIT, copyright 2026 Nomadik GmbH.
VI. MCP Tools All capabilities are MCP tools, and the dashboard provides them in sync. Read-only tools cannot publish; write tools create drafts and are subject to the approval rules above. Tool groups include: read and inspect (plan_list, plan_get, account_status, assets_list, activity_log, validate_media, platform_validate, pendpost_health, publish_preview, brand_lint, generate_digest, config_get, clients_overview); compose (plan_create_post, plan_update_post, plan_delete_post, campaign_create, campaign_set_active); approve (approve_post, reject_post); schedule and publish (scheduler_set, publish_due_run, reschedule, unschedule, mark_posted, verify_post); covers and assets (set_cover, clear_cover, asset_upload, rename_asset, delete_asset); insights and security (fetch_insights, token_refresh, pendpost_record_block, health_recheck, meta_lane_set); configuration and clients (config_set, client_create, client_update, client_archive, client_list, client_set_active). The authoritative counts and read/write split are derived from lib/mcp.mjs and verified by test/parity-check.mjs.
VII. Architecture Overview pendpost is a zero-dependency Node process (server.mjs) that provides four surfaces: the REST API at /api, the MCP server at /mcp (streamable-HTTP, JSON-RPC 2.0), and range requests at /media for local files under data/ Streaming, as well as / providing a built React dashboard. Backend logic is in lib/*.mjs. There are 14 publishing engines in scripts/, one per platform (meta-social.mjs handles Facebook and Instagram), running as subprocesses on schedule or on demand and outputting JSON envelopes. Plans and status are local JSON. The workspace root (containing .env, config.json, state.json, data/) can be overridden via PENDPOST_ROOT. Configuration can be done in Setup, or by copying .env.example to .env and filling in only the platforms you use. When using multiple clients, you can append --client <client-id> after the command. X (Twitter) supports two authentication paths: OAuth 1.0a (recommended, no browser required) and OAuth 2.0 PKCE (browser).
-
Brand copy checking rules The rule set is located in rules.json and can be edited directly. Each rule contains id, severity (error blocks publishing, warn is a hint), matcher (a regular expression or a platform-aware built-in item such as captionLength, hashtagCount, allCaps, brokenLink) and hint. The default rules include humanizer rules that flag traces of English AI writing (AI vocabulary, em dashes, negative parallelism, mechanical triads, filler and vagueness, exaggerated promotional language). Deleting a rule object disables it, and appending an object adds a new one; the rules.json in the workspace root overrides the default rules. brand_lint is both an MCP tool and a checking panel in the dashboard composer.
-
Feedback and support You can submit opinions through the Share feedback link in the dashboard, GitHub Discussions, or the feedback issue form; bugs or feature requests are submitted through the corresponding issue forms; more in-depth proposals can be opened as RFCs. See SUPPORT.md for the complete list of support channels.