A web application that allows users to search and explore movies using The Open Movie Database (OMDb) API. Users can search for movies and shows by title and year and view detailed information.
- 🔍 Search Movies & Shows: Search your favorite
- 🎬 Content Filtering: Filter by year and media type (movies/shows)
- 📱 Responsive Design: Seamless experience across all devices
- ⚡️ Performance: Redis caching for fast responses
- 📚 API Documentation: Swagger documentation
- React 18 with Vite
- TypeScript for type safety
- TailwindCSS for styling
- Framer Motion for animations
- NodeJS
- ExpressJS
- Swagger (OpenAPI documentation)
- Redis
- Node.js (v23.6.1)
- Docker
- OMDB API key
If you have nvm installed, run the following command to get the right node version, otherwise install the node version 23.6.1
Create an .env file in the root directory by running this script npm run setup:env.
Add your own API_KEY, which you can generate and obtain from the The Open Movie Database
nvm install
# Install backend dependencies
npm install
# add env keys to environment
npm run setup:envWith Docker, you can build the frontend application and run the backend application to start the app
# Running the application in development mode
npm run docker:serve
# For any changes in the react app(/movieDb-app)
cd movieDb-app
npm run buildThe API documentation is available at /docs endpoint when running the application. The backend provides two main endpoints:
GET /api/v1/search- Search movies with filtersGET /api/v1/movies/{id}- Get detailed information about a specific movie
# Integration test api's
npm run test
# E2E test
cd movieDb-app
npm run test:e2eThis application is containerized with Docker, combining both frontend and backend in a single container. The NodeJS/Express backend serves the static files built with ReactJS.
This made it easier to deploy to a managed service like GCP, Azure, AWS etc. I chose GCP because I started using it last year and the free tier was generous. Based on the amount of users and load, the number of instances can be increased if limits are hit. I started with a cold start (0 instances) to not drive cost.
I made a design based on mockup made by Arfi Moulana found on Dribbble
App Design
I would loved to add users and favourite list to it, but because of the time constraint. I decided to focus on making the app production ready and deploy it.

