GraniteLog — Lightweight logging, powerful rollbacks, zero compromise.
GraniteLog is a high-performance block logging and rollback plugin built for Paper/Spigot servers.
It prioritizes speed, clarity, and admin usability, while keeping the database schema simple, efficient, and migration-friendly.
✅ Actively tested on latest Paper builds
✅ Compact storage with zero-NBT by default (optional JSON compression)
✅ Multiple storage options: SQLite, MySQL/MariaDB, PostgreSQL
Tracks all major block-related events:
/inspect — Click blocks to view full history
/lookup — Quickly list changes at the targeted block
Rollback/restore any set of changes with filters:
Preview → Confirm workflow prevents mistakes
Each operation generates a batch ID, allowing precise undo with /rbundo
Send formatted change logs straight to Discord
Features:
/inspect [on|off] → Click a block for history/lookup [limit=N] → List recent changes instantly/rollback preview <filters>/rollback confirm <filters>/restore preview <filters>/restore confirm <filters>radius|r, time=30m/12h/3d, user=<name>, block=<ns:id>, action=place,break,explode, entity=<ns:id>, chunklock, page=<n>/rbundo <batchId> — Undo an exact rollback/restore/glog status → Event & queue stats/glog reload → Reload config/glog purge olderThan:<time> → Purge old rows (e.g. 90d, 12h)/glog migrate to:mysql → Migrate data from SQLite → MySQLGraniteLog uses fine-grained permission nodes so you can control who can investigate, rollback, and manage data.
permissions:
glog.inspect:
description: Use inspect mode
default: op
glog.lookup:
description: Lookup history
default: op
glog.rollback:
description: Execute rollbacks
default: op
glog.restore:
description: Execute restores
default: op
glog.rbundo:
description: Undo a rollback batch
default: op
glog.admin:
description: Use GraniteLog admin commands
default: op
children:
glog.admin.status: true
glog.admin.purge: true
glog.admin.reload: true
glog.admin.status:
description: View GraniteLog status
default: op
glog.admin.purge:
description: Purge old GraniteLog records
default: op
glog.admin.reload:
description: Reload GraniteLog config/locales
default: op
glog.inspect → Toggle inspect mode and click blocks for history
glog.lookup → Use /lookup to list recent changes
glog.rollback → Run rollbacks with /rollback
glog.restore → Run restores with /restore
glog.rbundo → Undo rollbacks/restores with /rbundo
glog.admin → Master node for all admin commands
glog.admin.status → View plugin statisticsglog.admin.purge → Purge old dataglog.admin.reload → Reload config and localesconfig.yml)Choose storage: sqlite | mysql | postgres
Configure limits:
Enable/disable action logging (block, container, interactions, fluids, growth, explosions, containerIO)
JSON compression with configurable threshold
Webhook settings: endpoints, filters, timeouts
Migrate seamlessly without losing data:
config.yml (keep storage.type: sqlite)/glog migrate to:mysqlmysql and restartMigration is safe: SQLite remains intact as a backup.
Inspect → View detailed history with timestamps & actors
Sprint while inspecting to show:
-3x cobblestone | +2x sand)Lookup → One-shot block history without interaction
Rollback applied. Batch <id>, changed <n> blocks./rbundo <id>Q: Does it support PostgreSQL?
A: Yes — set storage.type: postgres.
Q: How do I find a batch ID for /rbundo?
A: After a rollback/restore, GraniteLog prints Batch <id> in chat.
Q: Can I filter Discord notifications?
A: Yes — set per-webhook action filters.
Q: How do I reduce database size?
A: Enable JSON meta compression + configure retention.
/inspect