mirror of
https://github.com/R0m1k3/podcastic.git
synced 2026-10-14 02:37:32 +02:00
e06f342c8ee70dab12ecb82982a24f58f2497321
- EpisodeCard: change 'Lu ?' → 'Marquer' so the toggle button no longer shows a confusing question mark next to completed episodes - Dashboard: fix episodes reappearing in 'Continuer l'écoute' after navigation. handleToggleRead now does an optimistic update on BOTH local state AND all TanStack Query cache pages (setQueriesData), so the 'lu' state survives page navigation without a server roundtrip. On error, cache is invalidated to revert to server truth. - Dashboard: 'Découvrir' button now links to /add (discover new podcasts) instead of /trending — was identical to 'Parcourir les tendances' button Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
🎙️ Podcastic
A modern, ultra-responsive multi-user podcast streaming application with an Apple TV-inspired design.
✨ Features
- Podcast Discovery & Management: Search, subscribe, and organize your favorite podcasts
- Stream Playback: Direct audio streaming without disk usage
- Dashboard: View latest episodes from all subscriptions
- User Accounts: Multi-user with JWT authentication
- Responsive Design: Mobile-first, works perfectly on all devices
- Ultra-Fast: Optimized with Redis caching and efficient database queries
- Docker Ready: Containerized for easy deployment
🛠️ Tech Stack
Frontend
- React 18 + TypeScript
- Vite (ultra-fast bundler)
- Tailwind CSS (styling with Apple TV aesthetic)
- React Router (navigation)
- TanStack Query (server state management)
Backend
- Node.js + Express.js
- MongoDB (flexible data storage)
- Redis (caching & performance)
- JWT (authentication)
- TypeScript
DevOps
- Docker & Docker Compose
- Alpine images for minimal size
🚀 Quick Start
Prerequisites
- Docker & Docker Compose (recommended)
- Node.js 20+ (for local development)
- MongoDB (local or Atlas)
- Redis (local or cloud)
Using Docker Compose (Recommended)
# Clone and enter directory
cd Podcastic
# Create .env file from template
cp .env.example .env
# Start all services
docker-compose up -d
# Frontend: http://localhost:3000
# Backend API: http://localhost:5000
# MongoDB: localhost:27017
# Redis: localhost:6379
Local Development
Backend
cd backend
npm install
npm run dev # Starts on port 5000
Frontend
cd frontend
npm install
npm run dev # Starts on port 3000
📁 Project Structure
Podcastic/
├── frontend/ # React + Vite application
│ ├── src/
│ │ ├── components/
│ │ ├── pages/
│ │ ├── hooks/
│ │ ├── services/
│ │ └── styles/
│ └── Dockerfile
│
├── backend/ # Express.js API
│ ├── src/
│ │ ├── routes/
│ │ ├── controllers/
│ │ ├── models/
│ │ ├── middleware/
│ │ ├── services/
│ │ └── config/
│ └── Dockerfile
│
├── docker-compose.yml
├── .env.example
└── README.md
🔑 Key Models
User
- Email, password, username, avatar
- Preferences (playback speed, theme, language)
Podcast
- Title, description, RSS URL, image
- Author, categories, language
- Episode count, last fetched timestamp
Episode
- Title, description, audio URL
- Publication date, duration
- Unique GUID per podcast
UserProgress
- Current position in episode (seconds)
- Completion status
- Saved episodes
- Listen history
📡 API Endpoints (To be implemented)
Authentication
POST /api/auth/register- User registrationPOST /api/auth/login- User loginPOST /api/auth/refresh- Refresh access token
Podcasts
GET /api/podcasts- Get user subscriptionsPOST /api/podcasts/subscribe- Add subscriptionDELETE /api/podcasts/:id/unsubscribe- Remove subscriptionGET /api/podcasts/search- Search podcasts
Episodes
GET /api/episodes/latest- Latest episodes dashboardGET /api/episodes/:id- Get episode detailsGET /api/podcasts/:id/episodes- Podcast episodes
Progress
POST /api/progress- Save listening positionGET /api/progress/:episodeId- Get saved position
🎨 Design System
Apple TV Style
- Light theme with subtle gradients
- Glassmorphism effects (backdrop blur)
- Rounded corners (lg/xl)
- Soft shadows for depth
- Generous spacing
Responsive Breakpoints
- Mobile: < 640px
- Tablet: 640px - 1024px
- Desktop: 1024px+
🔒 Security
- JWT tokens for stateless authentication
- Bcrypt password hashing
- CORS configured
- Input validation with Zod
- Environment variables for secrets
📊 Performance Targets
- Dashboard load: < 1s (on 4G)
- Stream start: < 2s
- Docker image: < 100MB total
- Startup time: < 5s
🐳 Docker Commands
# Start services
docker-compose up -d
# Stop services
docker-compose down
# View logs
docker-compose logs -f [service_name]
# Rebuild images
docker-compose build --no-cache
# Remove volumes (careful!)
docker-compose down -v
🧪 Testing
Coming soon...
📝 Development Workflow
- Create feature branch:
git checkout -b feature/my-feature - Make changes
- Test thoroughly
- Commit:
git commit -m "feat: add my feature" - Push:
git push origin feature/my-feature
🔄 Environment Variables
See .env.example for all available options. Key ones:
NODE_ENV- development/productionMONGODB_URI- MongoDB connection stringREDIS_URL- Redis connection URLJWT_SECRET- Secret for signing tokensPODCAST_INDEX_API_KEY- API key for podcast search (optional)
📚 Resources
📄 License
MIT
👨💻 Author
Built with ❤️
Status: Under development - Phase 1 (Foundation) in progress
Languages
TypeScript
57.8%
Rust
32.3%
CSS
6.8%
JavaScript
1.1%
Shell
0.7%
Other
1.3%