2026-01-30 19:37:21 -05:00
2026-01-30 16:29:48 -05:00
2026-01-30 18:08:26 -05:00
2026-01-30 19:37:21 -05:00
2026-01-29 00:24:10 -05:00
2026-01-28 23:52:15 -05:00
2026-01-30 18:12:02 -05:00
2026-01-29 00:24:10 -05:00
2026-01-29 00:40:29 -05:00
2026-01-30 18:12:02 -05:00
2026-01-29 00:24:10 -05:00
2026-01-29 00:24:10 -05:00
2026-01-29 00:24:10 -05:00

What's The Point

A web app for tracking predictions and points in TV/movie challenges with friends.

Features

  • 🔐 Register/login with email and password (JWT authentication)
  • 🎬 Create challenges for shows/movies with TMDB integration
  • 📝 Make and validate predictions with friends
  • 🏆 Leaderboards (per-challenge and global)
  • 👥 Friend system for easy invitations
  • 📱 Mobile-first, modern dark UI

Tech Stack

  • Frontend: React 18, React Router, Vite
  • Backend: Node.js, Express
  • Database: MariaDB
  • Auth: JWT with bcrypt
  • APIs: The Movie Database (TMDB) with caching
  • Deployment: Docker, self-hosted via Gitea + Portainer

Getting Started

Prerequisites

Local Development

  1. Copy environment file:

    cp backend/.env.example backend/.env
    
  2. Add your TMDB API key to backend/.env:

    TMDB_API_KEY=your_actual_key_here
    
  3. Build and start all services:

    docker compose up --build
    
  4. Access the app:

The database will auto-initialize with the required schema on first run.

Production Deployment

  1. Update prod-compose.yml with your environment variables:

    • Set a strong JWT_SECRET
    • Set a strong DB_PASSWORD
    • Add your TMDB_API_KEY
  2. The Gitea workflow (.gitea/workflows/rebuild-prod.yaml) will:

    • Build the Docker image
    • Push to your registry
    • Deploy via Portainer API
  3. Environment variables for Gitea secrets:

    • PROD_ENV: Base64-encoded .env file with production values
    • PORTAINER_TOKEN: Your Portainer API token

How It Works

User Flow

  1. Register/Login - Create an account or sign in
  2. Create Challenge - Search for a TV show or movie via TMDB
  3. Invite Friends - Add participants by username/email
  4. Make Predictions - Submit your predictions about the show
  5. Validate Predictions - Approve or invalidate others' predictions (not your own)
  6. Track Points - View leaderboards and profiles

Key Features

  • TMDB Integration: Search shows/movies with autocomplete, cached for 7 days
  • Friend System: Dedicated friends page + auto-friends from challenge participation
  • Leaderboards: Per-challenge and global rankings
  • Profile Stats: Total points, pending predictions, challenges created/joined
  • Responsive Design: Mobile-first with dark theme

API Endpoints

Auth

  • POST /api/auth/register - Register new user
  • POST /api/auth/login - Login user
  • GET /api/auth/me - Get current user

Challenges

  • GET /api/challenges - List user's challenges
  • GET /api/challenges/:id - Get challenge details
  • POST /api/challenges - Create new challenge
  • POST /api/challenges/:id/invite - Invite users
  • POST /api/challenges/:id/respond - Accept/reject invitation

Predictions

  • GET /api/predictions/challenge/:id - List predictions
  • POST /api/predictions - Create prediction
  • POST /api/predictions/:id/validate - Validate/invalidate

Friends

  • GET /api/friends - List friends
  • GET /api/friends/search - Search users
  • POST /api/friends/request - Send friend request
  • POST /api/friends/respond - Accept/reject request
  • GET /api/friends/requests - Pending requests

Leaderboard

  • GET /api/leaderboard/challenge/:id - Challenge leaderboard
  • GET /api/leaderboard/global - Global leaderboard
  • GET /api/leaderboard/profile/:id? - User profile stats

TMDB

  • GET /api/tmdb/search?q=query - Search shows/movies

Database Schema

  • users - User accounts
  • challenges - TV/movie challenges
  • challenge_participants - Challenge memberships
  • predictions - User predictions
  • friendships - Friend relationships
  • tmdb_cache - Cached TMDB API responses

License

MIT

Description
Silly game to keep track of scores when predicting events of movies, tv shows or anything else you can think of.
Readme 350 KiB
Languages
JavaScript 95.2%
CSS 4.2%
Dockerfile 0.4%
HTML 0.2%