A modern, full-stack game tracking and discovery platform inspired by MyAnimeList, built with Next.js 15, Supabase, and the IGDB Games API. Track your gaming journey, discover new titles, and manage your personal game collection with style.
- Secure Google OAuth integration via Supabase Auth
- User profiles with customizable usernames
- Protected routes with middleware-based authentication
- Seamless login/logout experience
- Powered by IGDB's comprehensive games database (200,000+ games)
- Advanced search with real-time results
- Filter by platform, sort by relevance, rating, or release date
- Detailed game pages with screenshots, metadata, and store links
- Trending games and new releases sections
- Game Status Tracking: Playing, Finished, Want to Play, On-Hold, Dropped
- Rating System: 10-point scale with visual indicators
- Multiple Views: Grid and list layouts for your collection
- Smart Organization: Games automatically grouped by status
- Quick Actions: Add, edit, or remove games from your list
- Responsive Design: Optimized for desktop, tablet, and mobile
- Dark Theme: Elegant slate-based color scheme
- Smooth Animations: Polished interactions and transitions
- Loading States: Skeleton screens and progress indicators
- Error Handling: Graceful fallbacks and user-friendly error messages
- Intelligent Caching: 7-day cache system for API responses
- Server-Side Rendering: Fast initial page loads
- Image Optimization: Next.js automatic image optimization
- Database Optimization: Efficient queries with proper indexing
Frontend:
- Next.js 15 - React framework with App Router
- TypeScript - Type-safe development
- Tailwind CSS - Utility-first styling
- Radix UI - Accessible component primitives
- Lucide React - Beautiful icons
Backend:
- Supabase - PostgreSQL database and authentication
- IGDB Games API - Comprehensive games database
- Server Actions - Type-safe server-side operations
Deployment:
- Vercel - Optimized for Next.js applications
- Edge Functions - Fast, globally distributed API routes
- Node.js 18+ and npm
- A Supabase account
- IGDB API credentials (Twitch Developer account required, free)
- A Google OAuth app for authentication
git clone <your-repo-url>
cd spudin-game-list
npm install
Create a .env.local
file in the root directory:
# Supabase Configuration
NEXT_PUBLIC_SUPABASE_URL=your-supabase-project-url
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-supabase-anon-key
SUPABASE_SERVICE_ROLE_KEY=your-supabase-service-role-key
# IGDB Games API (server-side only)
IGDB_CLIENT_ID=your-igdb-client-id
IGDB_CLIENT_SECRET=your-igdb-client-secret
# Optional: Custom site URL for production
NEXT_PUBLIC_SITE_URL=https://your-domain.com
- Create a new project at supabase.com
- Go to Settings → API and copy:
- Project URL →
NEXT_PUBLIC_SUPABASE_URL
anon
key →NEXT_PUBLIC_SUPABASE_ANON_KEY
service_role
key →SUPABASE_SERVICE_ROLE_KEY
- Project URL →
- Go to Authentication → Providers in your Supabase dashboard
- Enable Google provider and configure with your Google OAuth credentials
- Add your domain to the authorized redirect URIs
Run the following SQL migrations in your Supabase SQL Editor:
User Profiles:
-- Add username column to profiles
DO $$
BEGIN
IF NOT EXISTS (
SELECT FROM information_schema.columns
WHERE table_schema = 'public'
AND table_name = 'profiles'
AND column_name = 'username'
) THEN
ALTER TABLE public.profiles ADD COLUMN username text;
ALTER TABLE public.profiles ADD CONSTRAINT profiles_username_key UNIQUE (username);
END IF;
END $$;
-- Update existing profiles with username from email
UPDATE public.profiles
SET username = replace(split_part(email, '@', 1), '.', '_')
WHERE username IS NULL;
ALTER TABLE public.profiles ALTER COLUMN username SET NOT NULL;
Game Cache System:
npm run setup-cache
Or manually run the SQL from sql/game_cache.sql
- Create a Twitch Developer account at dev.twitch.tv
- Register a new application in the Twitch Developer Console
- Copy your Client ID and Client Secret
- Add them as
IGDB_CLIENT_ID
andIGDB_CLIENT_SECRET
in your.env.local
Note: IGDB uses Twitch's authentication system. The Client ID and Secret are used to obtain OAuth tokens automatically.
npm run dev
Visit http://localhost:3000 to see your application!
- Hero section with featured games
- New releases showcase
- Call-to-action for registration
- Advanced search interface
- Platform and sort filters
- Real-time search results
- Personal game collection
- Tabbed interface by status
- Grid/list view toggle
- Quick edit functionality
- Comprehensive game information
- Screenshots gallery
- Add to collection dialog
- External store links
- Public user profiles
- Game statistics
- Recent activity
-- Core tables
profiles (id, username, email, full_name, avatar_url)
games (id, name, background_image, released, rating)
game_lists (user_id, game_id, status, rating, updated_at)
game_cache (cache_key, data, cache_type, last_updated)
/api/games/search
- Game search functionality/api/games/[id]
- Individual game details/api/games/trending
- Popular games/api/games/new-releases
- Recent releases with good ratings
- Search Results: 1 hour cache
- Game Details: 24 hour cache
- Trending/New Releases: 1 hour cache
- Automatic Expiry: 7-day TTL for all cached data
npm run dev # Start development server
npm run build # Build for production
npm run start # Start production server
npm run lint # Run ESLint
npm run setup-cache # Initialize database cache tables
- Connect your GitHub repository to Vercel
- Add environment variables in Vercel dashboard
- Deploy automatically on push to main branch
NEXT_PUBLIC_SUPABASE_URL=your-production-supabase-url
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-production-anon-key
SUPABASE_SERVICE_ROLE_KEY=your-production-service-key
IGDB_CLIENT_ID=your-igdb-client-id
IGDB_CLIENT_SECRET=your-igdb-client-secret
NEXT_PUBLIC_SITE_URL=https://your-domain.com
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature
) - Commit your changes (
git commit -m 'Add amazing feature'
) - Push to the branch (
git push origin feature/amazing-feature
) - Open a Pull Request
Cache not populating:
- Verify
SUPABASE_SERVICE_ROLE_KEY
is set correctly - Check server logs for
[CACHE]
error messages - Run
npm run setup-cache
to reinitialize cache tables
Authentication issues:
- Ensure Google OAuth is properly configured in Supabase
- Check that redirect URLs match your domain
- Verify environment variables are set correctly
API rate limits:
- IGDB API has rate limits (4 requests per second)
- Consider upgrading for production use
- Cached responses help reduce API calls
- ✅ Core Features: Authentication, game search, personal lists
- ✅ Game Management: Status tracking, ratings, collection views
- ✅ Modern UI: Responsive design, dark theme, smooth interactions
- ✅ Performance: Caching system, optimized queries, SSR
- 🚧 Future Features: Social features, reviews, recommendations
- Social Features: Follow users, activity feeds
- Reviews System: Write and read game reviews
- Recommendations: AI-powered game suggestions
- Statistics: Advanced analytics and insights
- Mobile App: React Native companion app
- Import/Export: Backup and migrate game lists
This project is licensed under the MIT License. See the LICENSE file for details.
- IGDB.com - Comprehensive games database API
- Supabase - Backend-as-a-Service platform
- Vercel - Deployment and hosting platform
- Next.js - React framework
- Tailwind CSS - Utility-first CSS framework
Built with ❤️ by danishayman
Transform your gaming experience with Spudin Game List - where every game tells a story.