Initial MVP: full-stack music discovery app
Backend (FastAPI): - User auth with email/password and Spotify OAuth - Spotify playlist import with audio feature extraction - AI recommendation engine using Claude API with taste profiling - Save/bookmark recommendations - Rate limiting for free tier (10 recs/day, 1 playlist) - PostgreSQL models with Alembic migrations - Redis-ready configuration Frontend (React 19 + TypeScript + Vite + Tailwind): - Landing page, auth flows (email + Spotify OAuth) - Dashboard with stats and quick discover - Playlist management and import from Spotify - Discover page with custom query support - Recommendation cards with explanations and save toggle - Taste profile visualization - Responsive layout with mobile navigation - PWA-ready configuration Infrastructure: - Docker Compose with PostgreSQL, Redis, backend, frontend - Environment-based configuration
This commit is contained in:
35
backend/app/core/config.py
Normal file
35
backend/app/core/config.py
Normal file
@@ -0,0 +1,35 @@
|
||||
from pydantic_settings import BaseSettings
|
||||
|
||||
|
||||
class Settings(BaseSettings):
|
||||
APP_NAME: str = "Vynl"
|
||||
DEBUG: bool = False
|
||||
SECRET_KEY: str = "change-me-in-production"
|
||||
ACCESS_TOKEN_EXPIRE_MINUTES: int = 60 * 24 * 7 # 7 days
|
||||
|
||||
# Database
|
||||
DATABASE_URL: str = "postgresql+asyncpg://vynl:vynl@localhost:5432/vynl"
|
||||
DATABASE_URL_SYNC: str = "postgresql://vynl:vynl@localhost:5432/vynl"
|
||||
|
||||
# Redis
|
||||
REDIS_URL: str = "redis://localhost:6379/0"
|
||||
|
||||
# Spotify
|
||||
SPOTIFY_CLIENT_ID: str = ""
|
||||
SPOTIFY_CLIENT_SECRET: str = ""
|
||||
SPOTIFY_REDIRECT_URI: str = "http://localhost:5173/auth/spotify/callback"
|
||||
|
||||
# Claude API
|
||||
ANTHROPIC_API_KEY: str = ""
|
||||
|
||||
# Frontend
|
||||
FRONTEND_URL: str = "http://localhost:5173"
|
||||
|
||||
# Rate limits (free tier)
|
||||
FREE_DAILY_RECOMMENDATIONS: int = 10
|
||||
FREE_MAX_PLAYLISTS: int = 1
|
||||
|
||||
model_config = {"env_file": ".env", "extra": "ignore"}
|
||||
|
||||
|
||||
settings = Settings()
|
||||
Reference in New Issue
Block a user