server.mjs). The server has no runtime dependencies; everything it needs is in the standard library and your local files.
Four faces
The single process serves four faces on the same port:REST
/api is the REST face the dashboard talks to.MCP
/mcp is the MCP face: streamable-HTTP, JSON-RPC 2.0, dozens of tools. See MCP clients.Media
/media does range streaming of local files under data/.Dashboard
/ serves the built React dashboard from app/dist.Backend logic
The backend logic lives inlib/*.mjs. The process binds 127.0.0.1 (loopback) by default, so nothing is exposed beyond your own machine unless you change the bind host.
The publish engines
There are four publish engines inscripts/, one per platform family:
meta-social.mjs(Facebook and Instagram)linkedin-social.mjsyt-social.mjsx-social.mjs(X / Twitter)
Plan and state
The plan and the state are local JSON.- Plans live under
data/plans: each campaign has apost-plan.json, the manifest isactive-plans.json, and per-post covers live alongside the plan. - Media to publish lives under
data/media. - Voiceover SRTs live under
data/captions.
.env, config.json, state.json, and data/ is overridable via PENDPOST_ROOT (it defaults to the install directory).
Because the server has zero runtime dependencies and binds loopback, the whole system is local-first and inspectable. There is no telemetry; nothing phones home.