
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
/pollas 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
- Download the latest
modnvote-*.jar. - Drop it into your server's
pluginsfolder. - Restart the server.
- Configure permissions with your permissions plugin.
- 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_WINNERpolls. - 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./pollas 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
.gradlecache tracking issues/modnvote showoption 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 yesor/modnvote no. - This avoids vote choices appearing as chat or command entries in the server console/logs.
- Players now click Yes or No in a menu instead of typing
- Removed the
/modnvote yesand/modnvote nosubcommands 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 statusnow 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.mdto 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.
Комментарии
Загружаем…