Zinnector®

The developer CLI for WordPress hosting

Zinnector® builds WordPress locally with nothing installed but Node — no Docker, no MAMP — then checks what you built against the hosting slot you are about to deploy to and tells you what will not match, before you push. Install it with npm install -g zinnector. It is free, MIT-licensed and built on the same public API as everything else here.

Five commands, and the middle one is the point

Most hosting CLIs start at deploy. Zinnector® starts before that — it builds the site with you, and then it checks your work against the machine you are about to send it to. The gap between “it ran on my laptop” and “it runs on the server” is where the afternoons go, and that gap is measurable.

zinnector new

Scaffold a site, a plugin or a block theme that boots immediately. No placeholder files, no TODOs — the plugin activates and the theme can be selected the moment it exists.

zinnector dev

A real WordPress on your machine in seconds, serving your own plugins and themes, with no Docker and no PHP on your PATH. Pick any PHP from 5.2 to 8.5 to develop against.

zinnector check

The pre-flight. Compares what you built against the slot you are about to deploy to and names every mismatch — and every check it could not make — before you push.

zinnector push

Pre-flight, push your commits, trigger the deploy and watch it to completion. If it fails, the build log is one command away.

zinnector ai

Ask the assistant from the terminal, with your project and your site as context. It runs on the platform against your own account, so no model key is ever stored on your machine.

Test it works in two minutes, no account needed

Six commands, in order, and what success looks like at each one. Everything here runs on your own machine; an API key is only needed when you reach a hosting slot.

  1. Install it

    Run npm install -g zinnector on Node 24 or newer. If npm prints EBADENGINE, your Node is older than 24 — install the current LTS from nodejs.org and run the install again.

  2. Check the version

    zinnector --version prints a version number such as 0.1.2. On a Node older than 24 it prints a message saying Node 24 or newer is needed, and exits.

  3. Read the help

    zinnector --help lists every command below with a one-line purpose. Every command also takes --help of its own.

  4. Scaffold a site

    zinnector new my-site creates a project that boots immediately — a zinnector.json, a wp-content tree and a README — and prints the next commands to run.

  5. Run it

    cd my-site, then zinnector dev. The first run asks once to download the WordPress runtime (about 570 MB, kept in the CLI’s own cache, never in your project). Success looks like “running at http://127.0.0.1:9400”.

  6. Open it in a browser

    http://127.0.0.1:9400 is a fresh WordPress site; /wp-admin opens the dashboard already signed in. Drop a plugin into wp-content/plugins and it is there on the next reload.

  7. Then, with a hosting slot

    zinnector login, zinnector link, zinnector check, zinnector push — pre-flight what you built against the slot, then deploy and watch it finish.

The pre-flight, in detail

You built on PHP 8.3. The slot runs 8.1. Nothing tells you until the site is white. That is the problem this command exists for, and it is the one the owner of this platform asked for by name. Zinnector® reads both environments and puts them side by side — then lets you deploy anyway, because you might have a reason.

PHP, graded honestly

A major-version gap is flagged high because it reliably breaks a site; a minor gap is flagged lower. Grading everything as critical just teaches people to skip the warning.

Disk and file count, separately

A WordPress tree is tens of thousands of small files, and a site can exhaust its inode allowance while sitting well under its disk cap. Both are checked against what is actually left on the slot, not against the plan.

“Could not check” is its own answer

A check that cannot see its subject reports unchecked, never passed. A clean run says how many things it could not verify, because a false all-clear is the one nobody looks at twice.

Warns, never blocks

Every finding is overridable with --force, and the summary says so. In CI the exit code is the gate instead, so a pipeline can be strict while a person stays in control.

Two local runtimes, both real

WordPress Playground is the default: PHP compiled to WebAssembly, running inside Node, so a laptop with nothing but Node installed goes from nothing to a running WordPress in about the time it takes to read this sentence.

When you need a native PHP — an extension like imagick, a real MySQL — pass --runtime docker and get php-fpm and MariaDB containers instead. Both serve the same files from the same project, so switching between them changes the engine and nothing else.

Everything else you already do in the panel

Zinnector® is built on the same public API as the dashboard, so anything the panel can do, it can do — and every command is a documented operation in the OpenAPI spec rather than a private endpoint.

Sites and deploys

List sites, read everything the platform knows about one, redeploy, and read deploy history and build logs.

Domains, DNS and mail

List domains, read and change DNS records with the record shown before it is written, and read your mail services.

PHP, quota, database and logs

Switch PHP versions, read disk and inode usage against what your plan grants, get single-use links into phpMyAdmin, and tail access and error logs.

WP-CLI and bulk operations

Run allow-listed WP-CLI commands against a site, and purge caches or start malware scans across a whole selection in one call rather than one per site.

Every command, exactly as --help lists it

The full list, one line each. The complete reference — every flag, a runnable example and what each command prints — is generated from the CLI itself and lives in the developer docs and the knowledge base, so it cannot drift from the tool you have installed.

zinnector new

Scaffold a WordPress project you can run immediately.

zinnector dev

Run this project locally — no Docker required.

zinnector login

Sign in with a Zinn Digital® API key.

zinnector logout

Forget a stored API key.

zinnector whoami

Show who this CLI is authenticated as.

zinnector sites

List the sites this key can see.

zinnector status

Everything the platform knows about one site.

zinnector share

Give one person access to a single site — a developer, a designer, a client — with a role and a reason.

zinnector collaborators

See who has been given access to a site, their role, and whether they have accepted yet.

zinnector unshare

Take a person's access back, by email or grant id.

zinnector invitations

The invitations waiting for you, and accept one.

zinnector link

Point this project at a hosting slot (and connect its repository).

zinnector pull

Pull a hosted site's files into this project for local development, and re-run to re-sync. Takes the fast path when the site syncs to its own repository, otherwise works from the latest backup.

zinnector clone

Make a local project from a hosted site in one step: clone its repository or pull its files, write the project file, and leave you ready to run zinnector dev.

zinnector check

Compare this project against the slot you are about to deploy to.

zinnector push

Pre-flight, push your commits, and deploy.

zinnector deploy

Redeploy what the platform already has, without pushing.

zinnector deploys

A site's deploy history.

zinnector php

Show or switch a site's PHP version.

zinnector quota

Disk, files and database usage against what the plan grants.

zinnector db

Database size, and single-use links into phpMyAdmin and the file manager.

zinnector logs

Tail a site's access and error logs.

zinnector wp

Run an allow-listed WP-CLI command on a site.

zinnector backup

List and take site backups. Subcommands: list, now.

zinnector domains

List the domains this key can see.

zinnector dns

Read and change DNS records. Subcommands: list, add, rm.

zinnector mail

List mail services.

zinnector bulk

Run one operation across many sites (cache_purge, malware_scan, sitemap, block_ip).

zinnector ai

Ask the Zinn Digital® assistant, with this project as context.

Questions

Do I need to be a Zinn Digital® customer to use it?

No. `zinnector new` and `zinnector dev` need no account at all — scaffold a plugin, a theme or a whole site and run it locally, free, forever. An API key is only needed for the commands that talk to your hosting.

Does it need Docker?

Not for the default runtime. WordPress Playground compiles PHP to WebAssembly and runs inside Node, so `zinnector dev` boots a real WordPress in seconds with nothing else installed. If you need a native PHP — to test an extension such as imagick or ionCube — `--runtime docker` gives you php-fpm and MariaDB containers instead. Both are supported; neither is a fallback.

What does the pre-flight check actually compare?

Your local PHP version against the slot’s, whether the slot can even switch to the version you built on, whether the slot’s PHP is past end of life and whether the machine has actually applied it, your project’s size and file count against the disk and inode headroom left, the WordPress versions on each side, whether the slot has finished provisioning, and whether a git repository is connected to deploy from. Anything it could not check is reported as unchecked rather than counted as a pass.

Can it stop me deploying?

No, and that is deliberate. Pre-flight warns and lets you through — `--force` deploys past any finding. You know things about your own site that a checker does not, and a tool that refuses to deploy is a tool people uninstall.

Is my API key safe?

The key is never read from the command line — only from a prompt or piped stdin — so it cannot end up in your shell history or in a process listing. It is stored in your own config directory with file mode 600, and Zinnector® re-asserts those permissions every time it writes.

Can I use it in CI?

Yes. Set `ZINNECTOR_TOKEN`, and every command takes `--json`. Human output goes to stderr and data to stdout, so pipes stay clean. `zinnector check` exits non-zero when it finds something, so it works as a pipeline gate, and `--strict` also fails when a comparison could not be made.

Install it and run a site in the next minute

Run npm install -g zinnector, or try it once with npx zinnector new my-site. Free, MIT-licensed and built on the public API. Scaffold a project, run it locally with no Docker, and pre-flight it before you deploy.

Read the docs