CineScout is a modern, full-stack movie search and discovery web application built using React, Vite, Appwrite, and the OMDb API. It provides users with an intuitive interface to explore detailed movie information, search by title, discover trending content, and maintain a personal watchlistโall while showcasing modern React development practices and responsive design principles.
๐ Featured: Complete watchlist functionality with localStorage persistence!
๐ [https://cine-scout-full-stack-movie-search.vercel.app/]
- ๐ Intelligent Search: Real-time movie search with debounced input to prevent API overload
- ๐ Trending Movies: Dynamic trending section based on search frequency and user interactions
- ๐ญ Detailed Movie Information: Comprehensive movie metadata including actors, directors, ratings, awards, plot, and more
- โญ IMDB Integration: Real-time ratings and voting data from IMDB
- ๐๏ธ Rich Media Display: High-quality movie posters with fallback handling
- โ Add to Watchlist: One-click addition from movie cards or detail pages
- ๐พ Local Storage: Client-side persistence using browser localStorage (no backend required)
- ๐ฑ Responsive UI: Beautifully designed watchlist interface for all devices
- ๐๏ธ Easy Management: Remove movies with trash icon or toggle heart button
- ๐ Live Counter: Header badge showing current watchlist count
- ๐ Real-time Updates: Instant synchronization across all components
- ๐จ Modern Design: Built with Tailwind CSS for consistent, beautiful styling
- ๐ฑ Fully Responsive: Seamless experience across desktop, tablet, and mobile devices
- ๐ฆด Skeleton Loaders: Smooth loading states with Material UI skeleton components
- โก Fast Navigation: React Router DOM v7 for instant page transitions
- ๐ Optimistic Updates: Immediate UI feedback for better user experience
- ๐ซ Error Handling: Comprehensive error states and fallback UI
- โ๏ธ Modern React: Built with React 19+ using hooks and functional components
- ๐ State Management: TanStack Query for server state and custom hooks for local state
- ๐ฆ Code Splitting: Lazy loading for optimal bundle size
- ๐ฏ TypeScript Ready: ESLint configuration for type safety
- ๐ง Build Optimization: Vite for lightning-fast development and builds
- React 19.1.0: Modern hooks-based architecture
- Vite 7.0.3: Next-generation frontend build tool
- React Router DOM 7.7.0: Declarative routing for React
- Tailwind CSS 4.1.11: Utility-first CSS framework
- Material UI 7.2.0: React components implementing Google's Material Design
- Lucide React 0.528.0: Beautiful & consistent icons
- TanStack Query 5.83.0: Powerful data synchronization for React
- React Use 17.6.0: Collection of essential React hooks
- Appwrite 18.1.1: Backend-as-a-Service for database and search analytics
- OMDb API: The Open Movie Database for comprehensive movie data
- Axios 1.11.0: Promise-based HTTP client for API requests
- ESLint 9.30.1: Code linting and quality assurance
- React Error Boundary 6.0.0: Error handling and recovery
This project showcases advanced React development patterns:
- โ
Custom Hooks: Reusable stateful logic with
useDebounceand watchlist hooks - โ
State Management:
useState,useEffect,useReffor component state and side effects - โ
Routing:
useNavigate,useParamsfor dynamic routing and navigation - โ Data Fetching: TanStack Query for caching, background updates, and error handling
- โ Conditional Rendering: Dynamic UI based on loading, error, and data states
- โ Component Composition: Reusable, composable component architecture
- โ Event Handling: Custom events for cross-component communication
- โ Performance Optimization: Lazy loading, memoization, and debouncing
- โ Error Boundaries: Graceful error handling and recovery
- โ Responsive Design: Mobile-first design principles
movie-app/
โโโ public/
โ โโโ loco.png # App favicon
โโโ src/
โ โโโ assets/ # Static assets
โ โ โโโ hero-bg.png # Background images
โ โ โโโ hero.png # Hero section image
โ โ โโโ logo.png # App logo
โ โ โโโ no-movie.png # Fallback movie poster
โ โ โโโ search.svg # Search icon
โ โ โโโ star.svg # Rating star icon
โ โโโ components/ # Reusable UI components
โ โ โโโ Header.jsx # Navigation header with watchlist
โ โ โโโ Layout.jsx # Main layout wrapper
โ โ โโโ MovieCard.jsx # Movie card with watchlist button
โ โ โโโ MovieDetails.jsx # Detailed movie view
โ โ โโโ Search.jsx # Search input component
โ โ โโโ Spinner.jsx # Loading spinner
โ โ โโโ Watchlist.jsx # Watchlist page component
โ โโโ skeltonsUI/ # Loading skeleton components
โ โ โโโ MovieCardSkeleton.jsx # Movie card loading state
โ โ โโโ MovieDetailsSkeleton.jsx # Movie details loading state
โ โ โโโ MovieListSkeleton.jsx # Movie list loading state
โ โ โโโ TrendingListSkeleton.jsx # Trending section loading state
โ โ โโโ TrendingMovieSkeleton.jsx # Individual trending movie loading
โ โโโ utils/ # Utility functions
โ โ โโโ watchlist.js # localStorage watchlist operations
โ โโโ App.jsx # Main application component
โ โโโ appwrite.js # Appwrite configuration and API calls
โ โโโ index.css # Global styles and Tailwind configuration
โ โโโ main.jsx # Application entry point
โโโ .env.example # Environment variables template
โโโ package.json # Dependencies and scripts
โโโ vite.config.js # Vite configuration
โโโ README.md # This file
- Node.js (v18 or higher)
- npm or yarn
- OMDb API Key (free from omdbapi.com)
- Appwrite Account (for trending features - optional)
-
Clone the repository
git clone https://github.com/jsanjaikumar/CineScout---Full-Stack-Movie-Search-App.git cd CineScout---Full-Stack-Movie-Search-App -
Install dependencies
npm install
-
Environment Setup
cp .env.example .env
Update the
.envfile with your API keys:# OMDb API (Required) VITE_OMDB_API_KEY=your_omdb_api_key # Appwrite Configuration (Optional - for trending features) VITE_APPWRITE_PROJECT_ID=your_project_id VITE_APPWRITE_DATABASE_ID=your_database_id VITE_APPWRITE_COLLECTION_ID=your_search_collection_id # Note: Watchlist data is stored locally in browser localStorage # No additional database configuration needed for watchlist feature
-
Start the development server
npm run dev
-
Open your browser Navigate to
http://localhost:5173
npm run build
npm run preview- Real-time Search: Debounced input with 500ms delay to optimize API calls
- Fallback Handling: Graceful handling of API errors and missing data
- Search Analytics: Appwrite integration tracks popular searches for trending algorithm
The watchlist system is built with localStorage for instant performance:
// Core watchlist operations
addToWatchlist(movie); // Add movie to localStorage
removeFromWatchlist(imdbID); // Remove movie by ID
getWatchlist(); // Get all watchlist movies
isInWatchlist(imdbID); // Check if movie exists
getWatchlistCount(); // Get total count
clearWatchlist(); // Remove all moviesEach watchlist item contains:
{
imdbID: "tt1234567",
title: "Movie Title",
poster: "poster_url",
year: "2023",
type: "movie",
imdbRating: 8.5,
language: "English",
addedAt: "2023-12-01T10:00:00.000Z"
}- Custom event system using
window.dispatchEvent() - Real-time updates across Header, MovieCard, and Watchlist components
- No external state management library required
- Tracks search frequency using Appwrite database
- Updates movie popularity based on user interactions
- Displays top 5 most searched movies
- Includes movie posters and direct links to details
- Mobile-first approach with Tailwind CSS
- Breakpoint strategy:
xs: < 480px (small mobile)sm: 640px+ (mobile)md: 768px+ (tablet)lg: 1024px+ (desktop)xl: 1280px+ (large desktop)
- โ Chrome (90+)
- โ Firefox (88+)
- โ Safari (14+)
- โ Edge (90+)
- โ Mobile Browsers (iOS Safari, Chrome Mobile)
- Supported by 99%+ of browsers
- ~5-10MB storage limit per domain
- Data persists across browser sessions
- Automatically handles storage quota exceeded errors
- Side-by-side layout for movie details and information
- Hover effects with smooth transitions
- Keyboard navigation support
- Large watchlist button with full text labels
- Touch-optimized buttons (minimum 44px touch targets)
- Swipe-friendly card layouts
- Stacked layouts for better readability
- Compressed text for space efficiency
- Hybrid layout combining desktop and mobile features
- Grid optimizations for optimal movie card display
- Adaptive text sizing for comfortable reading
The project uses Tailwind CSS v4 with custom theme configuration:
@theme {
--color-primary: #030014;
--color-light-100: #cecefb;
--color-light-200: #a8b5db;
--color-gray-100: #9ca4ab;
--color-dark-100: #0f0d23;
--font-dm-sans: DM Sans, sans-serif;
--background-image-hero-pattern: url("./assets/hero-bg.png");
}- OMDb API: Free tier allows 1000 requests per day
- Appwrite: Optional backend for analytics and trending features
- Rate limiting: Built-in request throttling and error handling
- Push your code to GitHub
- Import project to Vercel
- Add environment variables in Vercel dashboard
- Deploy automatically
- Build the project:
npm run build - Deploy the
distfolder to Netlify - Configure environment variables
- Set up continuous deployment
npm run build
# Deploy the 'dist' folder to your hosting provider- Search functionality with various movie titles
- Watchlist add/remove operations
- Responsive design across devices
- Error handling for network failures
- Loading states and skeleton UI
- Navigation between pages
- Browser refresh persistence (watchlist)
Contributions are welcome! Please follow these steps:
- Fork the repository
- Create a feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
- Follow React best practices and hooks patterns
- Use Tailwind CSS for styling consistency
- Ensure responsive design for all new features
- Add proper error handling and loading states
- Test across different browsers and devices
Watchlist not persisting
- Check if localStorage is enabled in browser
- Verify browser storage quota not exceeded
- Ensure JavaScript is enabled
Movies not loading
- Verify OMDb API key is correct
- Check network connectivity
- Confirm API rate limits not exceeded
Trending section empty
- Appwrite configuration may be missing
- Check environment variables
- Verify database permissions
Build errors
- Clear node_modules and reinstall dependencies
- Verify Node.js version compatibility
- Check for syntax errors in environment variables
- Lighthouse Score: 95+ (Performance, Accessibility, Best Practices)
- First Contentful Paint: < 1.5s
- Largest Contentful Paint: < 2.5s
- Bundle Size: < 500KB (gzipped)
- API Response Time: < 300ms (OMDb API)
- ๐ค AI-Powered Recommendations: Machine learning based movie suggestions
- ๐ฅ User Accounts: Profile management and cross-device sync
- ๐ Advanced Analytics: Detailed viewing history and preferences
- ๐ฌ Trailer Integration: Embedded movie trailers and clips
- ๐ฑ PWA Support: Offline functionality and mobile app features
- ๐ Advanced Filters: Genre, year, rating, and language filters
- ๐ Internationalization: Multi-language support
- ๐ค Social Sharing: Share watchlists and movie recommendations
- Export/Import watchlist functionality
- Movie rating and review system
- Watchlist categories and tags
- Movie availability on streaming platforms
- Custom movie lists and collections
This project is licensed under the MIT License - see the LICENSE file for details.
- OMDb API - Comprehensive movie database
- Appwrite - Backend-as-a-Service platform
- TanStack Query - Data synchronization library
- Material UI - React component library
- Tailwind CSS - Utility-first CSS framework
- Lucide React - Beautiful icon library
- Vite - Next generation frontend tooling
If you encounter any issues or have questions:
- Check the troubleshooting section above
- Search existing issues on GitHub
- Create a new issue with detailed description
- Join our community discussions
If this project helped you, please consider:
- โญ Starring the repository
- ๐ด Forking for your own projects
- ๐ข Sharing with the developer community
- ๐ฌ Providing feedback and suggestions
Built with โค๏ธ by Sanjai Kumar
Happy Movie Discovering! ๐ฌ