A modern Arabic podcast search application that provides a comprehensive platform for discovering podcasts and episodes. Built as a full-stack solution with a responsive frontend and scalable backend architecture.
🌐 Live Demo: https://podbay.bargush.me
Podbay clone is a podcast discovery platform built as a job application assignment during hiring proces, featuring real-time search capabilities, responsive design, and a clean, modern interface. The application allows users to search for podcasts and episodes, with results stored locally for optimal performance.
The project consists of two main components:
- Modern React-based web application
- Real-time search with debouncing
- Responsive Arabic-first design with RTL support
- Interactive UI with smooth animations
- Multiple view modes (grid/list)
- RESTful API service
- Multi-vendor podcast data integration
- PostgreSQL database for data persistence
- Scalable and modular architecture
- Comprehensive testing coverage
- Real-time Search: Debounced search with 500ms delay for optimal performance
- Multi-Vendor Support: Integration with iTunes Search API (extensible to other vendors)
- Data Persistence: Local storage of search results to reduce API calls
- URL Persistence: Search terms persist in browser URL
- Arabic Support: Full Arabic language support with RTL layout
- Responsive Design: Mobile-first approach with adaptive layouts
- Interactive UI: Smooth animations powered by Framer Motion
- Multiple View Modes: Grid and list layouts for episodes
- Carousel Display: Swipeable podcast cards with navigation controls
- Loading States: Custom loading animations and empty states
- Next.js 15: Latest framework with improved performance
- Turbopack: Fast development builds
- Code Splitting: Automatic route-based splitting
- Image Optimization: Lazy loading and optimized images
- Debounced Search: Reduced unnecessary API calls
- Framework: Next.js 15.3.4 with App Router
- React: React 19 with React DOM 19
- Styling: Tailwind CSS 4 with custom design tokens
- Animations: Framer Motion 12.18.1
- Icons: HackerNoon Pixel Icon Library
- HTTP Client: Axios 1.10.0
- Date Handling: Day.js with Arabic locale
- Carousel: Swiper.js 11.2.8
- Framework: NestJS (TypeScript)
- Database: PostgreSQL
- ORM: TypeORM
- Validation: class-validator and class-transformer
- HTTP Client: Axios
- Testing: Jest
podbay/
├── frontend/
│ ├── src/
│ │ ├── api/ # Axios configuration
│ │ ├── app/ # Next.js app router pages
│ │ ├── components/ # Reusable UI components
│ │ ├── hooks/ # Custom React hooks
│ │ ├── lib/ # Utility libraries
│ │ └── types/ # TypeScript definitions
│ └── package.json
└── backend/
├── src/
│ ├── artist/ # Artist entities and services
│ ├── episode/ # Episode entities and services
│ ├── podcast/ # Podcast entities and services
│ ├── search/ # Search functionality
│ ├── vendor/ # External API integrations
│ └── migrations/ # Database migrations
└── package.json
- Node.js 18+
- PostgreSQL database
- npm or yarn
API_URL=http://localhost:3001PORT=3001
DB_HOST=localhost
DB_PORT=5432
DB_USERNAME=postgres
DB_PASSWORD=postgres
DB_DATABASE=podbay
NODE_ENV=devcd backend
npm install
npm run start:devcd frontend
npm install
npm run devThe application will be available at:
- Frontend:
http://localhost:3000 - Backend API:
http://localhost:3001
GET /search?term={searchTerm}
Response:
{
"podcasts": [
{
"id": "string",
"name": "string",
"artworkUrl": "string",
"artist": {
"name": "string",
"link": "string"
}
}
],
"episodes": [
{
"id": "string",
"name": "string",
"description": "string",
"durationMillis": "number",
"releaseDate": "string",
"podcasts": {
"name": "string",
"link": "string"
}
}
]
}cd backend
npm run test # Run all testscd frontend
npm run lint # Run ESLintThe application is deployed and can be accessed at: https://podbay.bargush.me/
npm run build
npm run start:prodnpm run build
npm run startThis project is licensed under the MIT License.
Contributions are welcome! Feel free to open issues, suggest features, or submit pull requests to help improve the project.
Built with ❤️ and backpain.
