LAB/05 — INVENTORY
DecayBooster
- Price
- $14.99
- Version
- v2.0.0
- Author
- S³Founding MemberTrusted Dev
Changelog
v2.0.030 Aug 2026
No notes for this release.
The problem
Vanilla upkeep drags abandoned bases out for days. They hold ground, block building, eat entities and make your map look busier than your server actually is. The group upkeep bonus is the reason: a cupboard with eight authorised names decays slowly even when seven of those names quit a week ago.
What DecayBooster does
Removes cupboard authorisation from players who have not logged in for a while. That alone cuts the group bonus and lets vanilla decay do its job properly.
Optionally — off by default — once nobody at all is authorised on a base, it can clear the base out entirely.
Read this before you set the threshold
Rust does not persist a per-player "last connected" timestamp anywhere a plugin can read. sleepStartTime is Time.time based and resets on restart. The blueprint table's updated column only moves when blueprints change.
So the first time DecayBooster sees an authorised player it has never tracked, it starts their clock at that moment. On a fresh install nobody is deauthorised for a full threshold period.
That is deliberate. The alternative — assuming every unknown player is ancient — would strip authorisation off half your server on the first scan, and you would not get it back.
The first scan tells you what it picked up:
DecayBooster scan: 412 buildings, 380 cupboards, 1104 auth entries. 1104 newly tracked, ...
Practical consequence: install it at the start of a wipe, not the end.
Work up to base removal, don't flip it on
- Watch first. Leave removal off for a few days.
db.statuslists the bases sitting empty and how long they have been that way. If that list looks wrong, do not proceed. - Preview.
db.previewprints exactly which buildings would go and how big they are. It writes nothing and touches no entity. - Set a grace period. Hours a base sits with nobody authorised before removal defaults to 24 — a full day of visible abandonment before anything happens.
- Set a floor. Smallest base worth removing defaults to 1 building block. Raise it to 10 if you only want real bases cleaned up and are happy to leave stray foundations to vanilla decay.
- Then enable it.
Every deauthorisation and removal is written to oxide/logs/DecayBooster/, one file per day:
[2026-08-30 06:24:39] deauth building=2 cupboard=205176 player=76561190000000001 offlineDays=8.3 [2026-08-30 06:24:39] marked-empty building=2 blocks=2 [2026-08-30 06:24:39] remove-base building=2 blocks=2 entities=3
Keep those. When somebody insists their base vanished for no reason, this is the answer.
Paced, not a frame spike
Removal is throttled. Entities killed per frame defaults to 5 and the scan yields every 10 buildings, so a large base takes a few seconds of wall time to disappear instead of freezing the server. Lower it if your server is already struggling; raise it while clearing a backlog during a restart window.
Features
- Strips cupboard auth from players offline past a threshold you set
- Optional base removal once nobody is authorised at all — off by default
- Global dry-run mode, plus a
db.previewthat simulates the whole chain - Exempt permission for staff and VIP ranks
- Optional rule: one active player on the cupboard protects the whole base
- Optional sweep of bases that have no tool cupboard at all
- Minimum base size floor, so stray foundations are left to vanilla
- Tells returning players their auth was removed
- Per-day audit log of every deauth and every removal
- Paced entity removal with a configurable per-frame budget
db.selftest— eleven checks, including a signature check against the vanilla auth API- Hooks and API for other plugin authors
- Oxide and Carbon
- No dependencies
Commands
Console, or in-game with decaybooster.admin.
| Command | Does |
|---|---|
db.preview | Dry-run scan. Reports everything it would do, changes nothing |
db.scan | Run a scan now, for real |
db.status | Config summary, tracked players, last scan result, oldest empty bases |
db.forget <steamid> | Reset one player's offline clock, e.g. after a support ticket |
db.selftest | Eleven checks against the live server |
DecayBooster status auth removed after : 7 days offline scan interval : 60 minutes dry run : False base removal : off tracked players : 0 bases sitting empty: 0 scan in progress : False last scan : 0 min ago
Permissions
| Permission | Effect |
|---|---|
decaybooster.exempt | This player is never deauthorised. Grant it to a group for VIPs or staff |
decaybooster.admin | The db.* commands from in-game |
oxide.grant group vip decaybooster.exempt oxide.grant user 76561198000000000 decaybooster.admin
Settings
{
"Days a player must be offline before their cupboard auth is removed": 7.0,
"Minutes between scans": 60.0,
"Scan once on server start as well": true,
"Dry run - log what would happen and change nothing": false,
"Keep everyone authorised if at least one player on the cupboard is still active": false,
"Remove bases once no player is authorised on them (destructive, off by default)": false,
"Hours a base sits with nobody authorised before it is removed": 24.0,
"Also remove bases that have no tool cupboard at all": false,
"Smallest base worth removing, in building blocks (ignores twig spam and single foundations)": 1,
"Entities killed per frame while removing a base - lower is gentler on the server": 5,
"Tell players when they return that their auth was removed": true,
"Announce base removals in the server console": true,
"Write every deauth and removal to oxide/logs/DecayBooster": true
}The two that change what your server does are Remove bases once no player is authorised on them and Keep everyone authorised if at least one player on the cupboard is still active — the second one means an active clanmate protects the whole cupboard.
For other plugin authors
void OnDecayBoosterDeauth(BuildingPrivlidge tc, ulong userId) { }
// Return non-null to spare this base.
object OnDecayBoosterBaseRemove(BuildingManager.Building building) { return true; }
void OnDecayBoosterBaseRemoved(uint buildingId) { }bool exempt = DecayBooster.Call<bool>("IsPlayerExempt", userId);
double lastSeen = DecayBooster.Call<double>("GetLastSeen", userId); // unix seconds, 0 if untracked
DecayBooster.Call("ResetOfflineTimer", userId);Requirements
Oxide or Carbon. No other plugin required.
Support
Every purchase comes with the private updates channel in our Discord and updates for the life of the plugin. Your licence key and download live on your purchases page the moment payment clears.