MichaelandClaude Sonnet 4.6 e06f342c8e fix: lu badge persistence + remove ? + fix duplicate buttons
- 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>
2026-04-21 10:06:09 +02:00

🎙️ 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)
# 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 registration
  • POST /api/auth/login - User login
  • POST /api/auth/refresh - Refresh access token

Podcasts

  • GET /api/podcasts - Get user subscriptions
  • POST /api/podcasts/subscribe - Add subscription
  • DELETE /api/podcasts/:id/unsubscribe - Remove subscription
  • GET /api/podcasts/search - Search podcasts

Episodes

  • GET /api/episodes/latest - Latest episodes dashboard
  • GET /api/episodes/:id - Get episode details
  • GET /api/podcasts/:id/episodes - Podcast episodes

Progress

  • POST /api/progress - Save listening position
  • GET /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

  1. Create feature branch: git checkout -b feature/my-feature
  2. Make changes
  3. Test thoroughly
  4. Commit: git commit -m "feat: add my feature"
  5. Push: git push origin feature/my-feature

🔄 Environment Variables

See .env.example for all available options. Key ones:

  • NODE_ENV - development/production
  • MONGODB_URI - MongoDB connection string
  • REDIS_URL - Redis connection URL
  • JWT_SECRET - Secret for signing tokens
  • PODCAST_INDEX_API_KEY - API key for podcast search (optional)

📚 Resources

📄 License

MIT

👨‍💻 Author

Built with ❤️


Status: Under development - Phase 1 (Foundation) in progress

S
Description
No description provided
Readme
443 KiB
0 Stars 1 Watchers 0 Forks
Languages
TypeScript 57.8%
Rust 32.3%
CSS 6.8%
JavaScript 1.1%
Shell 0.7%
Other 1.3%