A self-hostable web application for managing watch collections with comprehensive tracking, analytics, and image sharing capabilities.
- Multiple Collections: Create and manage different watch "boxes" (SOTC, wish list, etc.)
- Detailed Watch Management: Track purchase dates, service schedules, valuations, specifications
- Image Management: Upload and manage multiple images per watch with carousel display
- Wear Tracking: Daily wear logging with "WIT" (Wearing It Today) functionality
- Analytics Dashboard: Comprehensive wear statistics and streak tracking
- Drag & Drop Organization: Reorder watches within customizable grid layouts
- Collection Sharing: Export collection grids as images for social media
- Mobile Optimized: Responsive design for all screen sizes
- Frontend: React 18 + TypeScript + Tailwind CSS + shadcn/ui
- Backend: Node.js + Express + TypeScript
- Database: SQLite with Drizzle ORM
- File Storage: Local filesystem for images
- Build Tools: Vite + ESBuild
- Docker and Docker Compose installed
- At least 1GB of available disk space
git clone <repository-url>
cd sotc-watch-collection
mkdir -p data/db data/uploads
docker-compose up -d
The application will be available at http://localhost:5000
Your data is stored in bind mounts:
./data/db/
- SQLite database file./data/uploads/
- Uploaded watch images
docker build -t sotc-watch-collection .
docker run -d \
--name sotc \
-p 5000:5000 \
-v $(pwd)/data/db:/app/data/db \
-v $(pwd)/data/uploads:/app/data/uploads \
-e NODE_ENV=production \
-e DATABASE_URL=file:/app/data/db/database.sqlite \
--restart unless-stopped \
sotc-watch-collection
- Node.js 20 or higher
- npm
npm install
npm run dev
Access the development server at http://localhost:5000
npm run build
npm start
Variable | Default | Description |
---|---|---|
NODE_ENV |
development |
Application environment |
DATABASE_URL |
file:./database.sqlite |
SQLite database path |
PORT |
5000 |
Application port |
For persistent data, mount these directories:
/app/data/db
- Database storage/app/data/uploads
- Image uploads
To backup your collection data:
# Backup database
cp data/db/database.sqlite backup-$(date +%Y%m%d).sqlite
# Backup images
tar -czf images-backup-$(date +%Y%m%d).tar.gz data/uploads/
docker-compose pull
docker-compose up -d
docker-compose logs -f sotc
The SQLite database is maintenance-free for most use cases. For optimal performance with large collections (1000+ watches), consider running:
docker-compose exec sotc sqlite3 /app/data/db/database.sqlite "VACUUM;"
- Check if port 5000 is already in use
- Verify data directories exist and have proper permissions
- Check logs with
docker-compose logs sotc
- Verify the uploads directory is properly mounted
- Check file permissions on the uploads directory
- Ensure the database directory is writable
- Check that DATABASE_URL environment variable is correct
- 512MB RAM
- 1GB storage
- Single CPU core
- 1GB RAM
- 5GB storage (for image storage)
- 2 CPU cores
- The application is designed for self-hosting in trusted environments
- No built-in authentication (use reverse proxy with auth if needed)
- Uploaded images are stored locally without encryption
- Database contains no sensitive authentication data
MIT License - see LICENSE file for details
For issues and feature requests, please use the GitHub issue tracker.