The complete in-game admin control center for Rust - every moderation tool your team needs.
In one beautiful CUI panel.
Stop alt-tabbing to RCON. Stop memorizing console commands. Stop juggling five different plugins.
PowerfulAdmin puts your entire server - players, permissions, plugins, console, ConVars, ESP, Vanish and more - behind a single, fast, gorgeous in-game interface that any admin can master in minutes.
>>> Open it with one command: /padmin. Everything else is point-and-click.
Check the video demonstration - https://youtube.com/watch?v=94WqSINqTO4
- All-in-one. Player management, ESP, Vanish, live console, permissions, plugin control, ConVar editing and Discord - no more plugin soup.
- Beautiful & fast. A modern, hand-crafted CUI with three themes, smooth partial updates (no jarring full-screen redraws), and an interface that feels like a real desktop app.
- Built for real moderation. Heal, kill, strip, teleport, mute, spectate, give items, edit blueprints, tweak metabolism, manage inventories - online and offline players.
- Permission-gated to the bone. Fourteen granular permissions let you hand juniors exactly what they need and nothing more.
- Scales with you. SQLite out of the box, one-click migration to MySQL for multi-server networks, or plain JSON if you prefer files.
- Discord-ready. Webhooks, a full bot with slash commands, a two-way chat bridge and role-based authorization - all optional, all configurable in-game.
- Localized. Ships with full English and Russian; every string lives in language files, so any locale is a translation away.
Your server at a glance, updated live:
- Online / max players, sleepers, admins online, new players today
- Server FPS, entity count, and join queue / joining counters
- One-tap quick toggles: Vanish, ESP, Godmode, Noclip
- A built-in live console feed so you always see what's happening
A searchable, paginated roster of online, offline (sleepers) and banned players. Each row has instant actions, and the full management card does it all:
- Heal: Set / max / add / subtract HP
- Kill: Instantly kill the target
- Strip: Clear the player's inventory
- Teleport: To me · To player · To coordinates · To line-of-sight
- Mute: Timed or permanent, with reason templates and notify options
- Kick: With reason, comment and notification routing
- Inventory: View and edit a player's main / wear / belt
- Spectate: Jump into a live spectate camera (press R to exit)
- Give: Full item picker - categories, search, favorites, custom items, skins, a cart, and blueprints
- Blueprints: Unlock or reset blueprints per item, on a visual blueprint board
- Modifiers: Apply metabolism modifiers with custom duration and value
- Vitals: Live HP / metabolism editor that respects each stat's real min / max
- Permissions: Grant per-user permissions and manage their groups
Offline players are fully supported - teleport to a sleeper, mute, heal, strip, edit their body and more.
Rich player stats card: SteamID, live status (Online / Sleeping / Dead / Wounded / Offline), total playtime, current session, total Rust hours (via Steam API), groups, first/last seen, and IP - with a dedicated permission so only trusted staff can reveal it.
Walk up to anyone in the world, look at them, and act instantly:
- E - open their inventory
- Right Mouse Button (RMB) - open their full management card
- A clean on-screen hint shows you exactly which key does what.
A powerful, server-side admin ESP rendered through the engine's debug draw, visible only to permitted admins:
- Players & sleepers with name, HP and held item
- World entities: loot, boxes, tool cupboards, sleeping bags, traps, stashes, dropped bags, NPCs, turrets and vehicles
- Adjustable radius, box/text opacity, and distance readouts
- Color-coded enemy / team / admin, plus tagging of vanished admins
True invisibility done right:
- Removed from networking, colliders and entity queries
- Optional silhouette with a configurable color so other admins can still spot you
- Full damage and targeting immunity
- Optional auto-vanish on connect
- Real-time server console inside the panel
- Category tabs: All · Chat · Commands · Connections · Errors
- Search, word-wrap, and export to file
- Run commands inline
- A draggable floating mini-console widget you can keep on-screen while you work
- Browse every permission on the server, grouped by owning plugin
- Toggle permissions per user or per group
- Create and delete groups with parent inheritance
- Fast search across thousands of permissions
- In-panel activity log: joins, leaves, chat, commands, admin actions and errors
- Filter by category
- Persisted to your chosen storage backend with configurable caps
- See every loaded and unloaded plugin with title, author and version
- Load / unload / reload with a click
- Browse and edit server ConVars by category
- Paginated and searchable tune your server without touching the console
- Storage backends: SQLite (default, zero-config), MySQL (perfect for multi-server networks), or JSON files
- One-click live migration between backends your data follows you
- Security: lock PowerfulAdmin permissions, enable/disable the console, set log and ESP object caps, define reason templates
- Steam API key for Rust playtime lookups (cached and stored in your backend)
- All configurable in-game, no file editing required
- Webhook and/or Bot delivery pick per channel
- Notifications for bans/kicks, chat, admin actions and plugin errors, each to its own channel
- Two-way chat bridge (Discord ↔ in-game)
- Slash commands: /online, /players, /kick, /mute, /chatbridge with autocomplete
- Role-based authorization so only the right Discord roles can moderate
- Configurable bot presence / activity status
- Three polished themes Rust, Midnight, Plum selectable per admin
- Full English and Russian included; every label is translatable via language files
PowerfulAdmin is engineered to be light:
- Object pooling and reused buffers to minimize allocations
- Partial UI updates only the element that changed repaints, never the whole panel
- Cached state signatures and debounced saves
- ESP and inspect run on tuned intervals
- powerfuladmin.use - Base access - open the panel
- powerfuladmin.players - Player management page & actions
- powerfuladmin.esp - ESP page & overlay
- powerfuladmin.vanish - Vanish
- powerfuladmin.godmode - Godmode quick toggle
- powerfuladmin.noclip - Noclip quick toggle
- powerfuladmin.console - Live console page
- powerfuladmin.perms - Permissions manager
- powerfuladmin.logs - Logs page
- powerfuladmin.plugins - Plugin control
- powerfuladmin.convars - ConVar editor
- powerfuladmin.settings - Settings, storage & Discord
- powerfuladmin.viewip - Reveal player IP addresses
- powerfuladmin.candisablevitals - Edit player vitals/metabolism
- powerfuladmin.countableondashboard - Counts toward the "admins online" stat
> Tip: there is a one-time console helper pa.setup <steamid/name> that grants the full PowerfulAdmin permission set to a player so you can get started instantly.
- /padmin - (Chat) Open the admin panel
- pa.setup <steamid/name> - (Console) Grant the full permission set to a player (one-time)
Everything else happens inside the panel no commands to memorize.
- Storage: SQLite or JSON work with zero setup; MySQL is optional for networks.
- Discord & Steam API: entirely optional the plugin runs perfectly without them.
- Drop the plugin into your scripts folder; it loads and creates a clean config automatically.
- Run pa.setup <your name or steamid> once to give yourself full access.
- Type /padmin in-game.
- (Optional) Open Settings to switch to MySQL, connect Discord, or add your Steam API key.
That's it you're running.
Q: Do I need MySQL or a database server?
A: No. SQLite is the default and needs zero configuration. MySQL is there only if you run multiple servers and want shared data.
Q: How do admins open the panel?
A: With the /padmin chat command, provided they have at least the powerfuladmin.use permission.
Q: How do I give my staff access?
A: Grant the permissions above (per user or per group) right inside the Permissions page, or use pa.setup for a quick full grant.
Q: Is Discord required?
A: No, it's completely optional. Everything in the panel works without Discord. When you do want it, set it up entirely in-game.
Q: Will it lag my server?
A: It's built for performance object pooling, partial UI redraws, debounced saves and tuned update intervals keep the footprint small.
Q: Can players abuse it?
A: No. Every page and action is gated behind its own permission, and you can even lock the plugin's own permissions so they can't be edited.
Q: Is the ESP a "cheat"?
A: It's a server-side admin tool rendered through the engine's debug draw and only shown to admins with the ESP permission there is no client-side mod involved.
Q: Can I manage offline players?
A: Yes. You can teleport to, mute, heal, strip and otherwise manage a player's sleeping body. Actions that genuinely need a live connection (like kick) are disabled while they're offline.
Q: Can I move from SQLite to MySQL later?
A: Absolutely there's a one-click live migration in Settings that moves your data between backends.
Q: Is it multi-language?
A: It ships with full English and Russian, and every string is in language files, so adding a new language is just a translation.
Q: Can I change how it looks?
A: Yes choose from the Rust, Midnight and Plum themes.
Q: Do I need a Steam API key?
A: Only if you want the "total Rust hours" stat on player cards. Everything else works without one.
Q: What about bans and player freezes?
A: Ban and Freeze are reserved for an upcoming DLC add-on and currently appear as placeholders. All other moderation tools are fully included.
- Bans DLC full ban management (timed/permanent, templates, history) - COMPLETED
- Freezes DLC freeze/unfreeze players in place
- Continuous polish, more themes, and additional languages
// Build a Dictionary<string, object> and call API_AddSection. It returns true on success private const string SectionId = "mystats"; private void RegisterSection() { PowerfulAdmin ??= plugins.Find("PowerfulAdmin"); if (PowerfulAdmin == null) return; var definition = new Dictionary<string, object> { ["id"] = SectionId, // required, unique ["icon"] = "assets/icons/star.png", // sidebar icon ["category"] = "nav.cat.tools", // nav group (see below) ["permission"] = "myplugin.view", // auto-registered by PA ["title"] = (Func<BasePlayer, string>)(p => "My Stats"), ["open"] = (Action<BasePlayer>)OpenSection, // draw the page ["cardRows"] = (Func<string, List<string[]>>)CardRows, // player-card rows ["settings"] = (Action<BasePlayer, CuiElementContainer, string, int>)DrawSettings, ["settingsHeight"] = (Func<BasePlayer, int>)(p => 180), ["popupActions"] = new Dictionary<string, Action<BasePlayer, ulong, string>> { ["ban"] = OnBan } }; PowerfulAdmin.Call("API_AddSection", definition); } // Only "id" is required; every other key is optional. The cast to the exact delegate // type matters - PowerfulAdmin reads each key with "as <Type>", so a wrong signature is // silently ignored. // Definition keys: // id string // Unique section id (used by API_OpenSection / API_RemoveSection). REQUIRED. // icon string // Sidebar icon sprite. Default "assets/icons/file.png". // category string // Nav group key. Built-in: "nav.cat.main", "nav.cat.tools", "nav.cat.manage". // Any other value creates a new group (its label is the localized category key). // Default "nav.cat.manage". // permission string // Permission required to open the section. PowerfulAdmin registers it for you // if no plugin has registered it yet. // title Func<BasePlayer, string> // Sidebar label / page header text. // open Action<BasePlayer> // Called when the player opens the section - draw your page here. // cardRows Func<string, List<string[]>> // Extra rows for the player card; the argument is the target steamid. // settings Action<BasePlayer, CuiElementContainer, string, int> // Draw controls into a card on the Settings page. // settingsHeight Func<BasePlayer, int> // Height (px) of your settings card. // popupActions Dictionary<string, Action<BasePlayer, ulong, string>> // Named handlers for player-popup actions. Key = action id, value = // handler(admin, targetSteamId, targetName). PowerfulAdmin enables the popup // "Ban" button while any section provides an action under the key "ban", and // routes that click to your handler. (The dictionary is generic - the same // mechanism is used for any popup action key, not only "ban".) // Lifecycle - register on server init and whenever PowerfulAdmin (re)loads, remove on unload: private void OnServerInitialized() => RegisterSection(); private void OnPluginLoaded(Plugin plugin) { if (plugin?.Name == "PowerfulAdmin") { PowerfulAdmin = plugin; RegisterSection(); } } private void OnPluginUnloaded(Plugin plugin) { if (plugin?.Name == "PowerfulAdmin") PowerfulAdmin = null; } private void Unload() => PowerfulAdmin?.Call("API_RemoveSection", SectionId); // When "open" fires, ask PowerfulAdmin for the render CONTEXT with API_SectionContext. // It returns geometry, the player's language and the current theme palette, so your UI // matches PowerfulAdmin's look and active theme. private void OpenSection(BasePlayer player) { var ctx = PowerfulAdmin.Call("API_SectionContext", player) as Dictionary<string, object>; if (ctx == null) return; var parent = (string)ctx["parent"]; // parent layer for your UI var bodyW = Convert.ToInt32(ctx["bodyW"]); var pad = Convert.ToInt32(ctx["pad"]); var palette = (Dictionary<string, string>)ctx["palette"]; var surface = palette["surface"]; var accent = palette["accent"]; var text = palette["text"]; var font = palette["fontBold"]; var container = new CuiElementContainer(); const string root = "myplugin.page"; container.Add(new CuiPanel { Image = { Color = surface }, RectTransform = { AnchorMin = "0 0", AnchorMax = "1 1" } }, parent, root); container.Add(new CuiLabel { Text = { Text = "Hello from My Stats", FontSize = 16, Font = font, Color = accent }, RectTransform = { AnchorMin = "0 1", AnchorMax = "1 1", OffsetMin = $"{pad} -48", OffsetMax = $"{-pad} -16" } }, root); CuiHelper.AddUi(player, container); } //Context keys: // parent string Layer name to parent your UI to (the panel body). // root string The panel root layer. // bodyW, bodyH int Body width / height in pixels. // pad int Standard content padding. // lang string The player's active language code (e.g. "en"). // palette Dictionary<string,string> Theme colors + fonts (below). Read it every render - // the user can switch themes. // Palette keys (each value is a CUI color string "R G B A", fonts are font names): // page, bg, surface, elev, elev2, border, borderSoft, // text, text2, text3, // accent, accentH, accentSoft, accentText, // danger, dangerSoft, success, warn, warnSoft, info, clear, // fontBold, fontRegular, fontMono // Build a CuiElementContainer parented to "parent", give your elements stable names, and // prefer repainting a single named element over a full redraw to avoid a jumpy panel. // Return extra [label, value] rows shown on the player card. The argument is the target // steamid as a string. private List<string[]> CardRows(string steamId) { if (!ulong.TryParse(steamId, out var id)) return null; return new List<string[]> { new[] { "Score", GetScore(id).ToString() }, new[] { "Rank", GetRank(id) } }; } Call API_RefreshPlayerCard(steamId) after your data changes to repaint the card. // "settings" draws controls into a collapsible card on the Settings page; "settingsHeight" // tells PowerfulAdmin how tall it is (used to size the scroll area). Use the same palette // via API_SectionContext. After saving a value, call API_RefreshSettings(player) to repaint. private void DrawSettings(BasePlayer player, CuiElementContainer c, string card, int panelWidth) { var ctx = PowerfulAdmin.Call("API_SectionContext", player) as Dictionary<string, object>; var palette = ctx?["palette"] as Dictionary<string, string>; var text = palette?["text"] ?? "1 1 1 1"; c.Add(new CuiLabel { Text = { Text = "My option", FontSize = 12, Color = text }, RectTransform = { AnchorMin = "0 1", AnchorMax = "1 1", OffsetMin = "16 -40", OffsetMax = "-16 -16" } }, card); // add buttons / input fields here, wire them to your own console commands } // settingsHeight must return a STABLE height for the current state. PowerfulAdmin sizes the // Settings scroll once; if your card can grow, return the maximum height (or trigger a full // refresh) so the bottom is never clipped. // "popupActions" is a dictionary of named handlers. Each handler is called with the admin, // the target steamid and the target name. PowerfulAdmin enables the popup "Ban" button while // some section registers an action under the key "ban", and routes the click to your handler. // A typical handler arms your own dialog and navigates to your section: private void OnBan(BasePlayer admin, ulong steamId, string name) { // prepare your dialog state for (steamId, name) ... PowerfulAdmin.Call("API_OpenSection", admin, SectionId); } // in the section definition: ["popupActions"] = new Dictionary<string, Action<BasePlayer, ulong, string>> { ["ban"] = OnBan } API_AddSection(Dictionary<string,object> def) // -> bool // Register/replace a section. API_RemoveSection(string id) // -> bool // Remove a section (call in Unload). API_OpenSection(BasePlayer player, string id) // -> bool // Navigate the player to a section. API_SectionContext(BasePlayer player) // -> Dictionary<string,object> // Geometry + lang + palette for rendering. API_RefreshSettings(BasePlayer player) // -> null // Repaint the Settings page (after a settings change). API_RefreshPlayerCard(string steamId) // -> null // Repaint a player card. API_ReopenPanel(BasePlayer player) // -> null // Re-open the whole panel for the player. API_Log(string message, string category = null) // -> bool // Write a line into PowerfulAdmin's Logs. Category e.g. "Cmd", "Info". API_RustHours(string steamId) // -> string // Player's Rust hours ("N h", "..." while loading, "n/a", or "NO STEAM-API KEY"). // Needs a Steam API key configured in PowerfulAdmin. API_KnownPlayers() // -> List<string[]> // Every known player as [steamid, name, online] (online = "1" / "0"), online first. API_GetInput(string key) // -> string // Read a stored input value (e.g. a shared setting). API_GetToggle(string key, bool def) // -> bool // Read a stored toggle. API_GetSelect(string key, string def) // -> string // Read a stored select value. // Example - reading hours and logging: var hours = PowerfulAdmin.Call("API_RustHours", steamId.ToString()) as string ?? "n/a"; PowerfulAdmin.Call("API_Log", $"checked {steamId}: {hours}", "Info"); if (PowerfulAdmin.Call("API_KnownPlayers") is List<string[]> players) foreach (var p in players) { // p[0] = steamid, p[1] = name, p[2] = "1" (online) / "0" (offline) }
PowerfulAdmin administer your Rust server the way it should be: fast, visual, and powerful.
