A web application designed to facilitate asynchronous committee-based decision-making using Robert's Rules of Order. This platform enables committees to propose, debate, and vote on motions with proper parliamentary procedure, all in an asynchronous digital environment.
Live Website: https://bobsrules.netlify.app/
Demo: https://youtu.be/-n7A_yzEaMk
- Committee Management: Create and manage committees with customizable voting thresholds (majority or supermajority) and anonymous voting options
- Motion Workflow: Complete parliamentary procedure lifecycle from proposal through seconding, debate, and voting
- Role-Based Permissions: Three-tier role system (Member, Chair, Owner) with appropriate access controls
- Real-Time Status Updates: Automatic motion status transitions and vote tallying
- User Authentication: Secure authentication via Auth0 with JWT token-based API access
- Asynchronous Collaboration: Members can participate in debates and voting on their own schedule
Motions follow Robert's Rules of Order with these status transitions:
PROPOSED → SECONDED → DEBATE → VOTING → PASSED/REJECTED
↓
VETOED
- PROPOSED: Motion created, awaiting second
- SECONDED: Motion seconded, awaiting chair approval
- VETOED: Chair ruled motion out of order (terminal state)
- DEBATE: Motion approved for discussion
- VOTING: Voting phase opened by chair
- PASSED/REJECTED: Determined by vote threshold
Members are the standard participants in the committee who can fully participate in the deliberative process. This is the default role for most committee participants.
- Propose new motions
- Second motions proposed by others
- Participate in debates and discussions
- Cast votes on open motions
- Challenge Chair vetoes
- View committee information and motion history
The Chair (or presiding officer) manages the governance and procedural aspects of the committee. This role ensures proper parliamentary procedure and controls the flow of business during meetings. A Chair, notably, is not a voting member: in order to preserve impartiality and avoid the appearance of bias, the Chair's role excludes them from proposing motions, casting votes, or participating in debates.
- Approve or veto seconded motions
- Open voting on motions
- Manage voting threshold settings (majority vs. supermajority)
- Control anonymous voting settings
- Second another user's motion
The Owner has the ability to manage the roles of other users within the committee. This role is automatically assigned to the person who created the committee. Multiple users can share the Owner role.
Permissions
- Add and remove members
- Change member roles (assign/remove CHAIR/OWNER status)
- All MEMBER permissions
When the website is opened for the first time by a user they will be asked to log in/sign up. A real email is not required. Password strength requirements pop up for the user to reference.
Once the user has been authenticated they are brought to the landing page
The username will be the beginning of their email until they change it on their profile (Shown later). The user can begin creating committees. By creating a committee they become the Owner.
The user can then click in to a committee. If the user has been added as a Member to another committee by others, it will show here as well.
Once in a committee, the user can click Manage/View Membership. Since this user is the Owner they can then add members by clicking the button and change member roles by double clicking on the role entry in the table.
From the top navigation bar you can navigate to user profile and change the user information.

From the committee page we can create motions and click on "view details" to go to the motion.
Another user will then second the motion and will be prompted to wait for the chair before debate begins. Next, a chair must approve or deny(veto). If approved, debate begins.
You can now debate, selecting your position and hitting send. Select view debate to see what has been said.
Once the chair determines a motion has been sufficiently debated they can then begin the vote
From the committee page we can search motions by contents or by their status using the pink drop down menu. This allows users to quickly navigate to the motions that require their attention. We will look for motions we need to vote on.

The voting button is now visible and the user can make their choice.
The voting panel shows where the vote currently is and tells the user if they have voted and how. If the user returns to this page they will know they have voted.

If the preferred procedures are a 2/3 vote or anonymous voting the Chair can change the committee's voting settings on the manage/view membership page.

After the threshold to pass is reached we can see that it has passed, if it is not passed it is marked as rejected. If enough oppose votes occur to make it impossible to pass it will be rejected. Ties are also rejected. (ex. 4 voting members, 2 support, 2 oppose)
If a motion is rejected there will be an option to repropose for members who voted on the motion.
The reproposed motion will be marked as such

If the chair decides to veto this (or any) motion the users can vote to override the chair with a supermajority. If the vote is successful the motion will move to debate.

User can also navigate to user roles to read more about what they can and cannot do.
- React 19.2.0 with Vite for fast development and optimized builds
- Material-UI (MUI) 7.3.5 for modern, responsive UI components
- React Router DOM 7.9.4 for client-side routing
- Auth0 React SDK 2.8.0 for authentication integration
- Netlify Serverless Functions for scalable, event-driven API endpoints
- MongoDB Atlas with Mongoose 9.0.0 for document database storage
- Auth0 Authentication with JWT token validation
- jose 6.1.2 for JWT verification and security
- Netlify for hosting and continuous deployment
This project implements a complete RESTful API with MongoDB for persistent storage. The system models users, committees, memberships, motions, debates, and votes with proper relationships and role-based access control.
Detailed Documentation:
- BACKEND-API-DOCUMENTATION.md - Complete API endpoint reference
- DATABASE-SCHEMA.md - MongoDB collections, fields, relationships, and data types
- JWT-based authentication on all endpoints
- Role-based access control (RBAC)
- Automatic vote tallying and motion resolution
- RESTful conventions with proper HTTP status codes
- Users - Auth0-synchronized user profiles with usernames and metadata
- Committees - Decision-making bodies with configurable voting rules
- Memberships - User-committee relationships with roles (Member, Chair, Owner)
- Motions - Proposals with status tracking through parliamentary lifecycle
- Debates - Discussion entries with positions (Support, Oppose, Neutral)
- Votes - User votes with positions (Support, Oppose)

