Candidate Photos and Bios

Give voters the context they need to make an informed choice. Add candidate photos and biographical descriptions directly to your election ballot.

Overview

When creating an Election question, each candidate has two optional profile fields: a photo and a bio. Both are displayed on the voter ballot alongside the candidate's name.

Photos and bios are optional. You can add them for all candidates, some candidates, or none at all. The ballot layout adapts automatically.

Candidate profiles are only available for Election questions. Motion questions (For/Against/Abstain) do not support photos or bios.

Adding a Candidate Photo

1

Open the Question Editor

Navigate to your voting session and create or edit an Election question. Each candidate row includes a photo upload area to the left of the name field.

2

Select an image

Click the dashed square icon next to the candidate name. A file picker opens where you can select a PNG, JPEG, or WebP image (2 MB maximum).

3

Crop the photo

An in-browser crop modal appears with a circular crop area. Use the zoom slider to adjust the framing, then click "Upload" to confirm. The crop is rendered at 512x512 pixels before uploading.

4

Photo is uploaded and optimized

The cropped image is sent to the server, validated using magic byte inspection (not just the file extension), converted to WebP format, and stored on Cloudflare R2. A circular preview appears in the candidate row.

5

Save the question

Click "Save" to persist the question along with all candidate photos and bios. If you navigate away without saving, any uploaded photos that were not saved are automatically cleaned up from storage.

Tip: To replace an existing photo, hover over the circular preview and click the trash icon to remove it, then upload a new one.

Adding a Candidate Bio

Each candidate row in the Question Editor includes a "Bio / Details (Optional)" text area next to the name field. Type or paste the candidate's biographical information, qualifications, or statement directly into this field.

The bio field is free-form text with no character limit. On the voter ballot, long bios are initially truncated with a two-line preview. When a voter selects a candidate, the full bio expands automatically so voters can read the complete text without leaving the ballot.

Tip: Keep bios concise and relevant. Include the candidate's role, qualifications, and a brief statement. Voters are more likely to read shorter bios in full.

What Voters See

On the voter ballot, each candidate is displayed as a selectable row. When a photo has been uploaded, it appears as a circular thumbnail to the left of the candidate's name. The bio text appears below the name in a smaller, muted font.

With Photo and Bio
  • Circular photo thumbnail on the left
  • Candidate name in bold
  • Bio preview (2 lines) below the name
  • Full bio expands when the candidate is selected
Without Photo or Bio
  • Candidate name in bold (no photo area)
  • Standard selection indicator (checkbox or radio)
  • Layout adjusts automatically

Image Requirements and Storage

Upload requirements

  • Accepted formats: PNG, JPEG, and WebP
  • Maximum file size: 2 MB per photo
  • All images are validated using magic byte inspection, not just the file extension
  • The in-browser crop renders at 512x512 pixels

Server-side processing

  • Images are resized to a maximum of 512x512 pixels (without enlargement)
  • All images are converted to WebP format at 85% quality
  • EXIF metadata is stripped during the conversion process
  • Filenames are sanitized to prevent path traversal attacks

Storage

  • Photos are stored on Cloudflare R2 object storage
  • Files are cached with a one-year cache header for fast delivery
  • Abandoned uploads (photos uploaded but never saved to a question) are cleaned up automatically

What Happens During PII Purge

When you purge PII from an ended or archived session (either manually or through the automated retention countdown), VoteAlly handles candidate data as follows:

Deleted permanently:

  • Candidate photos are deleted from Cloudflare R2 storage
  • Photo URLs are removed from the question record in the database

Preserved as public record:

  • Candidate names are retained
  • Candidate bios are retained
  • Vote counts and election results are retained

Note: Candidate names and bios are considered public record and are essential for meaningful election results. They are not removed during PII purge.

Frequently Asked Questions

What image formats are accepted for candidate photos?

VoteAlly accepts PNG, JPEG, and WebP images. All uploads are validated using magic byte inspection (not just the file extension) and automatically converted to WebP format for optimal performance.

What is the maximum file size for a candidate photo?

Candidate photos have a 2 MB upload limit. After cropping and server-side optimization, the final image is resized to 512x512 pixels and compressed in WebP format, so the stored file is significantly smaller.

Are candidate photos required?

No. Candidate photos are entirely optional. The ballot displays correctly with or without photos. You can add photos for some candidates and leave others without one.

What happens to candidate photos during PII purge?

When you purge PII from an ended or archived session, all candidate photos are permanently deleted from Cloudflare R2 storage and the photo URLs are removed from the database. Candidate names and bios are preserved because they are considered public record.

Can I edit a candidate photo after the election has started?

No. Once ballots have been cast on a question, the candidate list (including photos and bios) is locked to protect ballot integrity. You must finalize all candidate profiles before the first vote is recorded.

What happens if I upload a photo but do not save the question?

Uploaded photos that are not saved to a question are treated as abandoned uploads. They are cleaned up automatically when you navigate away from the editor or close the browser tab.

Related Guides