pickr is a web application that enables users to create rankings of any set of items through intuitive swipe-based pairwise comparisons. Users can rank anything from personal preferences to team decisions by swiping through comparisons, similar to popular dating app interfaces. The app supports flexible comparison group sizes, real-time ranking visualisation, and shareable results through Paco encoding.
Perfect for:
- Personal decision making (favourite movies, restaurants, travel destinations)
- Team collaboration (feature prioritisation, candidate ranking, design selection)
- Entertainment & social activities (tier lists, polls, competitions)
git clone https://github.com/your-username/pickr
cd pickr
npm install
npm run dev
Open http://localhost:3000 to see your application.
- Swipe-based comparisons - Familiar mobile-first interface
- Pairwise comparisons - Break complex decisions into simple choices
- Flexible group sizes - Compare 2-N items per round (configurable)
- Real-time progress - Live ranking updates as you compare
- Text-only cards - Simple text-based items to rank
- Image cards - Visual comparisons with images
- Mixed content - Combine text and images for rich comparisons
- Pack management - Organise related items into collections
- Paco encoding - Compact, shareable URLs for results
- Multi-result comparison - Compare rankings from different users
- Aggregate analysis - Identify consensus and differences
- Offline functionality - Works without internet connection
- Next.js 15 with App Router and TypeScript
- React 19 with modern features
- Zustand for local state management
- Static export ready for CDN deployment
- Mobile-responsive design with Tailwind CSS
- Comprehensive testing with Vitest and MSW
βββ src/
β βββ app/ # Next.js App Router
β β βββ create/ # Pack creation pages
β β βββ rank/ # Ranking session pages
β β βββ results/ # Results display pages
β β βββ compare/ # Multi-result comparison
β β βββ layout.tsx # Root layout
β β βββ page.tsx # Landing page
β β βββ globals.css # Global styles
β βββ components/ # React components
β β βββ cards/ # Card creation and display
β β βββ ranking/ # Swipe interface components
β β βββ results/ # Results visualisation
β β βββ ui/ # Common UI components
β βββ lib/ # Core utilities
β β βββ ranking/ # Ranking algorithms
β β βββ paco/ # Paco encoding/decoding
β β βββ storage/ # Local storage utilities
β β βββ utils.ts # General utilities
β βββ store/ # Zustand stores
β β βββ cards.ts # Card and pack management
β β βββ ranking.ts # Ranking session state
β β βββ results.ts # Results and comparison state
β βββ types/ # TypeScript definitions
β β βββ cards.ts # Card and pack types
β β βββ ranking.ts # Ranking system types
β β βββ results.ts # Results and sharing types
β βββ mocks/ # MSW mock handlers
βββ public/ # Static assets and example images
βββ docs/ # Implementation documentation
npm run dev # Start development server
npm test # Run tests in watch mode
npm run coverage # Generate test coverage report
npm run lint # Check code quality
npm run lint:fix # Auto-fix linting issues
npm run type-check # TypeScript type checking
npm run test:run # Run tests once (CI mode)
npm run test:ui # Open Vitest UI
npm run coverage # Generate coverage report
npm run build # Build for production
npm run storybook # Start Storybook
npm run build-storybook # Build Storybook
npm run commit # Interactive conventional commit
npm run release:dry # Preview release
Create a .env.local
file for local development:
# Application Configuration
NEXT_PUBLIC_APP_NAME="pickr"
NEXT_PUBLIC_MAX_PACK_SIZE=50
NEXT_PUBLIC_DEFAULT_COMPARISON_SIZE=2
# Storage Configuration
NEXT_PUBLIC_STORAGE_PREFIX="pickr_"
NEXT_PUBLIC_ENABLE_ANALYTICS=false
# Development Settings
NEXT_PUBLIC_DEBUG_MODE=false
- Comparison group size: Adjust default comparison size (2-N items)
- Pack size limits: Set maximum number of items per pack
- Storage settings: Configure local storage behaviour
- UI themes: Customise colours and styling in
tailwind.config.ts
- Ranking algorithms - Comprehensive tests for pairwise comparison logic
- Paco encoding/decoding - URL generation and parsing validation
- State management - Zustand store behaviour verification
- Edge cases - Handling of ties, incomplete comparisons, and invalid data
- Card creation - Text and image card functionality
- Swipe interface - Touch and keyboard interaction testing
- Results display - Ranking visualisation and export features
- Responsive design - Mobile and desktop layout testing
- Complete user flows - End-to-end ranking sessions
- Cross-browser compatibility - Safari, Chrome, Firefox testing
- Offline functionality - Local storage and network independence
- Performance testing - Large pack handling and optimisation
- GitHub Pages deployment on main branch push
- Quality gates ensure code quality
- Semantic versioning with automated releases
- Static export optimized for CDN
npm run build # Generate static export
npx serve out # Test locally
-
Create a Pack
- Navigate to the create page
- Add a title and description for your ranking
- Add items (text, images, or both)
- Save your pack
-
Start Ranking
- Select your pack from the home page
- Configure comparison settings (group size)
- Begin swiping through comparisons
- Watch the live ranking sidebar update
-
View and Share Results
- Complete all comparisons to see final ranking
- Share results via the generated Paco URL
- Compare with other users' rankings
- Custom comparison sizes: Rank 3-5 items at once for faster sessions
- Mixed content cards: Combine text descriptions with images
- Offline usage: All functionality works without internet
- Result analysis: Compare multiple ranking sessions side-by-side
CLAUDE.md
- AI assistant guidanceCONTRIBUTING.md
- Contribution guidelinesCHANGELOG.md
- Version historybiome.json
- Code quality configurationvitest.config.ts
- Testing configuration
Component documentation and development environment:
npm run storybook
- Dependency auditing in CI/CD
- No server-side attack vectors (static export)
- Privacy-first LLM integration
- Secure defaults throughout
npm run security:check # Check for vulnerabilities
npm audit # Dependency audit
- Fork the repository
- Create a feature branch
- Make your changes
- Run tests and linting
- Create a pull request
See CONTRIBUTING.md
for detailed guidelines.
This project is licensed under the {{LICENSE}} License - see the LICENSE file for details.
If you encounter any issues or have questions:
- Check the documentation
- Search existing GitHub issues
- Create a new issue with detailed information
- Refer to
CLAUDE.md
for AI assistant guidance
- Basic pack creation with text cards
- Pairwise comparison engine
- Simple results display
- Local storage with Zustand
- Static export deployment
- Image support for cards
- Configurable group sizes (2-N comparisons)
- Live ranking sidebar
- Paco encoding for shareable URLs
- Mobile-optimised swipe gestures
- Multi-result comparison tools
- Aggregate ranking analysis
- Pack templates and sharing
- Performance optimisations for large packs
- Advanced visualisation options
- Real-time collaborative ranking
- Native mobile applications
- AI-powered suggestion engine
- Integration with external data sources
- Advanced analytics dashboard
Built with modern web development best practices and inspired by the Next.js community. Special thanks to all contributors and the open-source ecosystem.
Happy coding! π