Skip to main content
Dan's Plugins Community
HomeNewsGuidesLeaderboardAboutRoad MapCommissionsDev PortalAccount
All plugins
Democracy icon

Democracy

0

Latest: v0.4.0
63 downloads on GitHub
Tested on Minecraft 1.19, 1.21, 26.2
3 downloads on SpigotMC

First released August 8, 2026 · Last updated October 10, 2026

Downloads from this site

37 total

6 latest (v0.4.0)

Lets a Medieval Factions faction hold elections: members stand as candidates, vote, and follow the count.

Requires Medieval Factions

factions
medieval
roleplay
DownloadUser guideSourceSpigotMC
A recreated chat panel: every line is the plugin’s real output, captured from commands a bot player ran on a test server.

Usage

Last reported in use 11 days ago

2 server starts in the last 30 days

Server starts per day

Versions in use, by share of server starts

  • 0.2.0

    100% · 2 starts

Usage reported by trace — how it works. CI and test servers are excluded.

Usage of every plugin


Verified before release

Version 0.4.0 was started on real servers running Minecraft 1.19.4, 1.21.11, 26.2 and 26.3 before it was published. The jar you download is the exact one that passed. How releases work

Versions

All releases on GitHub
Development build
Pre-release
October 10, 2026· 4 downloads

Automated build of main at 648148e83e045fe7d8c1f283702b8522158a1379.

This is not a release. It is unreleased, unreviewed code that has not been through any release check, and a broken build can stop a server from starting. Do not run it on a server you care about without a backup.

Install it with Dan's Plugin Manager:

/dpm get democracy --experimental

Return to published releases with /dpm get democracy --stable.

Democracy-0.4.1-SNAPSHOT.jar (559.3 KB)

0.4.0

For a server running v0.3.0, this is a drop-in upgrade with no data migration or config changes required. Faction leaders get a new /d cancel command to call off their faction's election, and election state is now saved as soon as a player starts, runs in, drops out of or votes in an election, so a crash or forced stop no longer loses those actions. Minecraft 26.3 is now supported. If usage reporting is on, each event now also carries a random server ID, kept on a server-id: line that is added to plugins/trace/config.yml on first start. This ID identifies no player, account or IP address.

Changes

Elections

  • New /d cancel command: a faction leader can cancel their faction's election without naming a winner. The election's candidate and voter records are removed with it, and a new election can be started straight away. It is gated by the new d.cancel permission, granted to everyone by default, and listed in /d help (#54).
  • The d.default permission, used by /d with no arguments, is now registered in plugin.yml and granted by default, so permission plugins can see and manage it (#54).
  • Starting, running in, dropping out of, voting in and cancelling an election now save to disk immediately instead of only at shutdown. Rejected commands do not trigger a save (#46, #54).

Compatibility

  • Added support for Minecraft 26.3 (#50).

Usage reporting

  • Usage events now include a random per-server ID so distinct servers can be counted. It is stored as server-id: in plugins/trace/config.yml and shared by every plugin on the server that reports to trace. Delete that line to get a new ID. When reporting is turned off, no ID is created, read or written (#48).
  • The startup message and the config.yml comments now mention the server ID, and the details link now points to https://danielstephenson.dev/usage-reporting (#49, #51).

Version

v0.3.0 → 0.4.0 — MINOR. Mechanical floor from comparing the two jars: MINOR. Judgment: This release adds behaviour without breaking existing servers. It adds a new /d cancel command and permission, saves election state after each command that changes it, and writes a random server-id line to plugins/trace/config.yml when usage reporting is on. Registering d.default with default: true lets non-op players use /d without arguments, where Bukkit's op-only default for unregistered nodes probably blocked them before. That widens access to a version/info message rather than breaking anything, so it does not justify major. The save format is unchanged, the changed command constructors are internal wiring rather than a plugin-facing API, and removeElection had no in-plugin caller before /d cancel, so the minor floor stands.

  • minor: permission added: d.cancel
  • minor: permission added: d.default
  • minor: storage path changed: src/main/java/dansplugins/democracy/data/PersistentData.java

<details><summary>Java API changes (informational — nothing depends on this plugin)</summary>

  • public class added: dansplugins.democracy.commands.CancelCommand
  • dansplugins.democracy.commands.DropOutCommand: removed/changed public dansplugins.democracy.commands.DropOutCommand(dansplugins.democracy.Democracy, dansplugins.democracy.data.PersistentData);
  • dansplugins.democracy.commands.DropOutCommand: added public dansplugins.democracy.commands.DropOutCommand(dansplugins.democracy.Democracy, dansplugins.democracy.data.PersistentData, dansplugins.democracy.services.StorageService);
  • dansplugins.democracy.commands.RunCommand: removed/changed public dansplugins.democracy.commands.RunCommand(dansplugins.democracy.Democracy, dansplugins.democracy.data.PersistentData, dansplugins.democracy.factories.CandidateFactory);
  • dansplugins.democracy.commands.RunCommand: added public dansplugins.democracy.commands.RunCommand(dansplugins.democracy.Democracy, dansplugins.democracy.data.PersistentData, dansplugins.democracy.factories.CandidateFactory, dansplugins.democracy.services.StorageService);
  • dansplugins.democracy.commands.StartCommand: removed/changed public dansplugins.democracy.commands.StartCommand(dansplugins.democracy.Democracy, dansplugins.democracy.factories.ElectionFactory, dansplugins.democracy.data.PersistentData);
  • dansplugins.democracy.commands.StartCommand: added public dansplugins.democracy.commands.StartCommand(dansplugins.democracy.Democracy, dansplugins.democracy.factories.ElectionFactory, dansplugins.democracy.data.PersistentData, dansplugins.democracy.services.StorageService);
  • dansplugins.democracy.commands.VoteCommand: removed/changed public dansplugins.democracy.commands.VoteCommand(dansplugins.democracy.Democracy, dansplugins.democracy.data.PersistentData, dansplugins.democracy.factories.VoterFactory);
  • dansplugins.democracy.commands.VoteCommand: added public dansplugins.democracy.commands.VoteCommand(dansplugins.democracy.Democracy, dansplugins.democracy.data.PersistentData, dansplugins.democracy.factories.VoterFactory, dansplugins.democracy.services.StorageService);
  • dansplugins.democracy.trace.TraceClient: added public java.lang.String installId();
  • dansplugins.democracy.trace.TraceClient: added public static java.lang.String installIdFromFile(java.io.File);
  • dansplugins.democracy.trace.TraceClient$Builder: added public dansplugins.democracy.trace.TraceClient$Builder installId(java.lang.String);
  • dansplugins.democracy.trace.TraceClient$Builder: added public dansplugins.democracy.trace.TraceClient$Builder installIdFile(java.io.File);

</details>

Verification

Verified on a real Spigot server before publication; this release carries the exact jar that was verified.

  • boot gate run: booted twice on a fresh Spigot server running Minecraft 1.19.4 (11 assertions passed).
  • boot gate run: booted twice on a fresh Spigot server running Minecraft 1.21.11 (11 assertions passed).
  • boot gate run: booted twice on a fresh Spigot server running Minecraft 26.2 (11 assertions passed).
  • boot gate run: booted twice on a fresh Spigot server running Minecraft 26.3 (11 assertions passed).

Install with Dan's Plugin Manager: /dpm get <plugin>. How stable releases are made: Release channels.


drafted by Claude on behalf of Daniel Stephenson

0.3.0

For a server running v0.2.0, this is a drop-in upgrade with no config, data or permission changes. Players can now vote for a candidate who is offline, and when usage reporting is enabled, each command event now includes the plugin version. Existing elections, candidates and votes carry over unchanged.

Changes

Voting

  • /d vote <candidate> now works when the candidate is offline. The name is checked against the current election's candidates, and capitalisation doesn't matter (#42).
  • Naming an online player who isn't a candidate is still rejected, and no vote is recorded (#42).
  • You now need the candidate's full name. Before, a partial name could match an online candidate because of how Bukkit looks up online players (#42).

Usage reporting

  • When usage reporting is enabled, every event now includes the plugin's version, including the event sent each time a command is used. Before, only the startup event included it. Nothing about players or the server is added, and the existing ways to turn reporting off still work (#41).

Version

v0.2.0 → 0.3.0 — MINOR. Mechanical floor from comparing the two jars: PATCH. Judgment: #42 adds new behaviour the mechanical check can't see: /d vote now matches names against the election's own candidate list, so offline candidates can receive votes and names match regardless of case. #41 adds new outgoing data: every usage-reporting event, including per-command events, now carries the plugin version (before, only the startup event did). The TraceClient.builder signature change is in a vendored internal class, not a plugin API other plugins use, so it doesn't justify a major bump. One side effect: the old lookup used Bukkit's online-player matching, which could accept a partial name, and the new lookup needs the full name. That only affected online candidates and is minor next to the overall widening, so this stays at minor rather than major.

  • no interface or storage difference observed between the jars

<details><summary>Java API changes (informational — nothing depends on this plugin)</summary>

  • dansplugins.democracy.trace.TraceClient: removed/changed public static dansplugins.democracy.trace.TraceClient$Builder builder(java.lang.String, java.lang.String);
  • dansplugins.democracy.trace.TraceClient: added public static dansplugins.democracy.trace.TraceClient$Builder builder(java.lang.String, java.lang.String, java.lang.String);

</details>

Verification

Verified on a real Spigot server before publication; this release carries the exact jar that was verified.

  • boot gate run: booted twice on a fresh Spigot server running Minecraft 1.19.4 (11 assertions passed).
  • boot gate run: booted twice on a fresh Spigot server running Minecraft 1.21.11 (11 assertions passed).
  • boot gate run: booted twice on a fresh Spigot server running Minecraft 26.2 (11 assertions passed).

Install with Dan's Plugin Manager: /dpm get <plugin>. How stable releases are made: Release channels.


drafted by Claude on behalf of Daniel Stephenson

0.2.0

Democracy lets players on a Medieval Factions server hold elections. A player starts an election, others put themselves forward as candidates or drop out, and members vote for the candidate they want. It is for server owners who run Medieval Factions and want a player-driven way to choose leaders instead of assigning them by hand.

What it adds

  • /democracy, with /d as a short alias. Running either with no arguments shows the default message.
  • /d help lists the commands. Permission: d.help
  • /d info shows the current election. Permission: d.info
  • /d start starts an election. Permission: d.start
  • /d run makes you a candidate. Permission: d.run
  • /d dropout withdraws your candidacy. Permission: d.dropout
  • /d vote <candidate> casts your vote. Permission: d.vote
  • All six permissions are granted to every player by default, including d.start. If you don't want everyone to be able to start elections, restrict d.start in your permissions plugin.
  • config.yml has a usage-reporting block that is on by default. On startup and each time a command is used, the plugin sends its name, version and the command name to https://trace.danielstephenson.dev. It sends nothing about players or the server. The server log says on every start whether reporting is on. You can turn it off in any of these ways:
    • For this plugin only: set usage-reporting.enabled: false.
    • For every plugin that reports this way: set enabled: false in plugins/trace/config.yml.
    • Set the environment variable TRACE_USAGE_REPORTING=off or DO_NOT_TRACK=1.

What it writes

  • plugins/Democracy/config.yml is created on first start. If your existing config has no usage-reporting block, the plugin adds one.
  • Election state is saved under plugins/Democracy/ when the server stops and loaded again at startup, so an election in progress survives a restart. If the saved data can't be loaded, the plugin disables itself and does not run without it.
  • The first plugin on the server that uses this usage-reporting system creates plugins/trace/config.yml, which holds the server-wide off switch.

Requirements

  • A Bukkit/Spigot server supporting api-version 1.13 or newer.
  • Medieval Factions 5 or 6, installed separately. It is a hard dependency: if it is missing or not enabled, Democracy disables itself at startup.
  • Outbound network access only matters if usage reporting is on. If the server can't be reached, the reports are dropped without affecting gameplay.

Since the last prerelease

  • Works with Medieval Factions 5 and 6. The plugin no longer bundles Medieval Factions 4.6.2, so you now install Medieval Factions yourself (#39).
  • Medieval Factions is found when the plugin enables rather than when it loads, which fixes startup failures caused by load order (#35).
  • /d help now shows /d vote with its <candidate> argument (#36).
  • Election state is saved and restored across server restarts (#27).
  • If saved election data doesn't match what the plugin expects, the plugin logs an error and stops instead of quietly continuing (#23).
  • Votes from one election can no longer affect another. The placeholder message shown when players joined has been removed (#16).
  • Added usage reporting. It runs off the main thread and can be turned off (#24). The server log states on every startup whether it is on, and there is now a server-wide off switch (#31).
  • Removed leftover template behaviour: the start command's colour, a debug logger and placeholder config options (#20).
  • Added /d run, /d dropout, /d vote and /d info (#7).
  • Fixed the plugin checking the wrong plugin folder for an existing config.yml (#4).

Verification

Verified on a real Spigot server before publication; this release carries the exact jar that was verified.

  • boot gate run: booted twice on a fresh Spigot server running Minecraft 1.19.4 (11 assertions passed).
  • boot gate run: booted twice on a fresh Spigot server running Minecraft 1.21.11 (11 assertions passed).
  • boot gate run: booted twice on a fresh Spigot server running Minecraft 26.2 (11 assertions passed).

Install with Dan's Plugin Manager: /dpm get <plugin>. How stable releases are made: Release channels.


drafted by Claude on behalf of Daniel Stephenson

Snapshot release marking Democracy's move to an AI-first development approach.

Day-to-day feature work, grooming, review and maintenance now run through AI agents working directly against this repository, with the maintainers setting direction and approving what lands. The version bump marks that change in how the project is built — it is not a compatibility break. Behaviour, configuration and stored data are unchanged, and existing installations can upgrade in place.

This is a dated snapshot, not a finished release. It follows the precedent set by Medieval Factions' 6.0.0-SNAPSHOT-7-25-2026: the AI-first line has not yet been verified in live operation, and the snapshot designation stays until it has.

Version changes

  • pom.xml: 0.1-SNAPSHOT → 0.2.0-SNAPSHOT-8-8-2026

Opened as https://github.com/Dans-Plugins/Democracy/pull/8.


Drafted by Claude on behalf of Daniel Stephenson.

BlueMap Medieval Factions

Renders Medieval Factions claims on BlueMap's web map. Originally written by Kilz.

Currencies

An expansion for Medieval Factions that allows faction owners to create and mint local currencies.

Fiefs

Allows players to create fiefs and manage them.

Medieval Cookery

Allows server owners to add cooking recipes for an enhanced roleplay experience.

Something wrong, or something missing?

Bugs go to the plugin's issue tracker, where they can actually be fixed and tracked. Ideas for new behaviour go to the Dev Portal, where the community can upvote them.

v0.15.2
Source CodeReport a BugKnowledge BaseFree Server Hosting

More by Daniel Stephenson → danielstephenson.dev · Play his games in your browser