WatchHive is a full-stack application designed to solve the age-old problem of groups struggling to pick a movie to watch together. With a sophisticated voting engine, real-time updates, and comprehensive group management features, WatchHive transforms chaotic group debates into a fair, transparent, and efficient decision-making process.
Groups face several challenges when planning movie nights:
WatchHive eliminates these pain points with a structured, democratic approach that respects everyone's preferences while ensuring a decision gets made.
The voting system ensures fair movie selection:
| Vote Type | Value | Impact |
|---|---|---|
| Upvote | +1 | Increases movie's chances |
| Downvote | -1 | Decreases movie's chances |
| Veto | Instant Disqualification | Removes movie from consideration entirely |
Key Voting Rules:
When multiple movies have the same score, tie-breakers are applied in this order:
Score = (Upvotes × 1) + (Downvotes × -1)
Group Creation & Membership:
Admin Powers:
Event-Scoped Chat:
Live Notifications:
Complete JWT Authentication Flow:
graph LR
A[Admin Creates Event] --> B[Members Add Suggestions]
B --> C[Voting Period]
C --> D[Admin Computes Results]
D --> E[Movie Selected & Event Locked]
E --> F[Group Watches Together]
| Technology | Purpose |
|---|---|
| Svelte | Reactive UI framework |
| Svelte-Shadcn | UI Component Library |
| TypeScript | Type-safe development |
| TanStack Query | Server state management & caching |
| Tailwind CSS | Utility-first styling |
| SignalR Client | Real-time WebSocket connections |
| Technology | Purpose |
|---|---|
| ASP.NET Core | REST API framework |
| Entity Framework Core | ORM for database operations |
| PostgreSQL | Relational database |
| SignalR | Real-time bidirectional communication |
| JWT Bearer | Authentication middleware |
| Service | Usage |
|---|---|
| TMDB API | Movie metadata, ratings, and details |
git clone https://github.com/KOKUMUbooker/watchhive.git
cd watchhive
Some considerations
echo -n "<some-really-long-phrase>" | base64cp env.example .env
docker compose -f docker-compose-db.yaml up -d
dotnet restore
dotnet tool restore
# Create initial migration (NOTE: SKIP IF Migrations folder has files)
dotnet ef migrations add InitialCreate
# Apply to database
dotnet ef database update
# Will build the UI then copy its files into wwwroot so that the server will serve lates UI code
dotnet publish -c Release
# Run server as usual, and access the UI from the server endpoint
dotnet run
http://localhost:5167http://localhost:5173https://localhost:5167/scalarOR
# Development with hot reload
dotnet watch run
# Or standard run
dotnet run
The API will be available at:
http://localhost:5167https://localhost:5167/scalarwatch-hive/UI/src/api/urls.ts url variable to use localhost ie// ONLY IN DEV (If running backend and UI separately)
export const API_BASE_URL = 'http://localhost:5167';
// FOR PROD OR running app as a single unit - leave empty & let it use relative urls
// export const API_BASE_URL = "";
cd UI
npm install
npm run dev
http://localhost:5173dbReset.sh - For droping the database and applying the latest migration to the dbbuild-artifact.sh - For creating an artifact for deployment to monsterasp.net