How Ledge tests updates in a sandbox copy of your site, what each status means, and how a run becomes a pull request.
An update run applies updates to a throwaway copy of your site, checks the result, and waits for you. If you approve it, Ledge opens a pull request with the changes. Nothing reaches your live site until you merge that pull request and deploy it.
Every update run needs the site's repository linked. Ledge tests the linked branch as it is now.
LEDGE_ACQUIRE_ENABLED=true, because the run starts from a copy of the production database. See Install the Craft plugin.Read Security before turning update runs on for a client's site. The sandbox receives production data.
Open the site's Updates page and click Test Update. If something's missing, the page shows the next step instead.
For Craft sites, the dialog lists the pending updates:
composer update too also updates the libraries Craft and its plugins depend on, such as Twig and Guzzle. It's on by default.Click Authorize & Start. You can also start runs from an AI assistant with start-update-run, or across many sites at once with Campaigns.
Configure on the Updates page sets how the sandbox is built:
composer install, before the update. Leave them empty to use your package.json build script. Choose the Node version, or let Ledge read .nvmrc.composer install, builds your front end and runs craft up, so it matches production before anything changes. Site URLs point at the sandbox, and email and the queue are switched off.craft up to apply migrations and project config.A run must finish within an hour, including the time it takes to copy the database.
| Status | What it means |
|---|---|
| Queued | Waiting to start. |
| Acquiring, Provisioning, Importing, Updating, Testing, Crawling | The run is in progress. The run page shows each step and its log. |
| Ready to apply | Everything passed. Waiting for you. |
| Needs review | The update applied, but something is worth a look. Waiting for you. |
| Opening PR | Ledge is opening the pull request. |
| PR opened | Done. The pull request is open. |
| No changes | Nothing could be updated, usually because the only updates need an expired licence. |
| Failed | The update couldn't be applied. See When a run fails. |
| Cancelled | You stopped the run. |
| Rejected | You declined the update. |
Needs review means one of these:
The crawl never fails a run. It only sends it to review.
Craft runs that reach Ready to apply or Needs review have a preview: a working copy of the updated site. Open it from Preview the updated site on the run page. The username and password are on the same card, and the password is unique to the run.
Anyone with the link and password can open the preview, so share it only with people who could see the live database.
Each of these deletes the sandbox.
Ledge pushes a new branch, named like ledge/craft-update-2026-11-09-a1b2c3, and opens a pull request against the linked branch. The pull request lists the packages that changed and the run's results.
It can only change composer.json, composer.lock and, on Craft sites, files in config/project/. Your branch protection rules and CI still apply.
From the run page you can Merge PR once the pull request can be merged, or arm auto-merge to merge when checks pass. Auto-merge is cancelled if checks fail or the pull request has conflicts. On a repository with no CI checks, auto-merge merges straight away.
After the merge, your usual deploy takes over. If the default branch runs GitHub Actions, the run page shows whether the deploy succeeded.
Click Automatic updates on the Updates page to test updates on a schedule.
| Setting | Options | Default |
|---|---|---|
| Cadence | Weekly, Every other week, Monthly, As needed | Weekly |
| Day | Any day of the week | Monday |
| Time | Any hour, in your timezone | 04:00 |
| Cooldown | 0 to 30 days | 2 days |
| Auto-merge when clean | On or off | Off |
| Respond to advisories | On or off | Off |
A scheduled run doesn't start while another run on the site is waiting for you. Scheduled runs skip plugins with expired licences.
When a run fails, Ledge reads the end of the log and explains what went wrong, with a suggested fix and the packages that blocked it. Common causes:
composer install or migrations failed, often for the same reason they would on production.The full log is on the run page under Log. Run history is kept for 180 days.
Update runs alert the site's notification policies when a run is ready for review, needs review, finishes with no changes, fails, or is merged. Runs started from a campaign don't send per-site alerts.