
SableCat
Reliability fixes and a full sub-level recovery toolkit for Sable: rescue, purge, offline backup import, and automatic archiving. A fork of Create-Aeronautics:Compatibility + Bug fixes (F**kSable), built to fix root causes instead of papering over them.
Links
Tags
Creators
Details
1.0.1
Compatibility
Required content
Changes
SableCat 1.0.1: Initial Release
This is the first public release of SableCat. An earlier 1.0.0 tag was cut but never actually shipped cleanly, so this release folds in the fixes found while getting it running properly: 1.0.1 is effectively the true debut.
SableCat is a fork of [FuckSable](https://github.com/) (MIT licensed), rebuilt with a focus on fixing root causes rather than symptoms, and extended with a full sub-level recovery toolkit that didn't exist before.
✨ New: Recovery & Management Toolkit
All commands live under /sablecat.
rescue: repairs sub-levels whose pose is corrupted but whose block content is intact. If a sub-level's actual data is gone rather than just its pose, rescue correctly reports it as unrecoverable rather than pretending to fix it.purge: removes a currently-loaded sub-level confirmed to be near-empty (automatic bounding-volume check).rescue <uuid> purge: removes a sub-level captured as a failed load and classified as unrecoverable.forcepurge: unconditional removal of a loaded sub-level, with no content check, for buggy-but-not-corrupted builds an operator needs gone regardless. Every use is logged permanently and broadcast to all online operators, with an optional reason attached to that record.manifest: tracks every sub-level that's loaded or saved this session, including UUID, name, dimension, coordinates, chunk count, and last-seen time.manifest missingflags anything on record that isn't currently loaded.tphere: safely relocates a sub-level to your position, by UUID or by name. Preserves its current orientation and safely zeroes momentum on arrival, instead of resetting to upright with old velocity intact (the cause of a vanilla-teleported ship visibly flinging or spinning after landing).import: recovers a sub-level from an offline backup folder by scanning it for a matching UUID and re-registering it as a fresh, live sub-level.backup: automatic, non-destructive, periodic backups of sub-level storage to an independent library, checked once per save cycle and only run once the configured interval has elapsed. Timestamped, never overwritten, automatically pruned past a configurable retention limit, and written atomically so an interrupted backup can't leave a corrupt archive behind.backup now,backup list, andbackup config <hours> <max>for manual control.
🔧 Reliability Fixes
- Async-save visibility: save failures now log clearly, get tracked, and flash an alert to online operators, instead of failing completely silently.
- Chain-save-guard: Sable groups physically-touching sub-levels together for save operations. Previously, one corrupted sub-level in that group could silently abort the entire batch, skipping every other sub-level scheduled to save that cycle. Each chain member's save is now isolated, so one bad ship can't take healthy, unrelated ones down with it.
- Null-data deletion crash: Sable (and SableCat's own deletion commands) use
nulldata to mean "delete this sub-level's storage slot." An unguarded null check meant any genuine deletion crashed the entire server on the very next save cycle. Deletions are now handled as their own case, separate from a normal save. - Live-eviction on deletion:
purge/forcepurgenow properly evict a deleted sub-level from the running simulation, not just its on-disk record. Previously, a "successfully" deleted sub-level could remain fully visible, ticking, and interactive until the world reloaded.
🛠️ Build & Environment
- Bumped to NeoForge
21.1.233to satisfy dependency requirements from Railways, Ice Bleb Fish, and Quark. - Fixed Gradle JVM resolution issues that could produce misleading launch failures on some setups.
- Separated client/server dev run directories to prevent them from silently overwriting each other's configuration.
📜 License
MIT. Forked from FuckSable, original copyright retained per license terms; see LICENSE.
Optional dependencies
Projects on Modrinth are automatically available through a Maven repository for use with JVM build tools such as Gradle. To learn more about the Modrinth Maven API, click here.
Note: When available, you should use the creator's maven repo instead as it will have transitive dependency information that the Modrinth Maven API does not. You may also end up with duplicate dependencies if you use a mix of Modrinth and non-Modrinth Maven repositories for your dependencies, because the group identifier will be different when served through the Modrinth Maven API.
Maven coordinates:
Version ID:
build.gradle:
repositories {
exclusiveContent {
forRepository {
maven {
name = "Modrinth"
url = "https://api.modrinth.com/maven"
}
}
// forRepositories(fg.repository) // Uncomment when using ForgeGradle
filter {
includeGroup "maven.modrinth"
}
}
}
// Standard Gradle dependency
dependencies {
implementation "maven.modrinth:qDg9I0Yg:oNElRzWj"
}
// Legacy Loom dependency
dependencies {
modImplementation "maven.modrinth:qDg9I0Yg:oNElRzWj"
}
