---
title: "CoreProtect: Logging, Lookups and Rollbacks for Minecraft"
description: "Use CoreProtect on your Minecraft server: /co inspect, lookup parameters, safe rollbacks with #preview, the radius trap, purge retention and permissions."
url: "https://www.gameserverkings.com/knowledge-base/minecraft/coreprotect-rollback/"
category: "Minecraft"
category_url: "https://www.gameserverkings.com/knowledge-base/minecraft/"
published: "2026-08-19T10:07:49.984Z"
updated: "2026-08-19T10:20:09.179Z"
source_format: "markdown"
site: "GameServerKings"
---

# CoreProtect: Logging, Lookups and Rollbacks for Minecraft

A player logs on, finds their base hollowed out, and asks you who did it. Without a block logger you have no answer and no repair — the only tool left is a world backup, which costs everyone else their afternoon. CoreProtect is the plugin that turns that into a two-minute job: right-click the hole, read the name, roll back exactly what that player touched and nothing else.

It has been in continuous development since early 2012 and it is the de-facto standard block logger on Paper, Spigot and Purpur. It needs no configuration to start working. Install it, restart, and it logs from that moment onwards.

This guide covers the inspector, lookups, rollbacks and restores, every parameter letter, the radius trap that turns a small incident into a big one, retention and purging, permissions, and the storage backends. The wider question of when to roll back versus when to restore a backup is covered in [Minecraft Grief Protection and Rollback](/knowledge-base/minecraft/grief-protection-and-rollback/).

## Installing It

Drop the jar in `plugins/` and restart. There is nothing to configure first; `plugins/CoreProtect/config.yml` is generated on first run with sensible defaults. Plugin installation in general is covered in [How to install plugins for Minecraft Java Edition](/knowledge-base/minecraft/java-plugins/).

As of 19 August 2026 the current public **Community Edition** release is **v24.0**, published 7 July 2026, supporting Spigot **1.16.5 through 26.1.2**. It does **not** yet cover Minecraft 26.2 in a stable public build — the project's development builds cover 26.2 and later, and those are available either self-compiled from GitHub or pre-compiled through the project's Patreon. CoreProtect runs on Bukkit, Spigot, Paper, Purpur, Folia and MultiPaper.

> [!IMPORTANT] There are several separate CoreProtect editions
> The Spigot download is the Community Edition for modern Bukkit-family servers. **CoreProtect for Fabric is a different build, distributed through the project's Patreon rather than the main download page.** There is also a Legacy Edition for Spigot 1.8 to 1.12, and a Hytale edition. Grab the wrong one and it will not load.

> [!WARNING] Nothing that happened before you installed it exists
> CoreProtect replays a log, and the log starts when the plugin starts. There is no way to recover griefing from before the install. If you are reading this because something has already happened, your only option is a world backup from before the incident — see [How to create a backup](/knowledge-base/general/how-to-create-a-backup/).

## The Commands

Every CoreProtect command is a subcommand of `/co`. `/core` and `/coreprotect` are longer aliases.

| Command | Short | What it does |
|---|---|---|
| `/co help` | — | List the commands in game |
| `/co inspect` | `/co i` | Toggle the inspector |
| `/co lookup` | `/co l` | Query the log |
| `/co rollback` | `/co rb` | Undo logged changes |
| `/co restore` | `/co rs` | Redo them — the opposite of a rollback |
| `/co near` | — | A lookup with a radius of 5 |
| `/co undo` | — | Revert your last rollback or restore |
| `/co purge` | — | Delete old log data |
| `/co status` | — | Plugin status and version |
| `/co reload` | — | Reload `config.yml` |
| `/co consumer` | — | Console-only: pause or resume queue processing |
| `/co migrate-db` | — | Console-only: move data to another database backend |

## Step One: Inspect

`/co i` turns the inspector on; running it again turns it off. With it on, clicking tells you the history of what you clicked:

| Action | What you learn |
|---|---|
| Left-click a block | Who placed that block |
| Right-click a block | What adjacent block was removed |
| Right-click while placing a block into a location | What block was removed there |
| Right-click while placing a block *into* another block | Who placed the block you clicked into — put dirt into water to see who placed the water |
| Right-click a door, chest, lever or similar | Who last used it |

For most incidents this is the entire investigation. Walk to the hole where the wall used to be, right-click into it, read the name.

## Step Two: Look Up

`/co lookup` takes the same six parameters as `/co rollback` and `/co restore`, which is why learning them once is worth the effort. All of them are optional.

| Parameter | Meaning | Examples |
|---|---|---|
| `u:<user>` | One or more users, or a cause | `u:Notch`, `u:Notch,Intelli`, `u:#creeper,#tnt,#fire,#explosion` |
| `t:<time>` | How far back to look | `t:1h`, `t:5d2h`, `t:2w,5d,7h,2m,10s`, `t:2.50h`, `t:1h-2h` |
| `r:<radius>` | Area to limit to | `r:20`, `r:#global`, `r:#world_nether`, `r:#worldedit` (or `r:#we`) |
| `a:<action>` | Restrict to one action | `a:block`, `a:-block`, `a:container` |
| `i:<include>` | Only these blocks, items or entities | `i:stone`, `i:diamond_ore`, `i:stone,oak_wood,bedrock` |
| `e:<exclude>` | Everything except these | `e:tnt`, `e:stone,dirt` |

Time amounts combine and accept decimals, so `t:5d2h` is five days and two hours and `t:2.50h` is two and a half. A range like `t:1h-2h` looks at the window between one and two hours ago.

### The action list

Several actions take a `+` or `-` prefix. `+` means added, `-` means removed.

| Action | Covers |
|---|---|
| `a:block` / `a:+block` / `a:-block` | Blocks placed and broken / placed / broken |
| `a:container` / `a:+container` / `a:-container` | Items in chests / put in / taken out |
| `a:inventory` / `a:+inventory` / `a:-inventory` | Player inventory movements |
| `a:item` / `a:+item` / `a:-item` | Items dropped, thrown, picked up, deposited or withdrawn |
| `a:click` | Player interactions with blocks |
| `a:kill` | Mobs and animals killed |
| `a:spawn` | Entities placed or spawned by players |
| `a:session` / `a:+session` / `a:-session` | Logins and logouts / logins / logouts |
| `a:chat` | Chat messages |
| `a:command` | Commands used |
| `a:sign` | Text written on signs |
| `a:username` | Username changes |

```text title="Who mined all the diamonds in the last hour?"
/co lookup i:diamond_ore t:1h a:-block
```

```text title="Everything one player did to chests in three days"
/co lookup u:Steve t:3d a:container
```

```text title="Every login this player has ever made"
/co lookup u:Steve a:session
```

Results are paginated. `/co l <page>` moves between pages, and `/co l 1:10` returns ten lines starting at page one. Adding `#count` returns just the number of matching rows, which is the fastest way to size an incident before you touch anything.

> [!TIP] Lookups are global by default; rollbacks are not
> **A lookup with no `r:` searches the entire server.** That makes `/co lookup u:Griefer t:6h #count` a safe first move on any incident — it tells you how much damage there is before you commit to anything.

## Step Three: Roll Back

> [!CAUTION] This is the mistake that turns a small incident into a big one
> **A rollback with no `r:` uses a radius of 10 blocks around you.** The command you just ran to survey damage across the whole map will, if you swap `lookup` for `rollback`, fix only the ten blocks nearest your feet — and the console will report success, so you will believe the job is done. Always state the radius on a rollback. `r:#global` for the whole server, `r:#world_nether` for one world, or a number.

Preview first. `#preview` runs the rollback visually, for you alone, without changing the world:

```text title="Preview, then commit"
/co rollback u:Griefer t:2h r:#global #preview
/co rollback u:Griefer t:2h r:#global
```

If the result is wrong, `/co undo` reverses your last rollback or restore by running the opposite action over the same data. `/co restore` does the same thing explicitly and is also how you *reapply* something you rolled back by mistake.

Four refinements do most of the real work:

- **`a:-block` rolls back only what they broke**, leaving anything they placed alone. Useful when a griefer also built something you want to keep as evidence.
- **`e:stone,dirt`** excludes block types you would rather not churn.
- **`i:diamond_ore`** does the inverse and touches only what you name.
- **`r:#worldedit`** (or `r:#we`) limits the rollback to your current WorldEdit selection. This is the cleanest way to repair one building without touching its neighbours — select the damage with `//wand`, then roll back inside it. See [Minecraft WorldEdit: Selections, Brushes and Schematics](/knowledge-base/minecraft/worldedit-and-schematics/).

Four hashtags can be appended to a command:

| Hashtag | Effect |
|---|---|
| `#preview` | Preview a rollback or restore without changing the world |
| `#count` | Return the number of matching rows in a lookup |
| `#verbose` | Print extra detail during a rollback or restore |
| `#silent` | Print minimal detail |

### Worked examples

```text title="Roll back everything Notch did in the last hour, except stone and dirt"
/co rollback u:Notch t:1h r:#global e:stone,dirt
```

```text title="Roll back only stone Notch broke in the last hour, within 20 blocks"
/co rollback u:Notch t:1h i:stone a:-block r:20
```

```text title="Roll back everything anyone did in the last 15 minutes inside a WorldEdit selection"
/co rollback t:15m r:#worldedit
```

```text title="Restore a chest's contents after an over-broad rollback"
/co restore u:Steve t:20m r:10 a:container
```

## Retention: Your Rollback Window Is Finite

```text title="Keep the last 30 days, delete the rest"
/co purge t:30d
```

Purging is how you stop the database growing forever, and whatever value you purge at *is* your rollback window.

From the console, `/co purge` can delete anything older than 24 hours. In game it will only delete data older than 30 days — a guard rail against somebody purging the evidence of their own griefing. You can scope a purge to a world (`/co purge t:30d r:#world_nether`, CoreProtect v19 and later) or to block types (`/co purge t:30d i:stone,dirt`, v23 and later).

Adding `#optimize` also reclaims disk space, but it is rarely worth it: SQLite already rebuilds and reclaims as part of a manual purge, DuckDB checkpoints automatically, and on MySQL and ClickHouse `#optimize` can slow the purge down significantly. The project's own guidance is that it is generally unnecessary.

> [!IMPORTANT] Retention is the real limit on what you can undo
> A griefer who plants a trap and triggers it two months later is past the end of a 30-day log, and there is nothing to replay. Pick a retention period you can live with. It is a straight trade against disk usage, and it is the number that decides whether an old incident is recoverable at all.

CoreProtect 24.0 and later can purge on a daily schedule via `auto-purge` in `config.yml` — `auto-purge: 180d` keeps 180 days, the minimum accepted value is `30d`, and `auto-purge-time: 03:30` moves the run off midnight. **That feature is exclusive to the project's Patreon builds.** On a Community Edition build, put a `/co purge` on the panel's **Schedules** tab instead; scheduling is covered in [Minecraft Scheduled Restarts and Server Automation](/knowledge-base/minecraft/scheduled-restarts-and-automation/).

If you are enabling automatic purging on a database that has never been purged, run one manual `/co purge` at the same retention first, so the scheduled runs are only keeping up rather than catching up.

## Permissions

Every command has its own node and they all default to op:

| Node | Grants |
|---|---|
| `coreprotect.*` | Everything |
| `coreprotect.inspect` | `/co inspect` |
| `coreprotect.lookup` | `/co lookup` |
| `coreprotect.rollback` | `/co rollback` |
| `coreprotect.restore` | `/co restore` |
| `coreprotect.purge` | `/co purge` |
| `coreprotect.reload` / `.status` / `.consumer` | The corresponding commands |
| `coreprotect.teleport` | Teleporting to a lookup result |

There is also a set of **child permissions** designed to be used *negatively*: `coreprotect.lookup.block`, `.chat`, `.click`, `.command`, `.container`, `.inventory`, `.item`, `.kill`, `.spawn`, `.near`, `.session`, `.sign` and `.username`. Each defaults to op, and setting one to `false` on a rank removes that one kind of lookup while leaving the rest.

```text title="A junior moderator who can investigate blocks but not read chat"
lp group mod permission set coreprotect.lookup true
lp group mod permission set coreprotect.rollback true
lp group mod permission set coreprotect.lookup.chat false
lp group mod permission set coreprotect.lookup.command false
lp group mod permission set coreprotect.purge false
```

Setting a negative node is a LuckPerms job, not a CoreProtect one — see [How to Set Up LuckPerms Permissions for Minecraft](/knowledge-base/minecraft/luckperms-permissions/). Note the difference between `unset` and `false` there: only an explicit `false` beats an inherited `true`.

## Where the Data Lives

The database sits in `plugins/CoreProtect/`, selected by `database-type` in `config.yml`. Four backends exist:

| Value | Storage | Needs |
|---|---|---|
| `duckdb` | Embedded columnar file, `plugins/CoreProtect/database.duckdb` — the default for new installs | CoreProtect 25.0+ |
| `sqlite` | Embedded legacy relational file | Nothing beyond CoreProtect |
| `mysql` | External relational database | A reachable MySQL server |
| `clickhouse` | External columnar database | CoreProtect 25.0+ and ClickHouse 25.6+ |

New installations on 25.0 and later default to DuckDB; on older builds, including the current 24.0 Community Edition, new installs use SQLite. Upgrading an existing install never silently switches backend — CoreProtect derives the value from your old config and writes the matching `sqlite` or `mysql` entry.

Two warnings about changing it. **Changing `database-type` selects a different dataset; it does not copy your data**, so you will appear to have lost your history. And migration (`/co migrate-db <target>`) is a Patreon-build feature: SQLite to MySQL needs 23.0+, and anything involving DuckDB or ClickHouse needs 25.0+. Migration is console-only, pauses persistence while it runs, can take hours on a large database, and requires an empty target.

For most servers, leave it alone. MySQL is worth considering only if you want the log off the game server's disk — you can create one from the panel's **Databases** tab, per [How to create a Database via your panel](/knowledge-base/general/how-to-create-a-database-via-your-panel/).

> [!WARNING] The log is not a backup, and it sits on the same disk as the world
> A rollback replays *events*; a backup stores *state*. CoreProtect cannot help with a corrupted region file, a botched version upgrade, a world folder somebody deleted, or a volume-level failure — none of those fired a block-change event, and the database dies with the world anyway. Take a backup before you roll back. `/co undo` is your first line of retreat; the fresh backup is your second.

## Common Issues

- **`/co rollback` only fixed a small area.** No `r:` was given, so it used the default radius of 10. Re-run with `r:#global` or a number.
- **`/co lookup` returns nothing for an old incident.** It is past your purge retention, or it predates the install.
- **The rollback rebuilt the griefer's work too.** You rolled back everything they did. Use `a:-block` to reverse only breaks.
- **Items came back but the ones in the thief's inventory did not.** Container transactions (`a:container`) restore what was taken from a chest. A rollback acts on the world, not on hunting items down across the map.
- **The database file is huge.** Expected on a busy server. Purge to a retention you can live with; `#optimize` will not help on SQLite because a manual purge already reclaims space.
- **The plugin loaded but nothing is logged.** Check `/co status`, and check the per-world logging settings and the logging blacklist in `config.yml` — both can turn logging off for specific worlds, users or blocks.
- **It will not start on a Fabric server.** The Bukkit build does not run on Fabric. The Fabric edition is a separate Patreon-distributed download.

## FAQ

### Can I roll back griefing from before I installed CoreProtect?

No. It replays only what it logged, and it starts logging when it starts running. A world backup from before the incident is the only option.

### How far back can it roll back?

As far as your data goes, which is set by how often you purge. `/co purge t:30d` leaves a 30-day window.

### Does CoreProtect slow the server down?

It writes through a background consumer queue rather than on the main thread, and some of the busiest servers in the game run it. If you suspect it, profile rather than assume — see [Diagnosing Minecraft Server Lag](/knowledge-base/minecraft/diagnosing-lag-and-low-tps/).

### Will it undo stolen items?

Container transactions are logged, so `a:container` rollbacks restore items taken from chests. `a:inventory` records what moved through a player's own inventory, but a rollback acts on the world rather than reaching into people's inventories.

### Does it log WorldEdit?

Yes, and supported FastAsyncWorldEdit clipboard pastes too. That is also why `r:#worldedit` works as a rollback scope.

### Do I need WorldGuard as well?

They do different jobs and most established servers run both. CoreProtect is the higher priority: without it an incident is unrecoverable, whereas without WorldGuard it is merely repeatable. See [Minecraft WorldGuard: Region Protection Explained](/knowledge-base/minecraft/worldguard-region-protection/).

### What is the fastest sequence when something has just happened?

Ban or kick the griefer, take a manual backup, `/co i` and click the damage to identify them, `/co lookup u:<name> t:6h r:#global #count` to size it, `#preview` the rollback, then commit it. The full runbook is in [Minecraft Grief Protection and Rollback](/knowledge-base/minecraft/grief-protection-and-rollback/).

## What to Read Next

- [Minecraft Grief Protection and Rollback](/knowledge-base/minecraft/grief-protection-and-rollback/) for the incident runbook and how rollbacks compare to backups
- [Minecraft WorldGuard: Region Protection Explained](/knowledge-base/minecraft/worldguard-region-protection/) for stopping it happening again
- [Minecraft WorldEdit: Selections, Brushes and Schematics](/knowledge-base/minecraft/worldedit-and-schematics/) for `r:#worldedit` selections
- [How to Set Up LuckPerms Permissions for Minecraft](/knowledge-base/minecraft/luckperms-permissions/) for the negative child permissions above
- [How to create a backup](/knowledge-base/general/how-to-create-a-backup/) — the layer CoreProtect does not replace
- [Minecraft Scheduled Restarts and Server Automation](/knowledge-base/minecraft/scheduled-restarts-and-automation/) for scheduling a purge without a Patreon build
- [Minecraft Whitelist and Ban Management](/knowledge-base/minecraft/whitelist-and-ban-management/) for keeping them out afterwards

**Primary sources used for this guide** (all checked 19 August 2026): the official [CoreProtect documentation](https://docs.coreprotect.net) — [commands and parameters](https://docs.coreprotect.net/commands/), [permissions](https://docs.coreprotect.net/permissions/), [configuration](https://docs.coreprotect.net/config/), [automatic purging](https://docs.coreprotect.net/auto-purge/) and [database migration](https://docs.coreprotect.net/database-migration/); the [CoreProtect Community Edition resource page on SpigotMC](https://www.spigotmc.org/resources/coreprotect.8631/) for the current release, supported versions and the separate Fabric, Legacy and Hytale editions; and the [CoreProtect project on Modrinth](https://modrinth.com/plugin/coreprotect).

---

Made with 💜 by GameServerKings
