- 🌐 Full-Stack Web Application - React frontend with Express backend
- 📦 ZIP Downloads - Automatically packages songs into downloadable archives
- 🔗 Shareable Links - Generate expiring links to share downloads (24h default)
- 📊 Real-time Progress - Live progress tracking in the web UI
- 🐳 Docker Ready - Complete docker-compose setup for easy deployment
- 🎵 CLI Tool - Command-line interface for power users
- 📋 Playlist Support - Download complete playlists or user profiles
- 🖼️ Cover Art - Optional cover image downloads
- 🏷️ Metadata Preservation - Song titles, playlist names preserved
# Clone and start everything
git clone https://github.com/jine/suno-downloader.git
cd suno-downloader
docker-compose up -d
# Access the app at http://localhostRequirements:
- Node.js 18+
- Redis (for job queue)
# Install dependencies
cd backend && npm install
cd ../frontend && npm install
# Start Redis
docker run -d -p 6379:6379 redis:alpine
# Terminal 1 - Start Backend
cd backend && npm run dev
# Terminal 2 - Start Frontend
cd frontend && npm run dev
# Access at http://localhost:5173┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ React │──────│ Express │──────│ Redis │
│ Frontend │ │ Backend │ │ (Queue) │
└──────────────┘ └──────┬───────┘ └──────────────┘
│
┌──────┴───────┐ ┌──────────────┐
│ Storage │──────│ S3 │
│ (ZIPs) │ │ (Optional) │
└──────────────┘ └──────────────┘
- Open the web app in your browser
- Paste a Suno playlist or profile URL
- Click "Download" and wait for processing
- Download the ZIP file or copy the shareable link
- Links expire after 24 hours (configurable)
- 8-character unique codes (e.g.,
a1b2c3d4) - Direct download via
/share/:code - Automatic cleanup of expired files
For command-line usage:
cd cli
npm install
npm run build
# Download a playlist
node dist/index.js "https://suno.com/playlist/abc123"
# Download with images
node dist/index.js "https://suno.com/@username" -iStart Download
POST /api/download
Content-Type: application/json
{
"url": "https://suno.com/playlist/abc123",
"options": {
"includeImages": false
}
}
# Response
{
"jobId": "uuid",
"status": "queued"
}Check Status
GET /api/download/:jobId/status
# Response
{
"jobId": "uuid",
"status": "processing",
"progress": {
"total": 24,
"completed": 12,
"failed": 0,
"currentSong": "Song Title"
}
}Download ZIP
GET /api/download/:jobId/download
# Returns ZIP fileShareable Link
GET /api/share/:shareCode
# Returns download info or redirects to download# Start all services
docker-compose up -d
# Services:
# - Frontend: http://localhost (nginx)
# - Backend API: http://localhost:3000
# - Redis: localhost:6379
# - Storage: ./storage (persistent volume)Create backend/.env:
# Server
PORT=3000
NODE_ENV=production
# Redis
REDIS_URL=redis://redis:6379
# Storage
STORAGE_TYPE=local
STORAGE_PATH=./storage
# Links
LINK_EXPIRY_HOURS=24
MAX_DOWNLOADS_PER_LINK=0
# Cleanup
CLEANUP_INTERVAL_MINUTES=60
MAX_FILE_AGE_HOURS=48suno-downloader/
├── backend/ # Express API
│ ├── src/
│ │ ├── routes/ # API endpoints
│ │ ├── services/ # Business logic
│ │ ├── queue/ # Bull job queue
│ │ └── utils/ # Storage & cleanup
│ └── Dockerfile
├── frontend/ # React app
│ ├── src/
│ └── Dockerfile
├── cli/ # CLI tool
│ └── src/
├── docker-compose.yml # Full stack deployment
└── README.md
| Variable | Default | Description |
|---|---|---|
PORT |
3000 | API server port |
REDIS_URL |
redis://localhost:6379 | Redis connection |
STORAGE_TYPE |
local | Storage backend (local/s3) |
LINK_EXPIRY_HOURS |
24 | Shareable link lifetime |
MAX_FILE_AGE_HOURS |
48 | Auto-cleanup threshold |
| Variable | Default | Description |
|---|---|---|
VITE_API_URL |
'' | Backend API URL |
cd backend
npm install
npm run dev # Development with hot reload
npm run build # Production build
npm start # Run production buildcd frontend
npm install
npm run dev # Vite dev server (port 5173)
npm run build # Production buildcd cli
npm install
npm run build
node dist/index.js <url>- URL Submission - User submits Suno URL via web UI or CLI
- Scraping - Backend fetches Suno page and extracts song IDs
- Queue - Download job added to Redis/Bull queue
- Processing - Worker downloads each song from Suno's CDN
- Archiving - Songs packaged into ZIP file
- Link Generation - Shareable link created with nanoid
- Download - User downloads ZIP or shares link
- Cleanup - Expired files automatically removed
- Playlists:
https://suno.com/playlist/* - Profiles:
https://suno.com/@username - Songs:
https://suno.com/song/*
- Backend: Express.js, TypeScript, Bull, Redis, Cheerio
- Frontend: React 19, Vite, TypeScript, React Query
- CLI: Commander.js, Chalk, Ora
- Infrastructure: Docker, Docker Compose
- Storage: Local filesystem or AWS S3
- Fork the repository
- Create feature branch:
git checkout -b feature/AmazingFeature - Commit changes:
git commit -m 'Add amazing feature' - Push to branch:
git push origin feature/AmazingFeature - Open a Pull Request
- URL validation (only suno.com domains)
- Rate limiting support
- File size limits
- Filename sanitization
- HTTPS only
- CORS configured
ISC License - see LICENSE
This tool is for educational purposes. Please respect Suno's Terms of Service and only download content you have permission to access.
Made with ❤️ by jine