Track used car listings across Cars.com, Autotrader, CarGurus, Craigslist, Facebook Marketplace, and dealer sites. Get instant notifications when prices drop.
- Universal Watchlist: One list for cars from any site
- Price Drop Alerts: Get notified when prices drop
- VIN-Based Tracking: Same car tracked across multiple sites
- Crowd-Powered Updates: When one user refreshes, everyone benefits
- Price History: See how prices change over time
- 100% Legal: User-driven data capture only, no scraping
This is a monorepo with three main components:
βββ backend/ # Express.js API server
βββ frontend/ # Next.js web dashboard
βββ extension/ # Chrome/Firefox browser extension
βββ packages/
βββ shared/ # Shared types and utilities
- User-Driven Capture: Data is ONLY captured when a user views a listing
- Crowd Refresh: When ANY user refreshes a listing, ALL watchers benefit
- Email Integration: Gmail OAuth parses price alerts from listing sites
- HEAD Checks: Lightweight checks (no HTML parsing) detect removed listings
- Node.js 18+
- PostgreSQL 14+
- Redis 7+
git clone https://github.com/yourusername/universal-carlist-extension.git
cd universal-carlist-extension
npm install# Backend
cp backend/.env.example backend/.env
# Edit backend/.env with your database credentialsRequired environment variables:
# Database
DATABASE_URL="postgresql://user:password@localhost:5432/carlist?schema=public"
# Redis
REDIS_URL="redis://localhost:6379"
# JWT
JWT_SECRET="your-super-secret-key"
# Google OAuth (optional, for Gmail integration)
GOOGLE_CLIENT_ID="your-client-id"
GOOGLE_CLIENT_SECRET="your-client-secret"cd backend
npx prisma migrate dev
npx prisma generate# From root directory
npm run dev
# Or individually:
npm run dev:backend # API on http://localhost:3001
npm run dev:frontend # Web on http://localhost:3000
npm run dev:extension # Build extension with watch- Open Chrome β
chrome://extensions - Enable "Developer mode"
- Click "Load unpacked"
- Select the
extension/distfolder
- Floating "Track" Button: Appears on car listing pages
- One-Click Add: Add any car to your watchlist
- Popup Dashboard: Quick access to recent watches
- Auto-Extraction: Captures price, mileage, VIN, photos, etc.
- Watchlist View: See all tracked vehicles
- Price History Charts: Visualize price changes
- Freshness Indicators: Know when data was last updated
- Compare Vehicles: Side-by-side comparison
- Notification Center: All your alerts in one place
- RESTful API: Full CRUD for vehicles and watchlist
- Real-time Updates: Redis pub/sub for instant notifications
- Background Jobs: BullMQ for HEAD checks and emails
- Email Notifications: Automatic alerts on price drops
| Site | Status | VIN Detection | Photos |
|---|---|---|---|
| Cars.com | β | β | β |
| Autotrader | β | β | β |
| CarGurus | β | β | β |
| Craigslist | β | β | |
| FB Marketplace | β | β | |
| Carvana | β | β | β |
| Dealer Sites |
The key innovation is crowd-powered updates:
- User A views a listing β extension captures snapshot
- Backend detects price changed from previous snapshot
- Backend notifies ALL users watching that VIN
- Everyone benefits from User A's view
This means:
- More users = fresher data for everyone
- No scraping needed
- Fully compliant with ToS
Vehicle (VIN is primary key when available)
βββ Snapshots (point-in-time captures)
βββ PriceChanges (detected drops/rises)
βββ StatusChanges (sold, removed, relisted)
βββ WatchlistEntries (user-specific settings)
When VIN isn't available, we use fuzzy fingerprinting:
- Year + Make + Model + Trim + Mileage (rounded) + Price (rounded) + Location
- No Scraping: We never crawl or scrape sites
- No HTML Parsing on Server: All extraction happens in user's browser
- User-Triggered Only: Data captured only when user views a page
- HEAD Requests Only: Server only checks if URLs are alive (200 vs 404)
- Email Parsing: Only with explicit OAuth consent
POST /api/auth/register- Create accountPOST /api/auth/login- Sign inGET /api/auth/me- Get current userGET /api/auth/google/url- Get OAuth URL
GET /api/watchlist- Get user's watchlistPOST /api/watchlist- Add to watchlistPATCH /api/watchlist/:vehicleId- Update preferencesDELETE /api/watchlist/:vehicleId- Remove from watchlist
GET /api/vehicles/:id- Get vehicle with historyGET /api/vehicles/vin/:vin- Find by VINGET /api/vehicles/:id/price-history- Get price timelinePOST /api/vehicles/compare- Compare multiple vehicles
POST /api/extension/snapshot- Submit listing dataPOST /api/extension/watch- Quick add to watchlistGET /api/extension/check-url- Check if URL is tracked
| Layer | Technology |
|---|---|
| Frontend | Next.js 14, React, TailwindCSS, Framer Motion |
| Backend | Express.js, TypeScript, Prisma |
| Database | PostgreSQL |
| Cache/Queue | Redis, BullMQ |
| Extension | Chrome Manifest V3, React, Vite |
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing) - Open a Pull Request
MIT License - see LICENSE for details.
Built with β€οΈ for smarter car shopping