Democracy
0
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
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.
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 GitHubAutomated 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 --experimentalReturn to published releases with /dpm get democracy --stable.
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 cancelcommand: 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 newd.cancelpermission, granted to everyone by default, and listed in/d help(#54). - The
d.defaultpermission, used by/dwith 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:inplugins/trace/config.ymland 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/das a short alias. Running either with no arguments shows the default message./d helplists the commands. Permission:d.help/d infoshows the current election. Permission:d.info/d startstarts an election. Permission:d.start/d runmakes you a candidate. Permission:d.run/d dropoutwithdraws 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, restrictd.startin your permissions plugin. config.ymlhas ausage-reportingblock that is on by default. On startup and each time a command is used, the plugin sends its name, version and the command name tohttps://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: falseinplugins/trace/config.yml. - Set the environment variable
TRACE_USAGE_REPORTING=offorDO_NOT_TRACK=1.
- For this plugin only: set
What it writes
plugins/Democracy/config.ymlis created on first start. If your existing config has nousage-reportingblock, 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-version1.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 helpnow shows/d votewith 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 voteand/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.
Related plugins
Renders Medieval Factions claims on BlueMap's web map. Originally written by Kilz.
An expansion for Medieval Factions that allows faction owners to create and mint local currencies.
Allows players to create fiefs and manage them.
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.
