A draft lives in one plain-text file in your repository. Syndroo reads that file and publishes it to Bluesky, Threads, LinkedIn, and Mastodon, and articles to DEV.to, from your terminal.
Verify the installation with syndroo --version. It should report 0.7.2.
Agent setup
Set up with an Agent
Paste this prompt into a terminal-capable Agent. It installs Syndroo and guides your local or Server setup.
Agent prompt
You are a local-shell coding Agent. Set up Syndroo 0.7.2 for me.
1. Before installing anything, establish where Syndroo will run. If I have not said, ask me which project directory will use Syndroo and which runtime manager that directory declares (mise, asdf, Volta, nvm, Homebrew or a system Node), and stay in that directory. A chat scratch directory or my home directory is not the project.
2. In that directory, record the runtime that is actually in effect: `command -v node npm`, `node --version` (24.19.0 or newer), `npm --version`, `npm root --global` and `npm prefix --global`. Confirm macOS or Linux for supported local writes.
3. Use that one runtime for the install, the version check, the Skill lookup and every later command. With mise, prefix commands with `mise exec --`; `mise which node`, `mise which npm` and `mise which syndroo` each take one argument, so run them separately. Do not assume Homebrew, do not compare pathnames across managers, and never prepend another bin directory to `PATH` to get around a shim.
4. Install Syndroo and its official platform plugins with:
npm install --global @syndroo/cli@0.7.2 @syndroo/provider-sdk@0.7.2 @syndroo/provider-bluesky@0.7.2 @syndroo/provider-threads@0.7.2 @syndroo/provider-linkedin@0.7.2 @syndroo/provider-mastodon@0.7.2 @syndroo/provider-devto@0.7.2
5. Check what the shell resolves, then read and follow the packaged Skill: `command -v syndroo`, `syndroo --version`, then `npm root --global` and read `<global-root>/@syndroo/cli/skills/syndroo/SKILL.md`. Do not run or invent a separate Skill-installer command.
6. Ask whether I want the local workflow or the self-hosted Server workflow, then continue with my choice. For Server setup, ask whether I want GitHub; create or push a repository only when I explicitly authorize it, and reuse authorization I have already given. In 0.7.2, `connect threads` and `publish threads` need the project passed explicitly, for example `syndroo server --project . connect threads --app-id <app-id>`. Select my intended account from the accessible accounts listed by the project-local `wrangler whoami` output and pass that account ID with `--account`; if my intended account is not listed, stop and ask me instead of deploying to another account. Authenticate only when the session is missing or expired.
7. Keep secrets out of prompts, command arguments, logs, and tracked files. Publish content only with authorization for that content and destination.
Publish from one document: plain text to Bluesky and Threads, plain text from a personal LinkedIn profile, public Mastodon statuses, and public personal DEV.to articles. A request is strict JSON: content.text carries the text once and targets names each destination, with optional per-target options for the platforms that need them. An article target carries its own title and body_markdown options.
LinkedIn personal · Mastodon public · DEV.to public articles
Publish
Write a request
A request is a small JSON file you keep next to your project. content is the text and targets names where it goes.
Dry run · no network requests · no local stateRead the printed text and target account before continuing. Preparing a later request freezes the input it read at that moment.
Publish with intent
Publishing is two phases. Preparing freezes the content and returns a single-use approval token; executing consumes that token and sends exactly the frozen preview.
SendIllustrative
publish
$ syndroo publish --input post.json
frozen preview · one approval token · nothing sent yet
$ syndroo publish --input - < execute.json
Editing the file after preparing does not change what gets sent.The execute phase can only be read from standard input.
Inspect the result
The publish result carries an operation id. Reading it back is a read-only query, and it never contacts a platform: syndroo status --operation <operationId>.
StatusIllustrative
status
$ syndroo status --operation <operationId> --json
operationId <operationId>
status succeeded
per target deliveryId · attempts · outcome
An unknown outcome is reported as unknown and is never retried automatically. Live-account acceptance is still pending for this release.
Localby design
Your draft is a file on your disk. Syndroo reads it when you run it, and sends it with the credentials you already have. What happens is whatever the last command you typed did.
Runs as a commandInstall Syndroo and its official platform plugins from npm.
Direct local pathThe local CLI talks to platform APIs without a Syndroo service in between.
Optional self-hostingThreads workflows can run on a deployment in your own Cloudflare account.
Your workflow, your terminal.
No dashboard, no browser tab to keep open. Edit a file, run a command, read the result. Your editor, your shell, and your own platform credentials stay in charge.
frozen · awaiting confirmation · posts to bluesky, linkedin
$ syndroo status --operation <operationId> --json
FAQ
How to install Syndroo, hand setup to an Agent, and use it safely.
How do I install Syndroo?
Use the copyable npm command in Installation to install Syndroo and all five official providers at 0.7.2. Run the command on Node.js 24.19.0 or newer; supported local writes require macOS or Linux.
Which platforms does it publish to?
Five official providers. Bluesky, Threads, LinkedIn and Mastodon publish text; DEV.to publishes articles. A request carries the content once and a targets list that names the providers and, when it matters, the connection and the provider options.
Where do my credentials live?
On your machine, never in the publish request. A connection reads its credentials once, from the environment variable SYNDROO_CREDENTIALS or from a private file you own, and the local credential store keeps them after that. Publishing never re-reads the environment or the file.
What does the dry run actually do?
syndroo publish --input post.json --dry-run --json freezes and validates the request, prints the preview, then exits. It is optional and read-only: no write lock, no credentials resolved, no network request, and no local state.
What gets sent when I publish?
The content is frozen when the request is prepared. Confirming sends exactly that frozen preview, so editing the file afterwards cannot change what goes out — and a later prepare is a new request with its own identity.
Can I prepare and publish in one command?
Yes. syndroo publish --input post.json --yes --json prepares, confirms and executes in one call and prints exactly one final envelope, with no second prepared result and no approval token. Without --yes the same --json call returns the prepared result and sends nothing.
Is there a Syndroo server involved?
The local path talks to platform APIs directly from your machine. For Threads, you can deploy Syndroo's server to your own Cloudflare account, connect an account, and publish manually or from GitHub CI. The SDK remains outside this documentation.
How do I check what a run did?
syndroo status --operation <operationId> --json reports the operation and one delivery per target. A delivery is succeeded, failed with a not-applied disposition, unknown, or not sent when the target never started; an unknown write is never retried automatically.
Ready to get started
Install Syndroo, verify the CLI, then publish your first post from the terminal.