Local WordPress sites on your Mac, built to migrate cleanly to cPanel.
A native macOS app with no accounts, no cloud and no telemetry. It only talks to localhost,
unless you share a site or connect your live sites.
- What is WP Center?
- Features
- Requirements
- Building from source
- Getting started, step by step
- The
wpccommand-line tool - Settings
- How it works under the hood
- Privacy and security
- Project structure
- Testing
- Troubleshooting
- Acknowledgements
- Contributing
- License
WP Center is a native macOS (SwiftUI) app for creating and running WordPress sites locally. It is a rebuild of WordPress Studio with every external service removed: no WordPress.com account, no sync, no AI, no telemetry and no auto-updates.
Its main goal is a predictable path from your Mac to a cPanel server. Each site can use the same database engine, database version and PHP version as your hosting, and one click produces a WPvivid backup ready to restore on cPanel.
| Feature | Description |
|---|---|
| One-click sites | Create a fully installed WordPress site in seconds, with a strong random admin password. |
| cPanel-matched databases | MariaDB (10.6 to 11.8) or MySQL (8.0, 8.4): the versions cPanel & WHM 136+ can install that are also available for Mac. SQLite for quick throwaway tests. |
| PHP per site | PHP 8.1 to 8.5, following cPanel's EasyApache 4. PHP 8.4 is bundled; other versions are installed from Homebrew only when you ask. |
| Passwordless WP Admin | Opens the dashboard already signed in, using a one-time, 60-second token that only works on your Mac. |
| Export to cPanel | Drives the WPvivid plugin to produce a clean backup and fixes MySQL 8-only collations that MariaDB rejects. |
| Status and storage | Each site shows the WordPress, plugin and theme updates WordPress already knows about, whether debug mode is on, and how much disk space uploads, the database, plugins and WPvivid backups use, with one click to delete older backups. |
| Move between Macs | Export a whole site (files, database, PHP and engine) into one .zip and import it into WP Center on another Mac. |
| Duplicate | A full copy of a site (files and database) with its own address and password, to try things without touching the original. |
| Import from cPanel | Turns a WPvivid backup made on the server into a local site in one step, with local URLs and a new admin password. Exports from Studio, Local and other WP Centers work too. |
| Email catcher | Every email sent by WordPress lands in a bundled Mailpit inbox. Nothing leaves your Mac. |
| Live sites | Connect your published WordPress sites to see their versions and pending updates in one table, update plugins, themes and WordPress on one or every site, and open WP Admin already signed in. |
| Share by link | A temporary public HTTPS link (Cloudflare Quick Tunnel), no account needed, to show your work to a client. |
wpc CLI |
Start, stop, inspect and export sites from Terminal, plus WP-CLI with each site's own PHP and database. |
| Ready for AI agents | Each site gets AGENTS.md, CLAUDE.md, an always up-to-date WPCENTER.md and WordPress skills, and wpc gives agents a site summary, one-time sign-in links, PHP logs, caught emails and cache clearing. Claude, ChatGPT (Codex), Cursor, Windsurf and other AI editors can open a site from the app. |
| Menu bar and login item | Control your sites from the menu bar and resume them automatically when you log in. |
| English and Portuguese | Follows your Mac's language. |
To run the app
- macOS 14 Sonoma or later, on Apple silicon.
- Homebrew, only for MariaDB/MySQL sites and for PHP versions other than 8.4.
WP Center installs the formulas it needs (
mariadb@10.11,mysql@8.4,php@8.2, …) when you ask it to.
To build from source
- Xcode Command Line Tools (Swift 6 toolchain, macOS 26 SDK).
- WordPress Studio, once. The build copies the PHP runtime, WordPress, the SQLite plugin,
WP-CLI and some skills from it. Nothing is downloaded. By default it reads them from
Vendor/studio/(not in git), a copy of the same folders insideStudio.app/Contents/Resources, so Studio can be uninstalled afterwards. brew install mailpit cloudflared. Both are bundled inside the app, so end users don't need them.
git clone https://github.com/pixelhunter1/wordpressCenter.git
cd wordpressCenter
./build.sh
open "dist/WP Center.app"build.sh compiles the Swift sources with swiftc, assembles dist/WP Center.app, copies the runtime from Studio,
bundles Mailpit and cloudflared, and warns about any UI string that is missing an English translation.
Tip
On a fresh clone there is no Vendor/studio/ yet: build straight from Studio with
STUDIO=/Applications/Studio.app/Contents/Resources ./build.sh.
You can override the bundled tools the same way with MAILPIT= and CLOUDFLARED=.
-
Open WP Center and click + in the toolbar (or press ⌘N).
-
Enter a site name. By default it is also used as the WordPress site title.
-
Choose the database engine:
- MariaDB (recommended): cPanel's default engine, with
10.11preselected. - MySQL: the same as cPanel's MySQL (
8.0or8.4). - SQLite: quick tests only. It cannot be exported to cPanel.
Pick the same version your server runs. Help → cPanel Database Versions shows the official table of what each operating system (AlmaLinux, CloudLinux, Ubuntu) supports.
- MariaDB (recommended): cPanel's default engine, with
-
Choose where the database runs:
- On this Mac (managed by the app): WP Center installs the Homebrew formula on first use, initialises it and
creates a random cPanel-style database and user (
wpc_xxxxxxxxxx) for the site. - Existing server: enter the host, port, database name, user and password, then click Test Connection.
- On this Mac (managed by the app): WP Center installs the Homebrew formula on first use, initialises it and
creates a random cPanel-style database and user (
-
Choose the PHP version (8.1 to 8.5). A version that isn't installed yet is installed when you create the site.
-
Optionally set the WordPress username. The password is always new and strong.
-
Click Create Site. WordPress is installed in
~/WP Center/<site-name>(you can change the folder in Settings).
Note
Set your server's engine, version and PHP once in Settings → New Sites, and every new site starts with them preselected.
Select the site in the sidebar. The detail view shows its status, address, credentials, database and PHP version.
| Action | Shortcut | What it does |
|---|---|---|
| Start / Stop | ⌘R | Starts PHP's built-in server on the site's own localhost port (and the database server, if needed). |
| Open Site | ⌘O | Opens http://localhost:<port> in your chosen browser. |
| WP Admin | ⇧⌘A | Opens /wp-admin already signed in, without typing a password. |
| Emails | ⇧⌘E | Opens the Mailpit inbox. |
| Share | Creates a temporary public link (see step 5). |
The More menu adds Show in Finder, Open in Editor, Open in Terminal, Copy Address, Rename… and Delete Site…. Deleting moves the folder to the Trash; MySQL/MariaDB databases are not deleted.
The WordPress Access card shows the username and password and has Generate New Password…. If the stored credentials stop working, for example after restoring a WPvivid backup from production, it changes to Restore Access, which resets the admin password without touching any other data.
The site folder is a normal WordPress install, so you can edit themes and plugins with any editor. For command-line
work use wpc wp, which runs WP-CLI with the site's PHP and database:
cd ~/WP\ Center/my-site
wpc wp plugin install wpvivid-backuprestore --activate
wpc wp search-replace 'https://example.com' 'http://localhost:8901' --dry-runWhen a site starts, WP Center launches the bundled Mailpit (SMTP on 127.0.0.1:1025, web UI on 127.0.0.1:8025).
A small mu-plugin routes wp_mail() there, so password resets, WooCommerce orders and contact form submissions are
caught locally instead of being sent. If another Mailpit is already using port 1025, it is reused.
- Click Share, then Create Link (or Start and Create Link if the site is stopped).
- WP Center opens a Cloudflare Quick Tunnel
and copies a
https://….trycloudflare.comlink to the clipboard. - Send the link. The site works over HTTPS without any database change: URLs are rewritten on the fly.
- Click Stop Sharing when you're done. The link also closes when you stop the site or quit the app.
Important
This is the only feature that reaches the internet, and only when you start it. Automatic sign-in is refused for every request that comes through the tunnel.
- Install and activate the WPvivid Backup plugin in the site, for example with
wpc wp plugin install wpvivid-backuprestore --activate. - In the WPvivid Backup card, click Export….
- If any table uses a MySQL 8-only collation (
utf8mb4_0900_*), WP Center warns you and offers:- Convert and Export (recommended): converts to
utf8mb4_unicode_ci, which works on both MySQL and MariaDB. Your data is kept. - Export Without Converting: only if your cPanel uses MySQL 8.
- Convert and Export (recommended): converts to
- The backup files are saved to a subfolder named after the site and the date, in
~/Downloadsby default (configurable in Settings, or ask every time). - On cPanel, in a WordPress site with WPvivid installed: WPvivid → Backup & Restore → Upload → Restore.
Left out of the export, so the server gets only what belongs there:
- Studio leftovers (SQLite database, SQLite plugin and loader);
- development mu-plugins (
dev-*) and WP Center's own mu-plugins (automatic sign-in, mail, sharing); - files for AI agents (
AGENTS.md,CLAUDE.md,.claude/,.agents/, …).
The wp-config.php on cPanel is never replaced.
- On the server, in WPvivid → Backup & Restore, make a backup of the database and files and download it.
Large backups come in several parts (
….part001.zip,….part002.zip); keep them in the same folder. - In WP Center: File → Import Site… and choose the backup (any one part is enough). WP Center shows WPvivid as the source and suggests the domain as the name.
- Click Import. WP Center creates the site with its own database on the managed MariaDB/MySQL, swaps the live
URLs for
http://localhost:<port>and gives the first administrator a new password.
The WPvivid plugin isn't needed on your Mac, and the live site is never touched. Exports from WordPress Studio, Local
and another WP Center are imported the same way (wpc import <file> from Terminal).
To move a site to WP Center on another Mac, use For another WP Center in the site's Export card
(or wpc export --wpcenter). It writes one .zip with the files, the database, the PHP version and the database
engine; import it there with File → Import Site…. Passwords are not included.
The Live Sites section of the sidebar keeps your published WordPress sites next to the local ones, without mixing them up. It needs a small plugin on each site, WP Center Ligação, which ships inside the app.
- Click + next to Live Sites (or Connect Live Site…) and type the site's address, for example
shop.com. - If the plugin isn't there yet, click Save the Plugin…. On the site, open Plugins → Add New → Upload Plugin,
upload
wpcenter-ligacao.zipand activate it. To update it later, upload the new zip and choose Replace current with uploaded. - WP Center opens the site's own Authorize Application page in your browser. Approve it as an administrator. The browser hands the result back to the app, and the site appears in the sidebar.
Once connected:
| Where | What you can do |
|---|---|
| All Live Sites | One table with every site's WordPress and PHP versions and pending updates. Update All updates plugins and themes on every site; Check asks every site for new updates. |
| A site's detail | Plugins and themes with their versions and available updates, WordPress core updates, debug mode, and whether the server can update itself or asks for FTP. |
| WP Admin | Opens the dashboard already signed in (plugin 1.2 or later). Older plugins open the normal login page. |
| Disconnect | Revoke on the Site… opens the site's profile, where you revoke the "WP Center" application password; Disconnect from This Mac… forgets the site in WP Center. |
Updates run through WordPress's own updater on each site, the same one as the Update Now button. Make a backup first if the site has no recent one.
Note
Live sites must use HTTPS. Connecting uses WordPress's built-in application passwords: your admin password never reaches the app, and some security plugins (e.g. Wordfence) must allow application passwords.
Turn it on in Settings → Advanced → wpc command in Terminal. This creates ~/.local/bin/wpc, a symlink to the
app. Make sure ~/.local/bin is in your PATH, then open a new Terminal window.
Usage: wpc [--path <site-folder>] <command>
wpc list List the sites (--json)
wpc create "Name" Create and start a new site; --db sqlite|mariadb|mysql, --db-version 10.11, --php 8.3
wpc status Status, address, credentials and database of the site (--json)
wpc context Summary for agents: theme, builder, plugins, content, WooCommerce (--json)
wpc start Start the site (and the database server, if needed)
wpc stop Stop the site
wpc admin Open wp-admin already signed in
wpc login-url [page] One-time wp-admin sign-in link (e.g. plugins.php), valid for 60 s
wpc flush Clear caches: object cache, transients, permalinks, Elementor, cache plugins
wpc logs [lines] Recent PHP errors and wp-content/debug.log
wpc screenshot [page] Full-page PNG of a site page (e.g. contact/ or wp-admin/edit.php, signed in);
--width 390 for mobile, --viewport for the first screen only, --out file.png
wpc mail [ID] Latest emails caught by Mailpit; with an ID, shows one as text (--json)
wpc export WPvivid backup ready to restore on cPanel
--convert fix MySQL 8 collations
--no-convert keep them (MySQL 8 servers only)
--wpcenter the whole site in one .zip, for another WP Center
wpc duplicate Full copy of the site (files and database); --name "Name"
wpc import <file> Create a site from a WPvivid backup or a Studio, Local or WP Center export
wpc wp <args…> WP-CLI with the site's PHP and database
Commands act on the site in the current folder, or the one given with --path. Sites started from the CLI keep
running after the command exits, and the app and wpc can stop each other's servers.
| Pane | What you can configure |
|---|---|
| General | Open at login · what happens when WP Center opens (resume the sites that were running, or start none) and when it quits (stop the sites, or keep them running) · menu bar icon · export folder. |
| New Sites | Sites folder · default database engine, version and PHP version, to match your cPanel server. |
| Skills | Skills for AI agents, copied into each site's .claude/skills and .agents/skills. Turning one off removes it from every site. |
| Apps | Browser, code editor and terminal used by Open Site, WP Admin, Open in Editor and Open in Terminal. |
| Advanced | wpc command · install or remove PHP versions · installed database servers, with Remove… for unused ones. |
┌────────────────────────────── WP Center.app ──────────────────────────────┐
│ SwiftUI GUI · wpc CLI · --selftest (one executable, three modes)│
│ │
│ SiteStore ──► php -S 127.0.0.1:<port> router.php (one per site) │
│ │ └─ bundled PHP 8.4, or Homebrew php@8.x │
│ ├──────► mariadbd / mysqld ports 3310+ / 3320+, socket in /tmp │
│ ├──────► mailpit SMTP :1025 · UI :8025 │
│ └──────► cloudflared only while a share link is open │
│ │
│ LiveStore ──► https://<live-site>/wp-json/wpcenter/v1 (connected sites) │
│ │
│ Runtime/*.php ─ helpers run with `wp eval-file`, inputs via env vars │
└────────────────────────────────────────────────────────────────────────────┘
- Web server. Each site is served by PHP's built-in server with 4 workers. Port checks cover both
127.0.0.1and::1, solocalhostworks in every browser. Stopping a site ends the whole process tree. - Databases. Versioned, keg-only Homebrew formulas, each with a fixed port and its own data directory in
~/Library/Application Support/WP Center/Databases/. Servers start withutf8mb4_unicode_cias the default collation, which keeps backups compatible with MariaDB on cPanel. Each site gets its own random database and user. - WordPress configuration. The generated
wp-config.phpdisables automatic core updates, so a background update never contacts wordpress.org mid-request. You can still update manually from the dashboard. - Helper scripts.
Runtime/*.phprun inside the site through WP-CLI. They read their inputs from environment variables, never argv, so secrets don't show up inps, and they return oneWPCENTER_RESULT {json}line. - Live sites. The WP Center Ligação plugin (
Plugin/wpcenter-ligacao/) adds three admin-only REST routes:status(versions, plugins and themes with their updates),update(runs WordPress's own upgraders) andlogin(a one-time sign-in code). The app authenticates with an application password created when you approve the connection in the browser. - State.
~/Library/Application Support/WP Center/holdssites.jsonandlive-sites.json(both mode0600), per-site logs and database data.
- No external services. No accounts, analytics, crash reporting or update checks. The only outbound connections are a share link, while it is open, and the live sites you connect yourself.
- Automatic sign-in uses a one-time token stored only as a SHA-256 hash. It is valid for 60 seconds and accepted
only in the
localenvironment, only from loopback and never through a share tunnel. - Live sites are reached over HTTPS only, with a WordPress application password that you approve in the browser and can revoke at any time in the site's profile. Your admin password never reaches the app. The plugin's routes only answer administrators, and its WP Admin sign-in code is single-use, valid for 60 seconds and stored only as a SHA-256 hash.
- Managed databases give root access only through a local Unix socket, with no password and no network access.
- Credentials are stored in
sites.jsonandlive-sites.jsonwith owner-only permissions and passed to helpers through environment variables.
Sources/WPCenter/
App.swift entry point (GUI, CLI, self-test) and the SelfTest suite
Engine.swift SiteStore: sites, servers, PHP versions, export, sharing, Mailpit
Database.swift database engines and the official cPanel version table
CLI.swift the wpc command
Transfer.swift import from Studio, Local, WPvivid and WP Center, export for another WP Center, duplicate
Live.swift LiveStore: connected live sites and their REST API
LiveViews.swift the Live Sites views
Preferences.swift settings, login item, browser/editor/terminal choice
Views.swift all SwiftUI views
Runtime/ router, PHP helpers, mu-plugins and AI-agent skills copied into the app
Plugin/ WP Center Ligação, the plugin for live sites (zipped into the app by build.sh)
Localization/ en.lproj (English text), pt-PT.lproj and pt.lproj
Assets/, Scripts/ logo and app icon generator
build.sh builds dist/WP Center.app
There is no XCTest target. The app ships with an end-to-end self-test:
"dist/WP Center.app/Contents/MacOS/WPCenter" --selftestIt creates real sites in a temporary folder (SQLite, every installed managed MariaDB/MySQL version and every installed
Homebrew PHP), starts them, makes HTTP requests and checks sign-in, access reset, rename, collations, PHP versions and
stop behaviour. Exit code 0 means every check passed.
| Problem | Fix |
|---|---|
| "Homebrew is not installed" | Install it from brew.sh and try again. It's only needed for MariaDB/MySQL and extra PHP versions. |
| "Port … is in use by another app" | Another database server (or Studio) is using that port. Stop it, then start the site again. |
| The site didn't start | The error shows the log path: ~/Library/Application Support/WP Center/Logs/<site-id>.log. |
| Credentials stopped working after a restore | Use Restore Access in the WordPress Access card. |
| "The WPvivid plugin is not active on this site" | Install and activate WPvivid Backup before exporting. |
wpc: command not found |
Turn on the command in Settings → Advanced, add ~/.local/bin to your PATH and open a new Terminal window. |
| "This site doesn't accept application passwords" | Make sure the site uses HTTPS and that no security plugin (e.g. Wordfence) turned application passwords off. |
| "The WP Center Ligação plugin isn't active on this site" | Use Save the Plugin…, upload it in Plugins → Add New → Upload Plugin on the site, activate it and click Check. |
| Live site WP Admin opens the login page | Update the site's WP Center Ligação plugin to 1.2 or later. |
| A new build doesn't seem to apply | Quit the running app first: osascript -e 'tell application id "local.wpcenter" to quit'. |
WP Center builds on WordPress, WordPress Studio, WP-CLI, SQLite Database Integration, WPvivid, Mailpit, cloudflared, WordPress agent skills and Homebrew.
WP Center is an independent project and is not affiliated with Automattic, WordPress.com, cPanel, WPvivid or Cloudflare.
Bug reports and pull requests are welcome. See CONTRIBUTING.md for how to build, test and follow the project's conventions.
WP Center is free software, released under the GNU General Public License v2.0 or later, the same licence as WordPress and WordPress Studio.
The built app bundles third-party components that keep their own licences:
| Component | License |
|---|---|
| WordPress | GPL-2.0-or-later |
| SQLite Database Integration | GPL-2.0-or-later |
WordPress agent skills (Runtime/skills) |
GPL-2.0-or-later |
| Agent skills from WordPress Studio | GPL-2.0-or-later |
| WP-CLI | MIT |
| PHP | PHP License 3.01 |
| Mailpit | MIT |
| cloudflared | Apache-2.0 |