{"id":77515,"date":"2026-06-04T14:24:41","date_gmt":"2026-06-04T11:24:41","guid":{"rendered":"https:\/\/vpesports.com\/minecraft\/mods\/granitelog\/"},"modified":"2026-06-04T14:24:41","modified_gmt":"2026-06-04T11:24:41","slug":"granitelog","status":"publish","type":"mod","link":"https:\/\/vpesports.com\/minecraft\/mods\/granitelog\/","title":{"rendered":"GraniteLog &#8211; Coreprotect Alternative"},"content":{"rendered":"<p># GraniteLog \u2014 Lightweight, Fast &#038; Modern Block Logger for Paper\/Spigot<\/p>\n<p>GraniteLog is a **high-performance block logging and rollback plugin** built for Paper\/Spigot servers.<br \/>\nIt prioritizes **speed, clarity, and admin usability**, while keeping the database schema **simple, efficient, and migration-friendly**.<\/p>\n<p>\u2705 Actively tested on latest Paper builds<br \/>\n\u2705 Compact storage with **zero-NBT by default** (optional JSON compression)<br \/>\n\u2705 Multiple storage options: **SQLite, MySQL\/MariaDB, PostgreSQL**<\/p>\n<p>&#8212;<\/p>\n<p>##  Key Features<\/p>\n<p>###  Block &#038; Action Tracking<\/p>\n<p>* Tracks **all major block-related events**:<\/p>\n<p>  * Block place\/break, fluid flow, crop growth, explosions<br \/>\n  * Interactions: doors, levers, buttons, beds, armor stands, sign edits, books<br \/>\n  * Container edits (add\/remove items) with **meta-aware diffs**<br \/>\n  * Hopper\/pipe IO moves tracked separately<\/p>\n<p>###  Investigation Tools<\/p>\n<p>* **\/inspect** \u2014 Click blocks to view full history<\/p>\n<p>  * Sneak \u2192 paginate results<br \/>\n  * Sprint \u2192 view container diffs + recent sign edits<br \/>\n* **\/lookup** \u2014 Quickly list changes at the targeted block<\/p>\n<p>###  Rollback, Restore &#038; Undo<\/p>\n<p>* Rollback\/restore **any set of changes** with filters:<\/p>\n<p>  * Radius, time, user, block ID, action, entity<br \/>\n* **Preview \u2192 Confirm workflow** prevents mistakes<br \/>\n* Each operation generates a **batch ID**, allowing precise undo with `\/rbundo`<\/p>\n<p>###  Discord Webhooks<\/p>\n<p>* Send formatted change logs straight to Discord<br \/>\n* Features:<\/p>\n<p>  * Multiple endpoints with **per-webhook action filters**<br \/>\n  * Async dispatch queue (won\u2019t block gameplay)<br \/>\n  * TNT explosions show **affected block counts**<\/p>\n<p>###  Storage &#038; Maintenance<\/p>\n<p>* Databases supported: **SQLite (default), MySQL\/MariaDB, PostgreSQL**<br \/>\n* Automatic schema migrations on startup<br \/>\n* Retention policy to purge old data automatically<br \/>\n* Optional **JSON meta compression** to save space<\/p>\n<p>###  Performance-Oriented<\/p>\n<p>* Async ingest queue with backpressure + drop counter<br \/>\n* Batched database writes &#038; optimized indices<br \/>\n* Configurable safety caps for heavy rollbacks<\/p>\n<p>&#8212;<\/p>\n<p>##  Commands Overview<\/p>\n<p>### Inspection &#038; Lookup<\/p>\n<p>* `\/inspect [on|off]` \u2192 Click a block for history<br \/>\n* `\/lookup [limit=N]` \u2192 List recent changes instantly<\/p>\n<p>### Rollback &#038; Restore<\/p>\n<p>* `\/rollback preview <filters>`<br \/>\n* `\/rollback confirm <filters>`<br \/>\n* `\/restore preview <filters>`<br \/>\n* `\/restore confirm <filters>`<br \/>\n* Filters: `radius|r`, `time=30m\/12h\/3d`, `user=<name>`, `block=<ns:id>`, `action=place,break,explode`, `entity=<ns:id>`, `chunklock`, `page=<n>`<\/p>\n<p>### Undo<\/p>\n<p>* `\/rbundo <batchId>` \u2014 Undo an exact rollback\/restore<\/p>\n<p>### Admin<\/p>\n<p>* `\/glog status` \u2192 Event &#038; queue stats<br \/>\n* `\/glog reload` \u2192 Reload config<br \/>\n* `\/glog purge olderThan:<time>` \u2192 Purge old rows (e.g. `90d`, `12h`)<br \/>\n* `\/glog migrate to:mysql` \u2192 Migrate data from SQLite \u2192 MySQL<\/p>\n<p>&#8212;<\/p>\n<p>##  Permissions<\/p>\n<p>GraniteLog uses fine-grained permission nodes so you can control who can investigate, rollback, and manage data.<\/p>\n<p>&#8220;`yaml<br \/>\npermissions:<br \/>\n  glog.inspect:<br \/>\n    description: Use inspect mode<br \/>\n    default: op<\/p>\n<p>  glog.lookup:<br \/>\n    description: Lookup history<br \/>\n    default: op<\/p>\n<p>  glog.rollback:<br \/>\n    description: Execute rollbacks<br \/>\n    default: op<\/p>\n<p>  glog.restore:<br \/>\n    description: Execute restores<br \/>\n    default: op<\/p>\n<p>  glog.rbundo:<br \/>\n    description: Undo a rollback batch<br \/>\n    default: op<\/p>\n<p>  glog.admin:<br \/>\n    description: Use GraniteLog admin commands<br \/>\n    default: op<br \/>\n    children:<br \/>\n      glog.admin.status: true<br \/>\n      glog.admin.purge: true<br \/>\n      glog.admin.reload: true<\/p>\n<p>  glog.admin.status:<br \/>\n    description: View GraniteLog status<br \/>\n    default: op<\/p>\n<p>  glog.admin.purge:<br \/>\n    description: Purge old GraniteLog records<br \/>\n    default: op<\/p>\n<p>  glog.admin.reload:<br \/>\n    description: Reload GraniteLog config\/locales<br \/>\n    default: op<br \/>\n&#8220;`<\/p>\n<p>### Permission Overview<\/p>\n<p>* **`glog.inspect`** \u2192 Toggle inspect mode and click blocks for history<br \/>\n* **`glog.lookup`** \u2192 Use `\/lookup` to list recent changes<br \/>\n* **`glog.rollback`** \u2192 Run rollbacks with `\/rollback`<br \/>\n* **`glog.restore`** \u2192 Run restores with `\/restore`<br \/>\n* **`glog.rbundo`** \u2192 Undo rollbacks\/restores with `\/rbundo`<br \/>\n* **`glog.admin`** \u2192 Master node for all admin commands<\/p>\n<p>  * `glog.admin.status` \u2192 View plugin statistics<br \/>\n  * `glog.admin.purge` \u2192 Purge old data<br \/>\n  * `glog.admin.reload` \u2192 Reload config and locales<\/p>\n<p>&#8212;<\/p>\n<p>## \u2699 Config Highlights (`config.yml`)<\/p>\n<p>* Choose storage: `sqlite | mysql | postgres`<br \/>\n* Configure limits:<\/p>\n<p>  * Inspect max entries<br \/>\n  * Rollback preview\/confirm thresholds<br \/>\n* Enable\/disable action logging (block, container, interactions, fluids, growth, explosions, containerIO)<br \/>\n* JSON compression with configurable threshold<br \/>\n* Webhook settings: endpoints, filters, timeouts<\/p>\n<p>&#8212;<\/p>\n<p>##  Data Migration (SQLite \u2192 MySQL)<\/p>\n<p>Migrate seamlessly without losing data:<\/p>\n<p>1. Configure MySQL in `config.yml` (keep `storage.type: sqlite`)<br \/>\n2. Run: `\/glog migrate to:mysql`<br \/>\n3. Switch storage type to `mysql` and restart<\/p>\n<p> Migration is safe: SQLite remains intact as a backup.<\/p>\n<p>&#8212;<\/p>\n<p>##  Inspect &#038; Lookup in Action<\/p>\n<p>* Inspect \u2192 View detailed history with timestamps &#038; actors<br \/>\n* Sprint while inspecting to show:<\/p>\n<p>  * **Container changes** (`-3x cobblestone | +2x sand`)<br \/>\n  * **Sign edits** (preview old \u2192 new)<br \/>\n* Lookup \u2192 One-shot block history without interaction<\/p>\n<p>&#8212;<\/p>\n<p>##  Rollback\/Restore Workflow<\/p>\n<p>1. **Preview** to review changes<br \/>\n2. **Confirm** to apply rollback\/restore<br \/>\n3. GraniteLog reports: `Rollback applied. Batch <id>, changed <n> blocks.`<br \/>\n4. Undo at any time with `\/rbundo <id>`<\/p>\n<p>&#8212;<\/p>\n<p>##  Performance &#038; Storage<\/p>\n<p>* Automatic schema migrations<br \/>\n* Retention policies to purge old logs<br \/>\n* Optimized indices for fast lookups<br \/>\n* Async queue ensures **no TPS drops during heavy logging**<\/p>\n<p>&#8212;<\/p>\n<p>##  FAQ<\/p>\n<p>**Q:** Does it support PostgreSQL?<br \/>\n**A:** Yes \u2014 set `storage.type: postgres`.<\/p>\n<p>**Q:** How do I find a batch ID for `\/rbundo`?<br \/>\n**A:** After a rollback\/restore, GraniteLog prints `Batch <id>` in chat.<\/p>\n<p>**Q:** Can I filter Discord notifications?<br \/>\n**A:** Yes \u2014 set per-webhook action filters.<\/p>\n<p>**Q:** How do I reduce database size?<br \/>\n**A:** Enable JSON meta compression + configure retention.<\/p>\n<p>&#8212;<\/p>\n<p>##  Roadmap<\/p>\n<p>* Smarter webhook rate limiting\/backoff<br \/>\n* Optional Discord embed formatting<br \/>\n* More granular filters &#038; summaries in `\/inspect`<\/p>\n<p>&#8212;<\/p>\n<p>##  Support<\/p>\n<p>* Open an issue with your server version + config<br \/>\n* For performance help, include: timings, row counts, database type<\/p>\n","protected":false},"excerpt":{"rendered":"<p>GraniteLog \u2014 Lightweight logging, powerful rollbacks, zero compromise.<\/p>\n","protected":false},"featured_media":77516,"template":"","meta":{"_minecraft_slug":"granitelog","_minecraft_project_id":"iiX6to5v","_minecraft_author":"Bobcat","_minecraft_license":"LicenseRef-All-Rights-Reserved","_minecraft_downloads":290,"_minecraft_follows":5,"_minecraft_client_side":"unsupported","_minecraft_server_side":"required","_minecraft_storage_type":"zip","_minecraft_archive_name":"granitelog.zip","_minecraft_size_bytes":13768740,"_minecraft_version_count":1,"_minecraft_updated_at":"2026-05-16T11:53:20.235205Z","_minecraft_date_created":"2025-08-28T08:35:54.557411Z","_minecraft_date_modified":"2025-08-28T00:29:45.270089Z","_minecraft_project_url":"https:\/\/modrinth.com\/mod\/granitelog","_minecraft_icon_attachment_id":77516,"_minecraft_imported_at":"2026-06-04T11:24:42+00:00","_minecraft_import_hash":"484b6ea22782a1e3cc92e0e986280687","_minecraft_versions":"","_minecraft_links":"","_minecraft_gallery":"","_minecraft_api_metadata":""},"mod_category":[126,90,127,128,92],"mod_loader":[132,133],"minecraft_version":[62,37,73,74,38,78,79,80,81],"class_list":["post-77515","mod","type-mod","status-publish","has-post-thumbnail","hentry","mod_category-management","mod_category-optimization","mod_category-paper","mod_category-purpur","mod_category-utility","mod_loader-paper","mod_loader-purpur","minecraft_version-1-21","minecraft_version-1-21-1","minecraft_version-1-21-2","minecraft_version-1-21-3","minecraft_version-1-21-4","minecraft_version-1-21-5","minecraft_version-1-21-6","minecraft_version-1-21-7","minecraft_version-1-21-8"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>GraniteLog - Coreprotect Alternative - Minecraft<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/vpesports.com\/minecraft\/mods\/granitelog\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"GraniteLog - Coreprotect Alternative - Minecraft\" \/>\n<meta property=\"og:description\" content=\"GraniteLog \u2014 Lightweight logging, powerful rollbacks, zero compromise.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/vpesports.com\/minecraft\/mods\/granitelog\/\" \/>\n<meta property=\"og:site_name\" content=\"Minecraft\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/granitelog\\\/\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/granitelog\\\/\",\"name\":\"GraniteLog - Coreprotect Alternative - Minecraft\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/granitelog\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/granitelog\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/granitelog-icon-8f4348f4ba88124aeb1ba6b762b25968c31fe52e_96.webp\",\"datePublished\":\"2026-06-04T11:24:41+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/granitelog\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/granitelog\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/granitelog\\\/#primaryimage\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/granitelog-icon-8f4348f4ba88124aeb1ba6b762b25968c31fe52e_96.webp\",\"contentUrl\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/granitelog-icon-8f4348f4ba88124aeb1ba6b762b25968c31fe52e_96.webp\",\"width\":96,\"height\":96},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/granitelog\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mods\",\"item\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/mods\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"GraniteLog &#8211; Coreprotect Alternative\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/#website\",\"url\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/\",\"name\":\"Minecraft\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/vpesports.com\\\/minecraft\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"GraniteLog - Coreprotect Alternative - Minecraft","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/vpesports.com\/minecraft\/mods\/granitelog\/","og_locale":"en_US","og_type":"article","og_title":"GraniteLog - Coreprotect Alternative - Minecraft","og_description":"GraniteLog \u2014 Lightweight logging, powerful rollbacks, zero compromise.","og_url":"https:\/\/vpesports.com\/minecraft\/mods\/granitelog\/","og_site_name":"Minecraft","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/vpesports.com\/minecraft\/mods\/granitelog\/","url":"https:\/\/vpesports.com\/minecraft\/mods\/granitelog\/","name":"GraniteLog - Coreprotect Alternative - Minecraft","isPartOf":{"@id":"https:\/\/vpesports.com\/minecraft\/#website"},"primaryImageOfPage":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/granitelog\/#primaryimage"},"image":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/granitelog\/#primaryimage"},"thumbnailUrl":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/granitelog-icon-8f4348f4ba88124aeb1ba6b762b25968c31fe52e_96.webp","datePublished":"2026-06-04T11:24:41+00:00","breadcrumb":{"@id":"https:\/\/vpesports.com\/minecraft\/mods\/granitelog\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/vpesports.com\/minecraft\/mods\/granitelog\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/vpesports.com\/minecraft\/mods\/granitelog\/#primaryimage","url":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/granitelog-icon-8f4348f4ba88124aeb1ba6b762b25968c31fe52e_96.webp","contentUrl":"https:\/\/vpesports.com\/minecraft\/wp-content\/uploads\/2026\/06\/granitelog-icon-8f4348f4ba88124aeb1ba6b762b25968c31fe52e_96.webp","width":96,"height":96},{"@type":"BreadcrumbList","@id":"https:\/\/vpesports.com\/minecraft\/mods\/granitelog\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/vpesports.com\/minecraft\/"},{"@type":"ListItem","position":2,"name":"Mods","item":"https:\/\/vpesports.com\/minecraft\/mods\/"},{"@type":"ListItem","position":3,"name":"GraniteLog &#8211; Coreprotect Alternative"}]},{"@type":"WebSite","@id":"https:\/\/vpesports.com\/minecraft\/#website","url":"https:\/\/vpesports.com\/minecraft\/","name":"Minecraft","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/vpesports.com\/minecraft\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"_links":{"self":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod\/77515","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod"}],"about":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/types\/mod"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/media\/77516"}],"wp:attachment":[{"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/media?parent=77515"}],"wp:term":[{"taxonomy":"mod_category","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod_category?post=77515"},{"taxonomy":"mod_loader","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/mod_loader?post=77515"},{"taxonomy":"minecraft_version","embeddable":true,"href":"https:\/\/vpesports.com\/minecraft\/wp-json\/wp\/v2\/minecraft_version?post=77515"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}