Romanian Baptist Youth Association

A ballot that's correct by construction.

RBYA Elections is the Romanian Baptist Youth Association's annual committee election, rebuilt from a decade-old ASP.NET app into a Next.js + Supabase app on Cloudflare Workers. Real accounts for delegates and the election committee, a ballot the database itself makes correct instead of a form that trusts the client, and the same nomination-to-results flow the organization already runs at Convention every year -- now with a historical archive so past elections stay browsable instead of disappearing.

Home Candidates Nominate Results Archive

RBYA Committee Elections

Nominate a candidate, register your church's delegates, and cast your ballot -- all in one place.

View candidates Start a nomination How elections work
Nominations are open through September 27, 2026.
Features

What it actually does

🗳️

Ballot Integrity by Design

One row per election/delegate/position, enforced by a database constraint, plus a trigger that blocks over-selecting candidates past a position's seat limit. Double-voting is rejected at write time, not caught after the fact.

✍️

Nomination → Confirmation

Anyone can nominate an RBYA member. The nominee has to actively confirm before appearing publicly, and the window closes 48 hours before Convention.

💬

Support & Objections, Handled Differently

Public comments of support show up on a candidate's page. Objections go straight to the committee to prep what's read aloud at Convention -- never shown online.

⛪

Church-Based Delegate Quota

Churches self-register their delegate list at one delegate per ten youth. The committee verifies the list before anyone on it can log in to vote.

🔑

Two Kinds of Login

Delegates sign in passwordlessly by email once verified. The election committee gets a real password login, provisioned by hand -- no public sign-up.

📊

Results That Lead With Who Won

A winners summary up top -- executive positions front and center, the larger general committee tucked into a collapsible section -- before the full per-candidate vote tables.

🗄️

A Real Archive

Past years' candidates and results stay browsable instead of disappearing the moment a new election opens.

🧑‍💼

Committee Moderation Tools

Ignore a withdrawn or duplicate nomination, request pastor vetting, upload a candidate's photo, and publish results -- all from one dashboard.

☁️

Built for Once-a-Year Traffic

Deployed on Cloudflare Workers instead of a plan sized for year-round usage -- this app is quiet almost all year and busy for one month around Convention.

How It Works

The same process the organization already knows

Nomination, confirmation, registration, voting, and results -- just enforced by the app instead of trusted to people remembering the rules correctly.

Nomination

No login required to nominate or comment

Anyone can nominate a candidate, leave a note of support, or file an objection -- no account needed for any of it.

  • Nominee confirms by email before appearing publicly
  • Positive comments are shown; objections go to the committee only
Delegates

Register, get verified, then log in

A church submits its delegate list against its youth-count quota. The committee verifies it before those delegates can sign in.

  • Passwordless email magic link -- no password to forget
  • Absentee delegates can only vote for committee candidates, by deadline
Voting

One submission per position, enforced by the database

A resubmission for a position a delegate already voted on is rejected outright -- the database constraint makes it impossible, not just discouraged.

Results

>50% wins the seat, or it stays open

A candidate is elected with more than 50% of ballots cast for their position. If fewer candidates than seats clear a majority, those seats remain open rather than being backfilled.

Tech

Built with

Next.js
TypeScript, App Router, Server Actions
Supabase
Postgres, Auth, Row Level Security, Storage
Cloudflare Workers
via vinext, on a custom domain