Building your own Oxide plugins lets you create exactly the server experience you want. If you know basic programming concepts, Rust plugin development is approachable.
Plugin Basics
Oxide plugins for Rust are written in C#. Each plugin is a single .cs file placed in oxide/plugins/. Oxide compiles and loads it automatically.
Minimal Plugin
namespace Oxide.Plugins
{
[Info("HelloWorld", "YourName", "1.0.0")]
class HelloWorld : RustPlugin
{
void Init()
{
Puts("Hello World loaded!");
}
[ChatCommand("hello")]
void HelloCommand(BasePlayer player, string command, string[] args)
{
player.ChatMessage("Hello from your custom plugin!");
}
}
}
Drop this in oxide/plugins/ and it loads instantly. Players type /hello and get a message.
Hook System
Oxide provides hooks - events that fire when things happen in the game:
Player Hooks
void OnPlayerConnected(BasePlayer player)
{
PrintToChat($"{player.displayName} joined the server!");
}
void OnPlayerDisconnected(BasePlayer player, string reason)
{
Puts($"{player.displayName} left: {reason}");
}
object OnPlayerChat(BasePlayer player, string message)
{
// Return non-null to cancel the chat message
if (message.Contains("badword"))
return false;
return null;
}
Entity Hooks
void OnEntityBuilt(Planner plan, GameObject go)
{
BaseEntity entity = go.ToBaseEntity();
Puts($"Entity built: {entity.ShortPrefabName}");
}
void OnEntityDeath(BaseCombatEntity entity, HitInfo info)
{
if (entity is BasePlayer player)
Puts($"{player.displayName} was killed");
}
Configuration Files
Add persistent configuration:
class MyPlugin : RustPlugin
{
private Configuration config;
class Configuration
{
public string WelcomeMessage = "Welcome to the server!";
public int MaxHomes = 3;
public float TeleportCooldown = 60f;
}
protected override void LoadDefaultConfig()
{
config = new Configuration();
}
protected override void LoadConfig()
{
base.LoadConfig();
config = Config.ReadObject<Configuration>();
}
protected override void SaveConfig()
{
Config.WriteObject(config);
}
}
This creates a JSON config in oxide/config/MyPlugin.json that server admins can edit.
Permissions
Integrate with Oxide's permission system:
void Init()
{
permission.RegisterPermission("myplugin.use", this);
permission.RegisterPermission("myplugin.admin", this);
}
[ChatCommand("mycommand")]
void MyCommand(BasePlayer player, string command, string[] args)
{
if (!permission.UserHasPermission(player.UserIDString, "myplugin.use"))
{
player.ChatMessage("You don't have permission.");
return;
}
// Command logic here
}
Data Storage
Save persistent data (survives server restarts):
private Dictionary<ulong, PlayerData> playerData;
class PlayerData
{
public int Kills;
public int Deaths;
public List<string> Homes = new List<string>();
}
void Init()
{
playerData = Interface.Oxide.DataFileSystem
.ReadObject<Dictionary<ulong, PlayerData>>("MyPluginData")
?? new Dictionary<ulong, PlayerData>();
}
void SaveData()
{
Interface.Oxide.DataFileSystem.WriteObject("MyPluginData", playerData);
}
Testing
- Write your plugin on your local machine
- Upload to a test server's
oxide/plugins/ - Watch the server console for compilation errors
- Test commands and hooks in-game
- Check
oxide/logs/for detailed error messages
Use a dedicated test server on Space-Node - the Stone plan (€10.20/mo) is perfect for development and testing.
Publishing
Share your plugin on umod.org:
- Create an account
- Submit your plugin with documentation
- Include configuration examples
- Respond to user feedback and bug reports
The Oxide/uMod community is active and appreciative of well-documented, well-tested plugins.
Quick 2026 Answer
Rust Oxide Plugin Development for Beginners matters because Rust servers are judged by wipe day stability and admin response time. Players leave quickly when wipes are late, plugins break or the server stutters during fights. Keep the server routine predictable before adding more features.
Rust Server Checklist
- Decide wipe day and announce it in advance.
- Keep RCON access private and tested.
- Update Oxide, uMod or Carbon after game updates.
- Keep plugin count low until the server has players.
- Watch entity count and save times.
- Keep a backup before every wipe or plugin change.
Common Mistakes
New Rust owners often install too many plugins before they have a stable player loop. That makes support harder and creates lag without adding real value. Start with admin tools, moderation, kits if needed and clear rules.
Hardware also matters on wipe day. Map generation, player joins, entities and plugins can spike at the same time. A server that feels fine on day three can struggle on wipe hour.
Where to Go Next
For Rust basics and related fixes, use Rust dedicated server guide, Rust server security, Rust Oxide vs uMod. Useful screenshots are the wipe schedule, RCON connection screen and plugin folder before and after a change.
Real Test Routine
The practical test for Rust Oxide Plugin Development for Beginners is whether the Rust server survives wipe day without confusing staff or players. A quiet server can look healthy, but wipe hour stresses map generation, player joins, plugin loading, saves and admin tools at the same time.
Before wipe, update the server, check plugin compatibility and make a backup. After wipe, join as a player, test RCON, test kits or moderation commands and watch save times. If the server has custom plugins, test them on a copy before the public wipe. Do not wait until players are queued.
A strong Rust setup also needs clear rules. Players should know wipe time, map size, team limits, plugin list and how to contact staff. Technical stability and community clarity work together.
When Hosting Is the Limit
Hosting is likely the limit when plugins are measured, entity count is sensible and save times still spike. Rust likes fast CPU, strong disk and clean network routing. If the server grows, choose a location close to the player base and keep DDoS protection in mind before advertising publicly.
Screenshot or Generated Image Target
A useful supporting image for this page should show the actual setting, console, panel or workflow being discussed. Avoid a generic stock image if possible. A simple generated diagram is fine when it explains the flow better than a screenshot.
- Capture the main settings screen or config file.
- Add one close crop of the important value.
- Add one result screenshot after the fix or setup is working.
- Keep private IPs, tokens, emails and customer names hidden.
