Skip to content
RustPluginGenerator
Runtime errorOxide + Carbon

Fix "Failed to load QuickSort: Info attribute missing" (Oxide)

Oxide cannot find the [Info] attribute on the plugin class, so it refuses to load the file. Add [Info("Title", "Author", "1.0.0")] directly above the class declaration and reload.

Server console
Failed to load QuickSort: Info attribute missing

Why it happens

Oxide reads the plugin title, author and version from the [Info] attribute (Oxide.Plugins.InfoAttribute) attached to the class that derives from RustPlugin. When the loader scans your file and finds a RustPlugin subclass but no Info attribute on it, it rejects the plugin with "Info attribute missing". Common causes:

  • The attribute line was never written, so the class starts straight at public class QuickSort : RustPlugin.
  • The attribute is present but applies to the wrong type: it sits on a helper class, on a nested class, or above the namespace instead of on the main plugin class.
  • The attribute name is misspelled ([info] is fine, but [Infos], [PluginInfo] are not) or it is written without brackets.
  • The attribute was commented out during debugging and never restored.

Without valid metadata the loader has no title or version to report, which is why the load stops before Init ever runs.

How to fix it

  1. Open the plugin file (oxide/plugins/QuickSort.cs).
  2. Make sure the file declares exactly one class deriving from RustPlugin, and that its name matches the file name.
  3. Place the attribute on the line directly above the class declaration:

[Info("Quick Sort", "RustPluginGenerator", "1.0.0")]

  1. Check the version is three dot-separated numbers. A value like 1.0 or v1.0.0 is rejected or warns separately.
  2. Keep using Oxide.Plugins; and the namespace Oxide.Plugins { ... } block so the attribute resolves.
  3. Save the file; Oxide recompiles it automatically. Confirm with oxide.reload QuickSort — the console should print Loaded plugin Quick Sort v1.0.0 by RustPluginGenerator instead of the error.
  4. If it still fails, run oxide.plugins and look at the compiler lines above the message; a syntax error elsewhere can leave the class metadata unreadable.

Before and after

BeforeFails
using System.Collections.Generic;
using Oxide.Core;
using UnityEngine;

namespace Oxide.Plugins
{
    // [Info("Quick Sort", "RustPluginGenerator", "1.0.0")]
    [Description("Sorts a player's main inventory on command")]
    public class QuickSort : RustPlugin
    {
        [ChatCommand("sort")]
        private void CmdSort(BasePlayer player, string command, string[] args)
        {
            if (player == null || player.inventory == null)
                return;

            var main = player.inventory.containerMain;
            if (main == null)
                return;

            var items = new List<Item>(main.itemList);
            items.Sort((a, b) => a.info.shortname.CompareTo(b.info.shortname));

            for (int i = 0; i < items.Count; i++)
                items[i].MoveToContainer(main, i);

            SendReply(player, "Inventory sorted.");
        }
    }
}
AfterFixed
using System.Collections.Generic;
using Oxide.Core;
using UnityEngine;

namespace Oxide.Plugins
{
    [Info("Quick Sort", "RustPluginGenerator", "1.0.0")]
    [Description("Sorts a player's main inventory on command")]
    public class QuickSort : RustPlugin
    {
        [ChatCommand("sort")]
        private void CmdSort(BasePlayer player, string command, string[] args)
        {
            if (player == null || player.inventory == null)
                return;

            var main = player.inventory.containerMain;
            if (main == null)
                return;

            var items = new List<Item>(main.itemList);
            items.Sort((a, b) =>
            {
                if (a == null || a.info == null)
                    return 1;
                if (b == null || b.info == null)
                    return -1;
                return string.Compare(a.info.shortname, b.info.shortname);
            });

            for (int i = 0; i < items.Count; i++)
                items[i].MoveToContainer(main, i);

            SendReply(player, "Inventory sorted.");
        }
    }
}

FAQ

Does the Info title have to match the file name?

No. The class name must match the file name (QuickSort.cs contains class QuickSort), but the [Info] title is free text with spaces and is only used for display in the console and oxide.plugins output.

Can I use [Info] without a version?

No. The constructor takes title, author and version. All three are expected; the version must be in major.minor.patch form, otherwise you get a separate version-is-invalid warning.

Why does Carbon still load a plugin Oxide rejects?

Carbon parses plugin metadata with its own loader and is more lenient about missing attributes, but plugins without [Info] lose version reporting and may misbehave in dependency checks. Add the attribute anyway so the same file works on both frameworks.

The attribute is there but the message persists — why?

The attribute is likely on a different class than the one deriving from RustPlugin, or hidden inside a commented block. There must be only one top-level RustPlugin class in the file, with the attribute immediately above it.

Different error?

Paste the full console output and get the cause and a fix in plain English.

Open the error explainer

Skip the debugging

Generated plugins are compiled before you get them, and compiler errors are fixed automatically.

Generate a plugin

2 free plugins a month, no card.

Last updated Oct 26, 2026.

Get plugins that compile first time

Generate