██████╗ ██╗ ██╗ ██████╗ ███╗ ██╗ ██████╗ ██╗ ██╗
██╔══██╗██║ ██║██╔═══██╗████╗ ██║██╔═══██╗╚██╗██╔╝
██████╔╝███████║██║ ██║██╔██╗ ██║██║ ██║ ╚███╔╝
██╔═══╝ ██╔══██║██║ ██║██║╚██╗██║██║ ██║ ██╔██╗
██║ ██║ ██║╚██████╔╝██║ ╚████║╚██████╔╝██╔╝ ██╗
╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚═╝
AI-powered Vinyl Collection Agent – Cataloguing, Valuation, and Documentation
Phonox is an intelligent assistant for vinyl record collectors. It helps you:
- 📸 Identify records by snapping photos or uploading images
- 💰 Get valuations using multiple data sources (Discogs, MusicBrainz)
- 🎵 Find Spotify links for listening to your collection
- 📝 Organize your collection with metadata, ratings, and notes
- 💬 Chat about records with an AI agent that remembers your collection
🖼️ See it in action → UI Gallery & feature walkthrough 📝 Blog → phonox-blog.web.app
Perfect for collectors managing large vinyl libraries or insuring valuable collections.
Before you start, make sure you have:
-
Docker & Docker Compose installed
- Windows/Mac
- Linux
- Verify: Run
docker --versionanddocker compose version
-
Git (to clone the repository)
-
API Keys (optional but recommended)
- Anthropic API Key (for Claude AI)
- Tavily API Key (for web search, optional – DuckDuckGo fallback is free)
git clone https://github.com/yourusername/phonox.git
cd phonox# Copy the environment template
cp .env.example .env
# Add your Anthropic API key
./phonox-cli configure --anthropic YOUR_ANTHROPIC_KEYGet your API key: console.anthropic.com
# Make executable and run (installs + starts everything)
chmod +x start-cli.sh
./start-cli.shThe start-cli.sh script will:
- ✅ Build Docker images
- ✅ Start all services (database, backend, frontend)
- ✅ Initialize the database
Done! Open your browser:
- Frontend (UI): http://localhost:5173
- API Docs: http://localhost:8000/docs
- Backend Health: http://localhost:8000/health
The .env file contains all configuration. Key variables:
| Variable | Required | Description |
|---|---|---|
ANTHROPIC_API_KEY |
✅ Yes | Claude AI API key from console.anthropic.com |
TAVILY_API_KEY |
Web search API key from tavily.com | |
DISCOGS_TOKEN |
Discogs personal access token – raises rate limit from 25 → 60 req/min | |
DATABASE_URL |
✅ Pre-configured | PostgreSQL connection (auto-configured for Docker) |
For all configuration options, see .env.example
- Click "Upload Image" on the home page
- Take a photo or upload an image of:
- The album cover (front or back)
- The barcode (if visible)
- The vinyl itself (for condition assessment)
- Phonox AI will:
- Scan for the barcode
- Search Discogs and MusicBrainz
- Extract album metadata automatically
- Review the results and save to your collection
- Visit "Register" to see all your vinyl records
- Edit any record to:
- Add notes or condition notes
- Add Spotify link
- Update valuation
- Rate the record
- Delete records from your collection
- Export your collection (future feature)
- Open the Chat panel on the right
- Ask questions about your collection:
- "What's my rarest record?"
- "Show me all records from the 80s"
- "What's the total value of my collection?"
- The agent remembers context from your collection
./phonox-cli start
# or
docker compose up -d./phonox-cli stop
# or
docker compose downdocker compose logs -f backend
docker compose logs -f frontend./phonox-cli status
# or
curl http://localhost:8000/healthFull CLI Reference:
# Install (build Docker images)
./phonox-cli install
# Install + start services
./phonox-cli install --up
# Configure API keys and models
./phonox-cli configure --anthropic YOUR_KEY --tavily YOUR_KEY
# Configure Anthropic models (for advanced users)
./phonox-cli configure --vision-model claude-sonnet-4-6
./phonox-cli configure --chat-model claude-haiku-4-5-20251001
# Start services
./phonox-cli start
# Stop services
./phonox-cli stop
# Backup your data
./phonox-cli backup
# Restore from backup (use timestamp from backup folder)
./phonox-cli restore 20260128_143000Run without arguments to launch interactive menu:
./phonox-cli
# Shows menu with all options above# Kill process using port 8000
lsof -i :8000 | grep LISTEN | awk '{print $2}' | xargs kill -9
# Or restart Docker
docker compose down
docker compose up -d# Reset database
docker compose down -v
docker compose up -d# Check upload folder permissions
ls -la data/uploads/
# Restart services
docker compose restart backend frontend# Verify .env file
cat .env
# Restart backend to reload keys
docker compose restart backend./phonox-cli backup
# Backups stored in: ./backups/ls -lh backups/./phonox-cli restore 20260128_143000docker compose exec db psql -U phonox -d phonox -c "
SELECT
schemaname,
sum(pg_total_relation_size(schemaname||'.'||tablename)) AS size
FROM pg_tables
GROUP BY schemaname
ORDER BY size DESC;"docker compose exec db psql -U phonox -d phonox -c "
SELECT id, title, artist, release_date, confidence, created_at
FROM vinyl_records
ORDER BY created_at DESC
LIMIT 10;"docker compose exec backend pytest tests/ -v# Unit tests
docker compose exec backend pytest tests/unit -v
# Integration tests
docker compose exec backend pytest tests/integration -v
# With coverage report
docker compose exec backend pytest tests/ --cov=backend --cov-report=html# Open coverage report
open htmlcov/index.html # macOS
xdg-open htmlcov/index.html # Linux
start htmlcov/index.html # Windows- What is Phonox? – Overview and features
- How to Use – Step-by-step user guide
- Troubleshooting – Common issues and fixes
- Tech Stack Guide – Architecture and technologies
- Requirements Spec – Complete feature list
- API Reference – Interactive Swagger UI (live)
- Contributing Guide – How to contribute code
- Agent Collaboration Instructions – Team workflow
- Deployment Guide – Production setup
phonox/
├── README.md
├── ARCHITECTURE.md
├── CHANGELOG.md
├── CONTRIBUTING.md
├── docker-compose.yml
├── Dockerfile.backend
├── Dockerfile.frontend
├── start-cli.sh
├── phonox-cli
│
├── .github/
│ └── agents/ (AI agent collaboration docs)
│
├── backend/
│ ├── main.py (FastAPI entry point)
│ ├── database.py (SQLAlchemy ORM)
│ ├── agent/
│ │ ├── graph.py (LangGraph workflow)
│ │ ├── vision.py (Claude vision extraction)
│ │ ├── websearch.py (Tavily + DuckDuckGo)
│ │ ├── metadata.py (Discogs + MusicBrainz lookup)
│ │ ├── metadata_enhancer.py
│ │ ├── barcode_utils.py
│ │ └── state.py (State models)
│ ├── api/
│ │ ├── routes.py (Identification + chat endpoints)
│ │ ├── register.py (Collection management endpoints)
│ │ └── models.py (Pydantic models)
│ └── tools/
│ └── web_tools.py
│
├── frontend/
│ └── src/
│ ├── App.tsx
│ ├── components/
│ │ ├── VinylCard.tsx
│ │ ├── VinylRegister.tsx
│ │ ├── ChatPanel.tsx
│ │ ├── ImageUpload.tsx
│ │ ├── UserManager.tsx
│ │ └── ...
│ ├── api/ (API client)
│ └── services/ (Register API client)
│
├── tests/ (unit, integration, api)
├── docs/ (MkDocs documentation)
├── scripts/ (backup, restore, CLI)
└── backups/ (local backups)
React PWA → FastAPI backend → LangGraph AI agent → PostgreSQL, with multi-source metadata enrichment (Discogs, MusicBrainz, Tavily/DuckDuckGo).
→ Full data flows, component diagrams, security and scaling notes: ARCHITECTURE.md
| Layer | Technology |
|---|---|
| Backend | Python 3.12, FastAPI, LangGraph, Pydantic v2, SQLAlchemy |
| Frontend | React 18, TypeScript, Vite, PWA |
| Database | PostgreSQL 16 |
| AI / Vision | Claude (Anthropic) — multimodal identification and chat |
| Web Search | Tavily + DuckDuckGo fallback |
| Metadata | Discogs API, MusicBrainz API, Spotify API |
| Infrastructure | Docker, Docker Compose |
See ARCHITECTURE.md for detailed component breakdown and data flows.
Q: I don't have an Anthropic API key. Can I still use Phonox?
A: No, Claude API is required. Get a free tier key at console.anthropic.com.
Q: Can I use Phonox without Docker?
A: Not recommended. Docker ensures all dependencies work correctly. If you must, install: Python 3.12, PostgreSQL 16, Node.js 20.
Q: How do I backup my vinyl collection?
A: Run ./phonox-cli backup weekly. Backups are stored in ./backups/.
Q: Can I run Phonox on my phone?
A: Yes! It's a Progressive Web App (PWA). Open http://localhost:5173 on your phone and tap "Install" or "Add to Home Screen".
Q: How do I import my existing vinyl spreadsheet?
A: Currently manual. We're working on CSV import (see roadmap). For now, use the UI to add records.
- 📖 Documentation: See links above
- 🐛 Report Issues: Open an issue on GitHub
- 💬 Discuss Features: Start a discussion
- 👥 Join Community: See CONTRIBUTING.md
See CHANGELOG.md for the full version history.
This project is licensed under the MIT License - see LICENSE file for details.
Contributions are welcome! Please see Contributing Guide for guidelines on how to get started, including:
- Setting up your development environment
- Git workflow and branching strategy
- Code style and commit message conventions
- Testing and validation procedures
- Issues & Feature Requests: GitHub Issues
- Documentation: See docs/ folder for detailed technical documentation
- Built with Claude AI for record identification and chat
- Uses Tavily for web search (with DuckDuckGo fallback)
- Data enrichment from MusicBrainz and Spotify API
- Powered by FastAPI, React, and LangGraph