pendpost

by pendpost

Not rated
GitHub

About

Agent-first, local-first social media planner. An AI agent drafts and schedules posts across Instagram, Facebook, LinkedIn, YouTube and X behind a human approval gate the operator controls. MCP-native, MIT-licensed.

Details

Author
pendpost
Categories
Marketing, Other, Automation

Setup

Install pendpost in your MCP client (Claude Desktop, Cursor, Windsurf, and others).

Repository: https://github.com/pendpost/pendpost

Follow the installation instructions in the repository README, then restart your MCP client.

Why pendpost is different (not just a scheduler)

Most "AI social" tools are schedulers with an agent bolted on. pendpost is the opposite. It is an operations layer designed around the agent-plus-human workflow, and these are the parts a scheduler does not give you:

- Human approval gate.Every post carries an approval state (draft,approved,rejected) and is fail-closed: a post with no approval will not publish.plan_create_postalways creates a draft, and onlyapprove_postorreject_postcan flip it. Nothing publishes until it's approved. By default that's you; auto-approve is owner-only and revocable.
- Anti-ban circuit breakers.A Meta error 368 (an action block) trips a breaker that halts the Meta lane and never auto-resumes, because 368 carries no machine-readable clear time. Health probes send zero Graph traffic while blocked. A cadence cap defers bursts rather than dropping them, and a lane pause kill switch is always available.
- Humanizer brand-lint.Captions are checked before publish against editable rules inrules.json. The humanizer layer flags English AI-writing tells. Errors block publish; warnings are advisory.
- Honest native scheduling.Where a platform supports it (Facebook scheduled posts, YouTubepublishAt), pendpost uses native scheduling, so those posts fire even when your computer is off. Instagram, LinkedIn, and X have no native scheduling, so pendpost must be running to publish them; run it on analways-on hostto cover those too. It stays honest about which cover/thumbnail mechanics actually apply per platform.
- Dual interface.A web dashboard and any MCP client drive the same contract. A parity test enforces that every capability ships on both faces.
- German and Swiss localization.Run the dashboard, digest, and notifications in English or real Swiss German (de-CH, with proper umlauts and 24-hour Swiss dates); set the language in Settings. See the
localization docs.

npx pendpost # then open http://127.0.0.1:8090

No account, no signup - pendpost runs locally and starts immediately. You can draft, approve, and schedule a full campaign right away; the first run ships an example "Acme Launch" campaign indata/plans, so you see real content at once. Connect a platform inSetupwhen you are ready to publish - until then a lane is live-but-unauthenticated, so publishing simply waits for the connection rather than faking it.

# git git clone https://github.com/pendpost/pendpost pendpost cd pendpost npm start # or: node bin/pendpost.mjs (builds the dashboard on first run) # then open http://127.0.0.1:8090
# docker docker compose up # then open http://127.0.0.1:8090

The planner and the approval queue are the two screens you live in: draft and schedule on the left, approve or reject on the right. Nothing on the right can approve itself.

The easiest path self-boots: pendpost speaks MCP over native stdio, so the client launches the server for you - nothing to start first.

Claude Desktop (one-click): install the pendpost.mcpbbundle attached to eachGitHub release. It self-bootsnpx -y pendpost --stdioand opens the approval dashboard in the same process.

{ "mcpServers": { "pendpost": { "command": "npx", "args": ["-y", "pendpost", "--stdio"] } } }

Advanced / dev (HTTP transport): pendpost also serves MCP over streamable-HTTP at/mcp. This needs the server already running vianpx pendpost:

claude mcp add --transport http pendpost http://127.0.0.1:8090/mcp

Going live on a real platform means creating a developer app in each vendor's portal and running one OAuth ceremony. pendpost makes that agent-drivable: on each incomplete card in the dashboard'sSetuppage, aCopy AI promptbutton copies a ready-to-paste, secret-safe prompt for Claude for Chrome that drives the portal for that one platform. You authenticate at every login/consent gate, and the credential is minted locally by the CLI - it never passes through the agent or the chat. The same setup contract is documented for any agent inAGENTS.md.

Every capability is an MCP tool, and the dashboard mirrors it. Read-only tools can never publish; write tools create drafts and are gated by the approval rules above. Grouped by what they do:

- 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 (the human gate):approve_post,reject_post. Nothing publishes until it's approved; by default that's you.
- 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 safety:fetch_insights,token_refresh,pendpost_record_block,health_recheck,meta_lane_set.
- Config and clients:config_set,client_create,client_update,client_archive,client_list,client_set_active.

The authoritative count and the read/write split are derived fromlib/mcp.mjsand verified bytest/parity-check.mjs(see theMCP docs). Each tool also carriesreadOnlyHint/destructiveHint/titleannotations intools/list.

When you are ready to publish, connect each platform inSetup(or copy.env.exampleto.envand fill in only the platforms you use). A platform publishes once its credential is present; until then it is live-but-unauthenticated and publishing waits for the connection. (PENDPOST_MODE=mockexists only as a test/demo fixture that routes every lane through the credential-free mock driver.)

Each platform has an interactive setup ceremony that writes to.env:

# Meta (Facebook + Instagram). A System User token is preferred for automation. node scripts/meta-social.mjs setup-system-user \ --system-user-token <T> --page-id <ID> --app-id <ID> --app-secret <S> # (or node scripts/meta-social.mjs setup for a long-lived Page token) # LinkedIn (after creating an OAuth app) node scripts/linkedin-social.mjs auth # YouTube (after creating an OAuth client) node scripts/yt-social.mjs auth # X (Twitter), OAuth 2.0 PKCE (browser). OAuth 1.0a needs no command - see below. node scripts/x-social.mjs auth # Static-credential lanes (no browser): paste the credential into .env (or use # the dashboard Setup form), then validate with the engine's auth command. node scripts/telegram-social.mjs auth # TELEGRAM_BOT_TOKEN + TELEGRAM_CHANNEL_ID node scripts/discord-social.mjs auth # DISCORD_WEBHOOK_URL node scripts/mastodon-social.mjs auth # MASTODON_INSTANCE_URL + MASTODON_ACCESS_TOKEN node scripts/wordpress-social.mjs auth # WORDPRESS_SITE_URL + _USERNAME + _APP_PASSWORD node scripts/ghost-social.mjs auth # GHOST_SITE_URL + GHOST_ADMIN_API_KEY node scripts/nostr-social.mjs keygen --save && node scripts/nostr-social.mjs auth # + NOSTR_RELAYS

X (Twitter)supports two auth paths;OAuth 1.0a is recommendedbecause it needs no browser and sidesteps theERR_TOO_MANY_REDIRECTSthat some apps hit on X's OAuth 2.0 consent screen.

- OAuth 1.0a (recommended, zero browser).In the X developer portal: (1) set the app'sUser authentication settings to Read and Write FIRST; (2) then underKeys and tokens, generate/regenerateboththe API Key/Secretandthe Access Token/Secret; (3) paste all four into.envasX_API_KEY,X_API_SECRET,X_ACCESS_TOKEN,X_ACCESS_TOKEN_SECRET. The lane goes live the momentX_ACCESS_TOKEN_SECRETis set - noauthcommand. Verify withnode scripts/x-social.mjs probe(printsconnected as @handle). Gotchas, in order:

- All four values must come from thesame appand thesame generation.
- Regenerating the API Key/Secretinvalidates the Access Token/Secret- so always regenerate the Access Token/Secretafterthe API Key/Secret, never before.
- One wrong character yields401 "Could not authenticate you"(code 32), which masquerades as an access-token problem.Copy the values from the portal; do not hand-type them.

See.env.examplefor the full list of environment variables per platform.

Captions run through a brand-lint pass before they can publish. The rule set lives inrules.json, which you edit directly. Each rule is an object with anid, aseverity(errorblocks,warnis advisory), amatcher(a regex or a platform-aware built-in likecaptionLength,hashtagCount,allCaps,brokenLink), and ahint. The shipped default also includes humanizer rules that flag English AI-writing tells (AI vocabulary, em dashes, negative parallelism, reflexive rule-of-three padding, filler and hedging, promotional puffery). To disable a rule, delete its object; to add one, append an object. Arules.jsonat your workspace root overrides the shipped default.brand_lintis both an MCP tool and the dashboard composer's lint panel.

pendpost is one zero-dependency Node process (server.mjs) with four faces: a REST API at/api, an MCP server at/mcp(streamable-HTTP, JSON-RPC 2.0, 117 tools), a/mediaface that range-streams local files underdata/, and/, which serves the built React dashboard fromapp/dist. Backend logic lives inlib/*.mjs. There are 14 publish engines inscripts/- one per platform (meta-social.mjshandles Facebook and Instagram) - each spawned as a subprocess on a scheduler tick or on demand and each emitting a JSON envelope. Plans and state are local JSON. The workspace root holding.env,config.json,state.json, anddata/is overridable viaPENDPOST_ROOT(default: the install dir).

Instagram, Facebook, LinkedIn, YouTube, X, Telegram, Discord, Mastodon, Nostr, WordPress, and Ghost are live. Reddit, Pinterest, TikTok, and Google Business Profile are in beta. Each engine handles its own auth, publishing, native scheduling, cover/thumbnail mechanics, and read-only insights. Facebook, YouTube, Mastodon, WordPress, and Ghost schedule natively, so those posts fire even when pendpost is off. Instagram, LinkedIn, X, Telegram, Discord, and Nostr have no native scheduling, so due posts are published by the scheduler at their scheduled time.

pendpost binds127.0.0.1(loopback) by default, never phones home, and keeps secrets only in your own.env(which is gitignored). SeeSECURITY.mdfor the full posture and how to report a vulnerability.

pendpost is built in the open and we want your feedback. There are three ways in, and none of them make the app phone home:

- Quick feedback or an idea:use theShare feedbacklink in the dashboard (it opens a prefilled GitHub page in your browser and never sends your.envor any secret), post inDiscussions, or use the feedback issue form.
- A bug or a feature request:open an issue and pick the matching form.
- A deeper proposal(a new integration seam, a change to how the core works): open an RFC. See
docs/rfcs/README.md.

No account? A short feedback form onpendpost.comforwards into GitHub for you. SeeSUPPORT.mdfor where to get help, anddocs/specs/feedback-pipeline.mdfor how the whole feedback pipeline works.

pendpost is maintained part-time by a small team and is early. Expect rough edges, and set your response-time expectations accordingly.

The full reference lives atdocs.pendpost.com(source insite-docs/). Marketing, pricing, and everydownload optionlive atpendpost.com.

MIT, Copyright 2026 Nomadik GmbH. SeeLICENSE. Please also readDISCLAIMER.mdfor the responsible-use posture andCONTRIBUTING.mdbefore opening a pull request.

Free MCP that drives an audit of your marketing. Your AI connects, adsOS digs through your ads, email and site, and hands back a growth plan you can run today.

MCP server that distributes a single piece of content across 8+ channels (DEV.to, Hashnode, GitHub Discussions, Reddit, Bluesky, LinkedIn, Medium, Twitter) with automatic platform-specific adaptation, idempotent publishing, per-community anti-spam rules, and centralized state management.

Publish, schedule, moderate your social inbox, and pull analytics across every major network directly from any AI assistant, via Eclincher.

A hosted MCP server for planning, scheduling, media, analytics, and social publishing.

Remote MCP server to publish, schedule, and measure posts across X, Instagram, Facebook, Threads, LinkedIn, TikTok, YouTube, Pinterest, and Reddit.

The PostNitro MCP server lets AI assistants and agents create carousels and image posts, manage brand kits and connected social accounts, and schedule posts directly.

Schedule and publish posts to Instagram, TikTok, X, LinkedIn, Facebook, Telegram, Threads, Bluesky and YouTube — previewing each one exactly as the network will render it.

Draft, validate, publish, and schedule social posts from AI assistants.

sprkly.app enables users to publish their shortform content to tiktok, facebook, instagram, youtube, threads via natural language.

Create, schedule, and publish LinkedIn posts directly from Claude Desktop or ChatGPT through natural conversations

An AI-native publishing engine for persona-driven content creation and multi-platform publishing.

No reviews yet — be the first

Sign in to leave a review

Use Google, GitHub, or an email account so ratings stay tied to real people.

Email sign in

No reviews posted yet.