Making video games accessible and inclusive for everyone
At Playability, we believe that everyone should have the opportunity to enjoy video games, regardless of their physical or cognitive abilities. We strive to break down barriers in gaming by providing accurate, user-driven accessibility information and advocating for more inclusive game design. Our goal is to create a world where no gamer is left behind due to lack of accessibility features.
Visit us live at: playablty.com
- User Registration & Authentication: Secure JWT-based authentication with bcrypt password hashing
- Comprehensive Game Database: Access thousands of games with detailed information sourced from IGDB and PCGamingWiki
- Detailed Game Pages: View comprehensive game information including:
- Cover art and screenshots
- Supported platforms
- Release date and developer information
- Genre and tags
- Accessibility features with user-submitted ratings
- User-Driven Accessibility Feedback:
- Submit detailed reports on game accessibility features
- Rate the effectiveness of existing accessibility options
- Provide comments and tips for other users
- Accessibility Information: Track features such as:
- Closed captions and subtitle options
- Colorblind modes and visual assistance settings
- Full controller support and button remapping capabilities
- Accessibility Scoring System: Aggregate user feedback to provide overall accessibility scores for games
- Responsive Design: Mobile-friendly interface using Tailwind CSS, accessible across all devices
- RESTful API: Well-structured API endpoints for seamless frontend-backend communication
- JWT Authentication: Secure, token-based authentication system for protected routes
- AI Content Moderation: Automated moderation of user submissions to ensure quality and safety
- Docker Support: Complete containerization for easy deployment and development
- Database Migrations: Version-controlled schema management
- WCAG Compliance: Platform itself follows accessibility best practices
- Nuxt 3 - Vue.js framework with SSR for improved SEO
- Vue.js 3 - Progressive JavaScript framework
- Tailwind CSS 4 - Utility-first CSS framework
- ShadCN Vue - Accessible UI component library built on Radix Vue
- Vee Validate - Form validation with Yup/Zod schemas
- Embla Carousel - Accessible carousel component
- Lucide Vue - Icon library
- Pinia - State management for Vue
- Go 1.23 - High-performance programming language
- Chi Router - Lightweight and flexible HTTP router
- PostgreSQL 16 - Robust relational database
- JWT Auth - Secure authentication with go-chi/jwtauth
- Bcrypt - Password hashing
- IGDB API - Comprehensive video game database
- PCGamingWiki API - PC game accessibility information
- Docker & Docker Compose - Containerization and orchestration
- GitHub Actions - CI/CD pipeline
playability/
├── frontend/ # Nuxt 3 frontend application
│ ├── components/ # Vue components (including ShadCN UI)
│ ├── pages/ # Nuxt pages (routes)
│ ├── server/ # Server API routes
│ └── types/ # TypeScript definitions
├── backend/ # Go REST API
│ ├── auth/ # JWT & password hashing
│ ├── cmd/api/ # Application entry point
│ ├── db/ # Database layer
│ ├── handlers/ # HTTP request handlers
│ ├── pkg/ # Utilities (AI, calc, fetch)
│ └── types/ # Go type definitions
├── database/ # Database schema & scripts
│ ├── migrations/ # Database migrations
│ └── scripts/ # Backup, restore, init scripts
├── docker-compose.yml # Development environment
└── Makefile # Development commands
- Docker and Docker Compose installed
- API keys for IGDB API and AI moderation service
-
Clone the repository:
git clone <repository-url> cd playability
-
Create environment file:
cp .env.example .env
-
Generate JWT secret:
openssl rand -base64 32
-
Edit
.envwith your credentials:# Required values: DB_PASSWORD=your_secure_password JWT_SECRET=<paste generated secret> IGDB_ACCESS_TOKEN=your_igdb_token IGDB_CLIENT_SECRET=your_igdb_secret # Match DB_PASSWORD with POSTGRES_PASSWORD POSTGRES_PASSWORD=your_secure_password
-
Start the application:
docker-compose up -d
-
Access the application:
- Frontend: http://localhost:3000
- Backend API: http://localhost:8080
- Database: localhost:5432
The database initializes automatically on first run.
# Start all services
docker-compose up -d
# View all logs
docker-compose logs -f
# View specific service logs
docker-compose logs -f backend
docker-compose logs -f frontend
# Stop all services
docker-compose down
# Restart all services
docker-compose restart
# View running containers
docker-compose ps
# Rebuild specific service
docker-compose up -d --build backend
# Stop and remove everything (including data)
docker-compose down -v# Open PostgreSQL shell
docker-compose exec postgres psql -U playability_user -d playability
# Create database backup
docker-compose --profile backup run --rm db-backup
# Run migrations
docker-compose run --rm db-migrate /migrate.sh up
# Check migration status
docker-compose run --rm db-migrate /migrate.sh status
# Rollback migration
docker-compose run --rm db-migrate /migrate.sh downcd frontend
# Development server
pnpm dev
# Production build
pnpm build
# Preview production build
pnpm preview
# Lint code
pnpm lint
# Type checking
pnpm typecheckcd backend
# Run development server
go run cmd/api/main.go
# Build binary
go build cmd/api/main.go
# Run tests
go test ./...
# Run tests with coverage
go test -cover ./...The database uses PostgreSQL with three main tables:
users- User accounts and authenticationgames- Game information with accessibility featuresreports- User-submitted accessibility reports
Custom types:
feature_support- ENUM:'false','unknown','limited','true'
# Create new migration
./database/scripts/migrate.sh create migration_name
# Apply migrations
docker-compose run --rm db-migrate /migrate.sh up
# Check status
docker-compose run --rm db-migrate /migrate.sh status
# Rollback last migration
docker-compose run --rm db-migrate /migrate.sh down# Create backup
docker-compose --profile backup run --rm db-backup
# Backups are saved to ./backups/ directory
# Restore from backup
./database/scripts/restore.sh backups/playability_full_YYYYMMDD_HHMMSS.dump.gzGET /search- Search gamesGET /games?id={id}- Get game detailsGET /featured- Get featured gamesGET /reports/cards/{game}- Get report cards for gameGET /reports/features/{game}- Get feature statisticsGET /reports/score/{game}- Get accessibility score
POST /user/login- User authenticationPOST /user/register- User registrationGET /user/{id}- Get user profile
POST /user/report- Submit accessibility report
- JWT Authentication with HS256 signing and 24-hour expiration
- Bcrypt Password Hashing with default cost factor (10)
- AI Content Moderation for all user-submitted reports
- Parameterized SQL Queries for injection protection
- CORS Configuration with environment-based origins
- HTTP-Only Cookies for secure token storage
cd frontend
pnpm test # Run tests
pnpm lint # Lint code
pnpm typecheck # Type checkingcd backend
go test ./... # Run all tests
go test -v ./db/ # Test database layer
go test -cover ./handlers/ # Test with coverageWe welcome contributions! Here's how to get started:
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Make your changes
- Run tests and linting
- Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
- Frontend: Follow Vue.js and Nuxt best practices
- Backend: Follow Go conventions and use dependency injection
- Database: Always create migrations for schema changes
- Testing: Write tests for new features
- Documentation: Keep code well-documented
- Enhanced search with filters and sorting
- User profiles and contribution tracking
- Game recommendations based on accessibility needs
- Community forums and discussions
- Mobile native apps (iOS/Android)
- API documentation with Swagger/OpenAPI
- Advanced analytics and reporting
- Email notifications for game updates
- Multi-language support
- Accessibility audit tools for developers
This project is licensed under the MIT License - see the LICENSE file for details.
- IGDB for providing comprehensive game data
- PCGamingWiki for accessibility information
- ShadCN for the UI component library
- The gaming accessibility community for inspiring this project
- Live Site: playablty.com
- Issues: Please use the GitHub issue tracker
- Discussions: Use GitHub Discussions for questions and ideas
Made with care for accessible gaming