Run Syndroo locally
The local path builds the Worker from source and runs it on your machine against a local database. You need Node.js and npm, not a Cloudflare account, and none of these steps deploys anything.
Prerequisites
- Node.js 22 or newer and npm. The repository declares
"node": ">=22"and uses npm workspaces. - git, if you clone the repository rather than using an existing checkout.
- Platform credentials, only for the platforms you will publish to. Local development reads them from
.dev.vars.
Steps
-
Install the source
git clone https://github.com/Syndroo/syndroo.git cd syndroo npm install -
Create your local secrets file
Copy the example file and fill in only what you need. It is never committed, and it never reaches a deployment.
cp .dev.vars.example .dev.varsThe example file lists all five platforms with placeholder values. Delete or comment out the platforms you are not publishing to: a placeholder that looks like a credential still counts as a configured-but-wrong one, and you want a missing platform to fail loudly with
PLATFORM_NOT_CONFIGUREDrather than silently attempting a call with a fake value.SYNDROO_API_KEY=choose-a-long-random-secret BLUESKY_IDENTIFIER=your-handle.bsky.social BLUESKY_PASSWORD=your-bluesky-app-password BLUESKY_HOST=bsky.socialSYNDROO_API_KEYis the Bearer token your client sends.BLUESKY_PASSWORDmust be an app password, not the account password. Credentials for other platforms are optional and independent. -
Create the local database
npm run db:migrate:localThis applies the migrations to the local Miniflare database. It has no effect on anything in Cloudflare.
-
Start the Worker
Build the workspace first. A clean checkout has no compiled output for the workspace packages yet, and Wrangler needs those built adapter dependencies;
npm run devitself serves the Worker source entry (packages/cloudflare-worker/src/index.tsfromwrangler.jsonc) rather than compiling the workspace.npm run buildThen start it:
npm run devThe local Worker listens on
http://localhost:8787and loads the optional platform secrets from.dev.vars. Warnings about unused platform secrets are expected. -
Check it answers
export SYNDROO_URL="http://localhost:8787" export SYNDROO_API_KEY="the-same-secret-from-dev-vars" curl "$SYNDROO_URL/health"Expected:
{"status":"ok"}. Publishing from here works exactly as in Publish your first post, and it posts to the real platform when credentials are configured. -
Run the local test gates
npm test # workspace unit tests npm run check # builds and type-checks the workspaces npm run test:e2e # Mock SNS end-to-end gateThe end-to-end gate needs no credentials.It injects fake bindings, replaces the network boundary with a loopback Mock SNS server, and fails closed on any outbound attempt outside its allowlist. It exercises wiring, persistence, idempotency, ambiguity handling and scheduling. It cannot prove provider permissions, API compatibility or rate limits.
What the local path does not do
- It does not deploy. A local run is an isolated process with its own database.
- It does not validate a platform. A mock-tested adapter is still mock-tested: no live-account acceptance record exists for this candidate.
- It does not prove the platform's current rules. Text limits are enforced locally, but permissions, rate limits and API access are decided by the platform. Check the platform's own documentation through its guide.
- It does not include a dashboard, SDK or MCP server. The interface is the HTTP API.
Applies to
Syndroo 0.2.0-rc.1 (unpublished release candidate). For the production path instead, see Deploy the Worker to Cloudflare.