New: see how many SpigotMC page viewers end up running your plugin →

Config usage & properties

See which options servers choose, which defaults most of them change, and anything else about how they're set up.

What you see

Config usage lists every option read from your config.yml on active servers: the most common value, the default your jar ships, and the share of servers that changed it. Open an option to see every value. An option most servers change is a sign its default is wrong; one nobody changes may not need to exist.

config.yml, automatically

Once an hour, from its own thread, the SDK reads your plugin's getConfig() and the defaults bundled in your jar. A value is sent when it changed since the last report, and every value once a day.

Only plain choices are sent:

  • true / false
  • Numbers of up to 16 characters
  • Short words of up to 24 characters made of letters, digits, _, . and -, like sqlite or en_US

Everything else is skipped: lists, sections, texts with spaces or color codes, values that look like an IP address or a UUID, and words longer than 8 characters that contain 5 or more digits in a row (IDs, keys).

Keys that are always skipped

A key is never read when its full path (lowercased) contains any of these words, anywhere:

pass  secret  token  key  host  user  login  url  uri  link  webhook  address  email  e-mail
database  jdbc  auth  credential  license  licence  api  domain  discord  channel  guild
motd  prefix  format  message  world

or when one of its parts is exactly id, ip, db, port or name (separated by ., - or _). So storage.mysql.password, webhook-url, server.port and arena-name are never read. Because the words match anywhere, some harmless keys are skipped too (worlds.enabled, messages.join-enabled).

Names in the dashboard

Each option becomes config.<path>, lowercased, with other characters replaced by _. Paths whose full name would be longer than 48 characters are skipped, and up to 100 options are read per server.

Leave options out

// Leave a path and everything under it out
analytics.excludeConfig("discord", "storage.mysql", "rewards.commands");

// Don't read config.yml at all
analytics.trackConfig(false);

excludeConfig matches a path exactly or anything below it, ignoring case.

Properties

For anything that isn't in config.yml, report a property: a per-server value read once an hour and shown as the share of servers per value, next to the config options.

analytics.property("economy", () -> economy != null ? "vault" : "none");
analytics.property("arenas", () -> arenaManager.count());
analytics.property("storage", () -> storage.type().name().toLowerCase());
  • Names follow the event naming rules. Values are turned into text and cut at 64 characters; null is skipped.
  • A supplier that throws is skipped for that report; the rest is sent.
  • Like config values, a property is sent when it changes and once a day.

Suppliers run on the SDK's thread, not the main thread: only read values that are safe to read from another thread (fields, counters, config), never worlds or entities.

Your dependencies

Every plugin in your depend and softdepend lists is reported as dep.<name> with the value installed or missing, so you know how many servers have Vault or PlaceholderAPI before building on them.