Перейти к содержимому
Mineforgian

ModN Vote

Privacy-first GUI polling for Paper/Folia: ranked voting, Yes/No polls, anonymous ballots, verification, and audit integrity.

Загрузки
121
Подписчики
2
Обновлён
9 мая 2026 г.
Лицензия
MIT

Опубликован 14 ноября 2025 г.

ModNVote

Privacy-first, GUI-driven community polling for PaperMC 1.21.x

ModNVote is a modern voting and polling plugin for Minecraft communities that want polls to be easy for players, practical for admins, and verifiable after the fact.

ModNVote 2.x replaces the original Yes/No-only workflow with a full poll lifecycle system supporting:

  • Ranked single-winner polls
  • Yes/No polls
  • GUI-driven poll creation and editing
  • Poll cloning for repeat or template-based polls
  • Anonymous ballot storage
  • Participation tracking separated from vote content
  • Ballot proof-phrase verification
  • Tamper-evident audit and integrity checks
  • Optional external witness publication via Discord-compatible webhooks
  • Manual and automatic integrity checkpoint publication
  • Java/Bedrock-friendly inventory interfaces
  • Mandatory vote confirmation before submission
  • /poll as a short alias for /modnvote

Built for PaperMC 1.21.x and Java 21.

ModNVote is the spiritual successor to PineVote, rebuilt cleanly under the MODN METL brand with a stronger focus on privacy, transparency, and integrity.


Key Features

GUI Poll Builder

Admins can create and edit polls through an inventory GUI rather than a long sequence of setup commands.

Supported builder flows:

/modnvote create ranked_single_winner <optionCount>
/modnvote create yes_no
/modnvote edit <draftPollId>

The shorter alias can also be used:

/poll create ranked_single_winner <optionCount>
/poll create yes_no
/poll edit <draftPollId>

The builder lets admins configure:

  • Poll title
  • Poll description
  • Option names
  • Option descriptions
  • Ranked poll partial-ranking behaviour
  • Ranked poll maximum ranking count

Fields use clear red/green completion indicators:

  • Red = still needs work
  • Green = complete

When the poll is valid, the READY control turns green and the poll can be staged for opening.


Poll Cloning

Admins can clone an existing poll into a new editable draft:

/modnvote clone <sourcePollId>

This is useful for recurring polls where some options, wording, or settings are reused.

Cloning copies the poll definition and options, but does not copy ballots, participation records, lifecycle timestamps, proof phrases, or audit history.


Ranked Single-Winner Polls

Ranked polls let players order choices by preference.

Admins can create a ranked poll with:

/modnvote create ranked_single_winner 5

Players then vote through a GUI using:

/modnvote vote <pollId>

Ranked voting includes:

  • Click-to-rank options
  • Stable paper option icons
  • Tooltip text showing current rank
  • Optional partial-ranking support
  • Configurable max rankings
  • Mandatory review/confirmation before the ballot is cast

Yes/No Polls

Yes/No polls are still fully supported, now as part of the 2.x poll lifecycle.

Admins can create one with:

/modnvote create yes_no

The plugin uses protected canonical Yes and No options while still supporting the new GUI setup and lifecycle flow.


Anonymous Ballots

ModNVote is built around one core rule:

Anonymous ballots are the source of truth for vote content.

The plugin deliberately separates:

Data Purpose
Anonymous ballots Store vote content and drive results
Participation records Track who participated and prevent duplicates
Audit records Provide lifecycle and integrity evidence
Proof phrases Let players verify ballots without exposing identity links

This means results are calculated from anonymous ballots only, not from identity-aware participation records.


Verification Without Revealing Vote Content

Players can verify participation:

/modnvote verify participation <pollId>

This confirms whether their participation was recorded without revealing how they voted.

Players can also verify a ballot proof phrase:

/modnvote verify ballot <pollId> <proofPhrase>

Proof phrases act like bearer tokens. Anyone with the phrase can verify that ballot reference, so players should keep them private.


Audit, Integrity Checks, and Witness Publication

ModNVote is designed to make tampering detectable.

Integrity features include:

  • Anonymous ballot hash checks
  • Ballot proof commitment checks
  • Participation inclusion checks
  • Poll lifecycle audit records
  • Audit chain validation
  • Result calculation from anonymous ballots only
  • Optional witness checkpoint publication

ModNVote can publish privacy-safe witness events to configured Discord-compatible webhooks.

Supported witness events include:

  • Poll opened
  • Poll closed, including a public result summary
  • Automatic integrity checkpoints every configured number of accepted ballots
  • Manual integrity checkpoints via:
/modnvote checkpoint <pollId>

Witness publication does not publish player names, UUIDs, IP addresses, proof phrases, participation receipts, or per-player vote content.

Webhook delivery is best-effort and non-blocking. A failed webhook does not cancel voting, poll opening, poll closing, checkpointing, or persistence.


Java and Bedrock Friendly GUI

The GUI intentionally avoids decorative glass panes.

This keeps the interface simpler and more compatible with Bedrock players while still providing clear interaction cues through:

  • Item names
  • Item lore
  • Wrapped multiline descriptions
  • Red/green builder state
  • Confirmation screens

Main Commands

All commands are rooted at:

/modnvote

The shorter alias is also available:

/poll

Admin workflow

/modnvote guide
/modnvote create ranked_single_winner <optionCount>
/modnvote create yes_no
/modnvote edit <draftPollId>
/modnvote clone <sourcePollId>
/modnvote list
/modnvote show <pollId>
/modnvote delete <pollId>
/modnvote open <pollId>
/modnvote close <pollId>
/modnvote result <pollId>
/modnvote checkpoint <pollId>

Player workflow

/modnvote vote <pollId>
/modnvote mypolls
/modnvote verify participation <pollId>
/modnvote verify ballot <pollId> <proofPhrase>

Utility

/modnvote status
/modnvote reload

All examples above can also be run with /poll instead of /modnvote.

Some older low-level setup commands may remain callable as recovery tools, but normal poll setup should use the GUI builder.


Privacy Model

ModNVote avoids storing voter identity and vote content together.

Participation records are identity-aware because the plugin needs to know who has already voted. Anonymous ballots store the vote content. These two systems are deliberately separate.

This allows the plugin to:

  • Prevent duplicate voting
  • Verify that a player participated
  • Calculate results from ballot content
  • Avoid exposing how a named player voted

/modnvote verify participation must not reveal vote content.

/modnvote result must use anonymous ballots only.

External witness publication is poll-level only and must not reveal player-specific vote data.


Poll Lifecycle

Polls move through explicit states:

DRAFT -> READY -> OPEN -> CLOSED

Typical flow:

create -> edit in builder -> mark READY -> open -> players vote -> close -> result

DRAFT polls can be edited in the Poll Builder. READY polls can be opened. OPEN polls accept votes. CLOSED polls can report results.


Webhook Configuration

Webhook publication is configured in plugins/ModNVote/config.yml.

A single webhook should be configured as a YAML list:

publication:
  discord_webhooks:
    - "https://discord.com/api/webhooks/WEBHOOK_ID/WEBHOOK_TOKEN"
  publish_poll_opened: true
  publish_poll_closed: true
  publish_checkpoints: true

integrity:
  checkpoint_interval_ballots: 25

Use discord_webhooks: [] to disable webhook publication.

Multiple webhooks are supported by adding more - ... lines.

Never commit real webhook URLs to source control.


PlaceholderAPI

PlaceholderAPI support was part of the legacy 1.x plugin.

For ModNVote 2.x, please check the current release notes and repository documentation for the latest PlaceholderAPI status before relying on placeholders in production dashboards.


Requirements

  • Server: PaperMC 1.21.x
  • Java: 21
  • Database: SQLite
  • Optional: PlaceholderAPI, where supported by the current build

Installation

  1. Download the latest modnvote-*.jar.
  2. Drop it into your server's plugins folder.
  3. Restart the server.
  4. Configure permissions with your permissions plugin.
  5. Create a test poll with:
/modnvote create yes_no

or:

/modnvote create ranked_single_winner 3

ModNVote 2.x is a clean-install release. Migration from legacy 1.x databases is not currently supported.


Permissions

Permissions are defined in plugin.yml.

Common permissions include:

modnvote.admin.poll.create
modnvote.admin.poll.list
modnvote.admin.poll.open
modnvote.admin.poll.close
modnvote.admin.reload
modnvote.verify
modnvote.testvote

Duplicate-prevention bypass support remains configurable through the plugin configuration.


Roadmap

Potential future 2.x work includes:

  • Multi-winner STV
  • Combined elections such as Mayor + Council
  • Exportable signed audit snapshots
  • Advanced reporting and dashboards
  • Dedicated GUI delete confirmation flow
  • Additional admin transparency tooling
  • Multi-target witness publication beyond Discord-compatible webhooks

License & Credits

  • License: MIT
  • Copyright: MODN METL LTD
  • Developed by Jamie E. Thompson (@jamjet3)
  • Community testing: Pinecraft Equestrian SMP

If you use ModNVote on your server, a star on the GitHub repo is always appreciated.

Ченджлог

2.1.1Релиз26.1, 26.1.1, 26.1.2 · 9 мая 2026 г.

ModNVote v2.1.1 Changelog

This release improves ranked-choice result transparency and fixes misleading result presentation for closed ranked polls.

Added

  • Added full round-by-round IRV result reporting for RANKED_SINGLE_WINNER polls.
  • Added final-round tally reporting so players can see the actual winning round, not just first preferences.
  • Added exhausted ballot reporting where applicable.
  • Added eliminated candidate reporting for each IRV round.
  • Added manual result republishing command:
/modnvote publishresult <pollId>

This allows admins to republish corrected closed-poll results to the configured Discord witness webhook.

Changed

  • Ranked-choice in-game results now clearly show:
Poll winner
Final winner tally
IRV Round Breakdown
First Preference Round
Final Round
  • Discord closed-poll messages now distinguish between:

    • the declared winner,
    • the final IRV round,
    • and the full round-by-round IRV breakdown.
  • Replaced misleading first-preference-only “Result Summary” output for ranked-choice polls.

  • In-game wording changed from:

Winner after transfers

to:

Poll winner

for simpler player-facing language.

Fixed

  • Fixed misleading ranked-choice output where the winner was correct but the displayed vote counts only showed first-preference totals.
  • Fixed ranked-choice result display so users can now verify how transfers led to the final winner.
  • Fixed empty ranked polls incorrectly being able to resolve to a winner when no ballots had been cast.

Notes for server admins

If you previously published a ranked-choice result that only showed first-preference totals, you can now republish the corrected result after upgrading:

/modnvote publishresult <pollId>
2.1.0Релиз26.1, 26.1.1, 26.1.2 · 26 апреля 2026 г.

[2.1.0] - 2026-04-26

Added

  • /modnvote clone <sourcePollId> for cloning existing polls into new editable drafts.
  • /modnvote checkpoint <pollId> for manual witness checkpoint publication.
  • /poll as a short alias for /modnvote.
  • External witness publication via configured Discord-compatible webhooks.
  • Poll opened witness publication.
  • Poll closed witness publication with result summary.
  • Automatic integrity checkpoint publication every configured ballot interval.
  • Clear first-run config guidance for webhook list formatting.

Changed

  • Poll lifecycle commands can now publish best-effort external witness events.
  • Vote submission can now trigger automatic privacy-safe checkpoint publication.
  • Config comments clarify how to configure one or more webhook URLs.

Security / Privacy

  • Witness publication does not include player names, UUIDs, IP addresses, proof phrases, participation receipts, or per-player vote content.
  • Webhook delivery failures are logged without exposing full webhook URLs and do not affect poll lifecycle or ballot persistence.
2.0.0Релиз26.1, 26.1.1, 26.1.2 · 25 апреля 2026 г.

Changelog

All notable changes to ModNVote are documented in this file.

[2.0.0] - 2026-04-25

Summary

ModNVote 2.0 replaces the original Yes/No-only plugin with a privacy-first, audit-aware polling system.

This release introduces GUI-driven poll creation, ranked single-winner voting, improved Yes/No poll handling, anonymous ballot storage, participation verification, ballot proof verification, and lifecycle controls.

Added

  • GUI Poll Builder for ranked single-winner polls
  • GUI Poll Builder support for Yes/No polls
  • /modnvote create ranked_single_winner <optionCount>
  • /modnvote create yes_no
  • /modnvote edit <draftPollId>
  • /modnvote guide
  • Draft poll creation with placeholder ranked options
  • Service-authoritative poll title editing
  • Service-authoritative poll description editing
  • Service-authoritative option name editing
  • Service-authoritative option description editing
  • Builder chat input prompts with field-specific context
  • Wrapped multiline lore for poll and option descriptions
  • Red/green builder completion indicators
  • Builder validation status item
  • READY action from the builder GUI
  • Builder Cancel action (non-destructive)
  • Allow Partial Rankings toggle in GUI
  • Max Rankings cycle control in GUI
  • /modnvote mypolls
  • /modnvote verify participation <pollId>
  • /modnvote verify ballot <pollId> <proofPhrase>
  • Anonymous ballot verification using proof phrases
  • Participation integrity checks
  • Audit chain integrity checks
  • Ballot hash and commitment verification
  • Ranked voting GUI
  • Yes/No voting GUI
  • Mandatory vote confirmation UX
  • Join notifications for open polls
  • Folia-aware scheduling via ModNScheduler
  • Poll-local numbering for options
  • Cleaner command help and tab-completion

Changed

  • Replaced command-heavy authoring with GUI-first builder workflow
  • Results calculated from anonymous ballots only
  • Participation records separated from vote content
  • Verification commands aligned with privacy model
  • Ranked vote icons stabilised (paper items retained)
  • Builder descriptions wrapped and colour-consistent
  • Builder placeholders now red, completed fields green
  • Builder READY reflects placeholder validation
  • Command help simplified and focused on GUI workflow
  • Low-level commands hidden from normal help
  • GUI design avoids glass panes for Bedrock compatibility

Fixed

  • .gradle cache tracking issues
  • /modnvote show option numbering
  • Builder persistence via PollService
  • Builder refresh after edits
  • Option description updates in GUI
  • Lore wrapping colour loss
  • Premature READY state
  • Yes/No builder option duplication issue
  • Ranked vote icon instability
  • Builder Cancel placeholder
  • Command guide placement
  • Ranked create tab-complete hints

Architecture

  • Introduced builder session system
  • Added renderer/listener/input manager structure
  • Integrated ModNScheduler
  • Clean separation of GUI, service, and persistence layers

Privacy and integrity

  • Identity and ballot content separated
  • Anonymous ballots are source of truth
  • Participation prevents duplicates without exposing votes
  • Verification preserves privacy boundaries

Migration notes

  • 2.0 supersedes v1
  • No migration from 1.x supported
  • GUI builder replaces legacy setup commands

Recommended smoke test

/modnvote create ranked_single_winner 3
/modnvote create yes_no
/modnvote edit <draftPollId>
/modnvote open <readyPollId>
/modnvote vote <openPollId>
/modnvote close <openPollId>
/modnvote result <closedPollId>
/modnvote mypolls
/modnvote verify participation <pollId>
/modnvote verify ballot <pollId> <proofPhrase>
1.1.5Релиз1.21.8, 1.21.9, 1.21.10 · 18 ноября 2025 г.

Changelog – ModNVote

All notable changes to this project will be documented in this file.

The format is loosely based on Keep a Changelog.


[1.1.5] – GUI voting & stronger privacy

  • Added a GUI-based voting flow triggered via /modnvote.
    • Players now click Yes or No in a menu instead of typing /modnvote yes or /modnvote no.
    • This avoids vote choices appearing as chat or command entries in the server console/logs.
  • Removed the /modnvote yes and /modnvote no subcommands entirely.
  • Ensured vote handling:
    • Verifies the existing tally’s integrity before accepting a new vote.
    • Applies the vote only if the tally is cryptographically valid.
    • Recomputes and stores a new HMAC after the vote to maintain the integrity seal.
  • Improved player feedback:
    • On voting, players are told whether the tally was valid before their vote and that the integrity seal has been re‑applied after.
    • /modnvote status now reports:
      • whether the tally is cryptographically valid or not, and
      • whether the tally currently includes a vote from the viewer.
  • Kept admin tools (audit, fullaudit, reset, reload, verify) while tightening their messaging around integrity status and compromised tallies.

[1.1.4] – Integrity messaging & docs

  • Refined integrity checks and error handling around the HMAC tally seal.
  • Improved messages when verification fails, including clearer guidance for staff.
  • Updated README and documentation to better describe the privacy and integrity model.
  • Added a structured CHANGELOG.md to track future changes.

[1.1.3] – Clean rebuild & repository hygiene

  • Rebuilt the project cleanly in a fresh Gradle setup.
  • Restored and fixed CI workflows for GitHub Actions.
  • Tightened SQLite schema and DAO handling.
  • Updated README to reflect the production‑ready state of the plugin.

[1.1.2] – Initial public release

  • First public release of ModNVote as a PaperMC voting plugin.
  • Core features:
    • Yes/No voting with per‑UUID and per‑IP checks.
    • SQLite persistence.
    • Basic cryptographic sealing over tallies and participant lists.
    • Admin audit commands and PlaceholderAPI support.
1.1.3Релиз1.21.8, 1.21.9, 1.21.10 · 14 ноября 2025 г.

Privacy-first yes/no voting plugin for Paper 1.21.x — anonymous votes, integrity verification, IP-aware duplicate protection, and audit tools for modern Minecraft communities.

Комментарии

Загружаем…