The Git layer for WordPress

Your WordPress sites, under version control.

Clone the theme, hooks, plugin versions and Composer deps to files. Review them in a PR, push them back. The content and the database stay where they are.

TerminalUnder a minute, start to finish
$ npm install -g @loopress/cli
$ lps project config
→ opens your browser to authorize
✓ "my-site/production" configured
$ lps init
✓ loopress.json created, ready to commit
$ lps pull
✓ plugins, ACF, API routes, snippets pulled to files
01 · Demo

Wire Loopress into a WordPress project in under a minute.

Install the CLI, authorize in the browser, and pull your first resource to a file. No SSH, no manual plugin upload.

02 · The Problem

The live site and your repo have drifted apart.

A client site runs code and config that was never committed anywhere. Every change made in the admin is a change you cannot diff, review, or roll back. The safe move, test it locally first, is the slow one, so it does not happen.

  • PRODYou edit theme and config straight in prod because local is too slow to set up
  • LOGNo git log for what changed on the live site, or who changed it
  • DRIFTPlugin versions drift between environments, no lockfile to pin them
  • SSHComposer packages need SSH the host does not give you
Today
  • FTP into prod, edit the theme in place
  • Snippets pasted into the admin
  • "which plugin version is on staging?"
  • DB export to move anything
With Loopress
  • git clone, edit, git push
  • Snippets and hooks as .php files
  • Versions pinned in loopress.json
  • Content stays put, only code moves
03 · The Solution

Declare the desired state. Loopress reconciles.

A versioned file describes how a resource should look: a hook, a plugin version, a Composer dependency, an API route, an app bundle. Loopress diffs that file against the live site and applies only what changed. The same loop for every resource, and never your content or your database.

lps · workflow
Live WordPress
Live WordPress
Real state
lps pull
Pull to local files
Git
Git
Commit & review
Pull Request
Diff & approve
lps push
Reconcile the site
$ lps pull
~ loopress.json (plugins)
+ acf/product-fields.json
~ api/webhook-handler.php
$ git diff --stat
3 files changed, 18 insertions(+), 4 deletions(-)
$ lps push
✓ Reconciled · 3 resources applied
04 · Features

One resource at a time, all in Git.

Each Loopress feature is one kind of resource: a file that describes a desired state, and a command that reconciles it with the site.

F.01

Hooks

In progress

Declare actions and filters as PHP 8 classes with attributes. Loopress loads and wires each file onto native add_action / add_filter: no admin paste box, no runtime of its own. The durable home for behavior you want to keep.

hooks/PriceFormatter.php
  use Loopress\Hook\On;

  class PriceFormatter
  {
      #[On('woocommerce_get_price_html')]
      public function suffix(string $html): string
      {
          return $html . ' incl. VAT';
      }
  }
$ lps hooks push
# wired onto add_filter('woocommerce_get_price_html')
F.02

Plugin Lockfile

Declare plugin versions in loopress.json, like a package.json for WordPress. lps plugin pull merges what's actually live into your manifest instead of overwriting it, so drift never turns into a fight.

loopress.json · plugins
  "plugins": {
    "woocommerce": "9.4.2",
    "contact-form-7": "6.0.5",
    "fluent-crm": "3.1.6"
  }
$ lps plugin push
✓ Installed: contact-form-7 6.0.5
✓ Already up to date: woocommerce, fluent-crm
F.03

Composer without SSH

Search and install any Packagist package from the WordPress admin, no terminal, no SSH. Every install is checked: known CVEs flagged, PHP version mismatches caught before they break anything.

Download Loopress Full
WordPress Admin · Loopress · Dependencies
Search: tcpdf
✓ tecnickcom/tcpdf found on Packagist
> Install
✓ Installing tecnickcom/tcpdf ^6.7
✓ Autoloader updated in wp-content/loopress/
F.04

Apps

Version a Vue, React or Svelte front-end alongside the rest of the config. Your CI runs the build, lps app push ships the dist/ output over the REST API, and a shortcode mounts it into any page.

apps/search/
  loopress.app.json
  dist/            # your build output
    index.html
    assets/index-9a597e0d.js
$ lps app push search
✓ Uploaded 4 changed files
[loopress_app name="search"]
F.05

API Routes

Ship a REST API for your headless front-end as version-controlled PHP files, one class, one method per HTTP verb, wired onto native register_rest_route(). A broken route is skipped and logged instead of taking down the rest of your API.

api/webhook-handler.php
  class WebhookHandler
  {
      public function post(): array
      {
          return ['received' => true];
      }
  }
$ lps api push
✓ Deployed: /loopress-api/v1/webhook-handler
F.06

Snippets

Interop with Code Snippets and WPCode. Pull existing snippets to .php files for a one-off edit, or to move them into Git on the way to hooks. Same pull, edit, push loop, no database dump.

snippets/disable-emojis.php+ 3 / − 1
  <?php
- // remove_action('wp_head', ...);
+ remove_action('wp_head', 'print_emoji_detection_script', 7);
+ remove_action('wp_print_styles', 'print_emoji_styles');
+ remove_filter('the_content_feed', 'wp_staticize_emoji');
$ lps snippet push
✓ Updated: disable-emojis
F.07

Official CI configs

Bootstrap a full, disposable WordPress instance in GitHub Actions or GitLab CI and run lps against it in one step: not a mock, ready for real Playwright e2e tests, with database snapshots between test groups.

.github/workflows/loopress.yml
steps:
  - uses: actions/checkout@v4
  - uses: loopress/setup-ci@main
  - run: lps push
✓ WordPress + MySQL started
✓ Reconciled: 8 resources applied
05 · Security

Secure by default, not by configuration.

Installing Composer packages without SSH, and wiring hooks and REST routes from Git, are exactly the kind of features a senior developer should be suspicious of. Here is what is actually enforced, and where the trust actually sits.

Official WordPress auth, nothing proprietary

Every command authenticates with a WordPress Application Password, the same mechanism WordPress core has shipped since 5.6. Revoke it from Users → Profile at any time and access stops immediately, no Loopress involvement required.

Snippets: trust stays with the plugin you already run

For snippets, Loopress touches neither storage nor execution. It pushes to Code Snippets or WPCode, established plugins with years of production use around running PHP from the admin. You inherit their hardening and their track record, not a new one.

Hooks and API Routes: native primitives, no runtime of our own

Loopress loads and wires each file with its own loader and Composer resolution, then execution runs through add_action, add_filter and register_rest_route. The code runs exactly as if you had written it by hand in a plugin. The shape is constrained too, one class, one method per hook or verb, so it audits better than an arbitrary blob of PHP.

API routes are admin-only by default

A route deployed via lps api requires the manage_options capability unless the file explicitly opts into something else with a permission() method. Nothing is public unless you say so.

Reviewed before it runs

Every hook, every route, every Composer dependency is a file in your Git repository before it is ever live on WordPress: no plugin you didn't read, no code that skipped a pull request.

06 · Integrations

Fits into the tools you already use.

LiveAvailable
CO
Code Snippets
Pull, push, and list snippets via the CLI.
WP
WPCode
Same CLI commands, targets WPCode instead.
PL
Plugin Directory
Install and version any plugin from the WordPress.org directory.
PA
Packagist
Install any public Composer package from the admin.
AC
ACF
Field groups, post types, taxonomies and options pages as JSON, synced via CLI.
RA
Rank Math
Titles, schema defaults, post meta, and redirects synced via CLI.
YO
Yoast SEO
Titles, meta, and post-level SEO fields synced via CLI.
PlannedPlanned
SI
Site Options
planned
WordPress options and site settings as code.
RO
Roles & Caps
planned
User roles and capabilities as code.
WO
WooCommerce
planned
Settings and shipping zones as code.
07 · Agencies

Built for teams running many client sites.

If you maintain a dozen WordPress sites you did not all build, the problem is not any one of them. It is that none of them are reproducible, and every prod change is a bet.

Onboard a site in minutes

git clone, lps push, and a new machine matches the client's setup. No FTP archaeology, no manual DB export to hand around.

A git log that means something

History on the code and config that actually breaks sites, not buried under thousands of content revisions. You can see who changed what, and when.

The end of "I'll just fix it in prod"

Local stops being the slow path. Testing a change first becomes the fast option, so it actually happens.

Diffs and rollbacks you can trust

The scope is structured and stable, so a diff is readable and a rollback does what you expect. Content is never in the blast radius.

Built in the open. Shaped by the community.

The CLI and the plugin are open source. Leave your email to follow along and get notified when things move.

No spam. No marketing. Just product updates from the team.