Browse docs

Elections & Public Displays

Set up character-based voting and configure public courthouse information.

Election management

DOJ staff manage election drafts, choices, voting periods and results in the Elections app. Citizens cast their vote at a configured digital booth. A courtroom's evidence screens and the courthouse's public schedule displays are separate systems.

Setup

  1. Enable Config.ToggleFeatures.elections and allow the doj_elections app for the intended grades. Assign Manage elections to the staff who administer ballots. The normal tablet duty requirement applies.
  2. Select the DOJ job and courthouse in /jobconfig. Add a Digital voting booth to its locations and place it with an accessible entrance. The default model is sky_doj_voting_booth_01.
  3. Complete the database migrations before opening a ballot. Version 0.2.0 records the character identifier in sky_doj_election_votes.char_id and enforces a unique (election_id, char_id) pair. Voting refuses to start with an incompatible or incomplete schema. Do not remove the uniqueness constraint to work around an error.

These instructions apply to 0.2.0. Version 0.1.1 used a private election pepper; the character-based implementation in 0.2.0 no longer reads that setting. Complete the 0.2.0 update and its database migration before removing an existing secret.

Create and run a ballot

  1. Create a draft with its public title, description, opening time, closing time and answer options.
  2. Review the ballot text and schedule. Defaults allow 2–12 options, a minimum duration of 5 minutes and a maximum duration of 30 days.
  3. Save the draft. Draft edits use version checks so a second editor cannot silently overwrite the version you opened.
  4. Publish the draft when it is ready. A published future election is scheduled; voters cannot vote before its opening time.
  5. During the voting period, citizens approach a booth, open the ballot, choose an option and submit their vote. The server checks their current booth access, election state and whether they have already voted.
  6. Review results after the voting period has ended, or close the election through the staff controls. Cancel a draft or published election when the ballot should no longer proceed.

An elapsed closing time and the staff Close action are distinct: the time-ended election no longer accepts votes, but its persisted status may still be published until staff close it.

The standard booth interaction opens the ballot at the booth; Escape closes it. Keep the entrance clear and place the booth so players can stand inside the interaction area. This is in-world voting, not an unrestricted remote ballot from any location.

One vote and privacy

The server enforces one recorded vote per election and character. Repeated submissions or visiting a second booth do not create a second vote for that character.

New vote rows store the character identifier alongside the selected option. Database administrators can therefore associate those votes with characters; do not describe this as an anonymous ballot. Protect database access and backups. Separate characters remain separate voting identities.

The public booth shows ballot details, choices and the current character's own voting status. It does not receive voter identities or live option counts. Staff results and public booth views are separate; do not treat a screenshot of the staff view as the citizen view.

Migrating older elections

Back up the database before moving from the older hashed-voter implementation. Its existing votes are retained in the results with no recovered character identifier. Published elections that contain those legacy votes are closed during migration, because their previous voters cannot safely be matched to the new character identifiers. Create a new ballot when voting needs to continue; do not reopen the old one by editing the database.

The migration replaces the old voter-key constraint and removes the obsolete voter keys and pepper fingerprints. Preserve your pre-migration backup if you need to retain that historical data. This does not claim that an existing customer database has already been migrated.

Public hearing displays

Enable Config.ToggleFeatures.publicDisplays and Config.PublicDisplays.enabled. Under the courthouse's locations, place the desired public wall screen, desk monitor or floor terminal. Fresh installations have no display placements.

The public docket shows public hearings, courtroom occupancy, times, status and directions. Only hearings enabled for public display are included; the related calendar visibility also applies. Use the hearing's subject and judge reveal controls deliberately:

SettingPublic effect
Public hearing enabledAllows the hearing to appear on the docket.
Reveal subjectShows the configured public subject; otherwise the case label stays neutral.
Reveal judgeIncludes the configured judge display name.
WayfindingHelps visitors find the courtroom without exposing the private case record.

The default display window covers the previous 120 minutes and the next 48 hours, with up to six visible rows. A public docket does not grant access to case files, witness statements or evidence. To show admitted exhibits inside a room, configure that room's evidence displays instead; see Hearings & Courtrooms.

Troubleshooting

SymptomCheck
Voting reports a schema errorCompleted migrations, the character column and the election/character uniqueness constraint.
A secret error still appearsYou are running the older implementation; follow the matching package instructions instead of removing its required secret.
An election is missing from a boothPublication state, schedule, booth configuration and whether migration closed a legacy ballot.
A second submission is refusedThe existing vote is retained; do not clear the constraint to permit another.
A public screen shows no hearingDisplay placement/activation, time window, hearing public flag and calendar visibility.
A participant's name is missingPublic subject/judge reveal controls; private participant data is intentionally omitted.

General installation and permission setup are covered under Installation and Permissions.