A modern, interactive platform for the World Staffing Awards 2026 that enables community-driven nominations, transparent voting, and real-time engagement.
- Multi-step Nomination Form: Intuitive form with business email validation and LinkedIn verification
- Supabase Storage Integration: Secure image uploads with automatic optimization
- Public Directory: Browse approved nominees with filtering and search capabilities
- Interactive Voting: Cast votes with comprehensive duplicate prevention
- Real-time Vote Counts: Live vote updates without page refresh
- Top 3 Podium: Real-time leaderboard with category switching
- Social Sharing: Share nominees via Email, LinkedIn, and Twitter
- Responsive Design: Optimized for desktop and mobile devices
- Admin Dashboard: Comprehensive management interface with passcode protection
- Approval Workflow: Review, approve, or reject nominations
- Real-time Analytics: Live stats and vote tracking with Supabase Realtime
- CSV Export: Export nominations and votes data
- Conflict Resolution: Handle duplicate nominations gracefully
- Image Migration Tools: Convert legacy base64 images to Supabase Storage
- Development Utilities: Seed dummy data and reset system
- Vote Simulation: Generate realistic voting patterns for testing
- Data Validation: Comprehensive LinkedIn URL normalization and business email validation
- Framework: Next.js 14+ (App Router) with TypeScript
- Database: Supabase (PostgreSQL) with Row Level Security
- Storage: Supabase Storage for media files
- Styling: Tailwind CSS + shadcn/ui components
- Forms: react-hook-form + zod validation
- State Management: SWR for data fetching and caching
- Email Marketing: Loops.so integration for voter sync
- Icons: Lucide React
- File Handling: Supabase Storage with public URLs
- Top Recruiter
- Top Executive Leader (CEO/COO/CHRO/CRO/CMO/CGO)
- Top Staffing Influencer
- Rising Star (Under 30)
- Top AI-Driven Staffing Platform
- Top Digital Experience for Clients
- Top Women-Led Staffing Firm
The platform integrates with Loops.so to automatically sync voters and enable targeted email campaigns:
- Automatic Sync: When users vote, their information is automatically synced to Loops
- Tagging: All voters receive the "Voter 2026" tag for segmentation
- Upsert Logic: Existing contacts are updated, new ones are created
- Error Handling: Failed syncs are logged but don't block voting
- Vote Events: Each vote triggers a "vote_cast" event in Loops
- Rich Data: Events include category, nominee details, and voting context
- Analytics: Enables detailed voter behavior analysis
LOOPS_API_KEY=your_loops_api_key
LOOPS_SYNC_ENABLED=trueUse the development utilities at /dev to test Loops integration:
- Test voter sync
- Send sample events
- Verify contact creation
- Fastest Growing Staffing Firm
- Best Staffing Process at Scale
- Thought Leadership & Influence
- Top Staffing Company (USA/Europe)
- Top Recruiting Leader (USA/Europe)
- Top AI-Driven Platform (USA/Europe)
- Top Global Recruiter/Leader
- Special Recognition Award
-
Clone the repository
git clone https://github.com/yourusername/world-staffing-awards.git cd world-staffing-awards -
Install dependencies
npm install
-
Create data directory
mkdir -p data echo "[]" > data/nominations.json echo "[]" > data/votes.json
-
Run the development server
npm run dev
-
Open your browser Navigate to http://localhost:3000
# Reset all data
curl -X POST http://localhost:3000/api/dev/reset
# Seed with approvals and votes
curl -X POST http://localhost:3000/api/dev/seed \
-H "Content-Type: application/json" \
-d '{"approveSome":true,"votes":true}'- URL:
/admin - Default Password:
WSA2026
/- Homepage with podium/nominate- Nomination form/directory- Public nominee directory/nominee/[slug]- Individual nominee profiles/admin- Admin dashboard/dev- Development utilities (dev only)
Update the admin passcode in src/lib/constants.ts:
export const ADMIN_PASSCODE = "your-secure-password";Modify the free email domains list in src/lib/constants.ts:
export const FREE_EMAIL_DOMAINS = [
"gmail.com",
"yahoo.com",
// Add more domains...
];Adjust file size limits in src/lib/constants.ts:
export const MAX_FILE_SIZE = 5 * 1024 * 1024; // 5MB{
"id": "uuid",
"category": "Top Recruiter",
"type": "person",
"nominator": {
"name": "John Doe",
"email": "john@company.com",
"phone": "+1-555-0000"
},
"nominee": {
"name": "Jane Smith",
"email": "jane@company.com",
"title": "Senior Recruiter",
"linkedin": "https://www.linkedin.com/in/jane-smith",
"headshotBase64": "data:image/jpeg;base64,..."
},
"liveUrl": "/nominee/jane-smith",
"status": "approved",
"uniqueKey": "top recruiter__https://www.linkedin.com/in/jane-smith",
"createdAt": "2025-01-01T00:00:00.000Z"
}{
"nomineeId": "uuid",
"category": "Top Recruiter",
"voter": {
"firstName": "John",
"lastName": "Voter",
"email": "john@agency.com",
"linkedin": "https://www.linkedin.com/in/john-voter"
},
"ip": "192.168.1.1",
"ua": "Mozilla/5.0...",
"ts": "2025-01-01T00:00:00.000Z"
}- Business Email Validation: Blocks personal email domains
- LinkedIn URL Normalization: Prevents duplicate nominations
- One Vote Per Category: Enforced per voter per category
- IP + Email Tracking: Comprehensive duplicate vote prevention
- Admin Passcode Protection: Secure admin access
- Input Sanitization: All user inputs are validated and sanitized
- Push to GitHub
- Connect repository to Vercel
- Deploy with default settings
- Set environment variables if needed
# Optional: Set admin passcode via environment
ADMIN_PASSCODE=your-secure-password
# Optional: Set to production to disable dev routes
NODE_ENV=production- Submit nomination with business email
- Try duplicate nomination (should be blocked)
- Vote for nominee (should work once)
- Try voting again (should be blocked)
- Admin approval workflow
- Directory filtering and search
- Social sharing buttons
- Mobile responsiveness
# Run development server
npm run dev
# Build for production
npm run build
# Start production server
npm start
# Type checking
npm run type-check
# Linting
npm run lint- Aug 12, 2025: Nominations Open
- Sep 14, 2025: Nominations Close
- Sep 15, 2025: Public Voting Opens
- Jan 15, 2026: Voting Closes
- Jan 30, 2026: Awards Ceremony
- Fork the repository
- Create a feature branch
- Make your changes
- Test thoroughly
- Submit a pull request
This project is licensed under the MIT License - see the LICENSE file for details.
For support or questions:
- Create an issue on GitHub
- Check the development utilities at
/dev - Review the admin dashboard for data insights
Built with β€οΈ for the World Staffing Awards 2026