Why this project exists
Marketplace Cart turns scattered marketplace links into structured, shareable lists.
It’s built for real planning workflows—tracking availability, comparing prices, and collaborating—while hiding the messiness of scraping and inconsistent third-party data.
What the system does
🔗 Ingest listings reliably
- Scrapes OfferUp and Facebook Marketplace listings
- Uses a two-step preview → confirm workflow to validate data before saving
- Cached previews prevent unnecessary re-scraping
🧠 Normalize messy marketplace data
- Standardizes raw condition strings into five canonical values
(New, Like New, Good, Fair, Poor) - Keeps filtering, sorting, and totals consistent across platforms
🗂️ Organize with flexible, shareable categories
- Create custom categories for projects, rooms, or plans
- Assign items to multiple categories without duplicating data
- Share categories with explicit roles:
- Viewer (read-only)
- Editor (can add items)
- Toggle categories between public and private
💰 Calculate totals without double-counting
- Platform-based subtotals
- Automatic deduplication when items appear in multiple categories
- Accurate grand totals for planning and budgeting
Backend architecture highlights
- Modular scraper registry routes URLs to the correct scraper
- Static pages via Axios + Cheerio
- Dynamic pages via Puppeteer
- Service-layer item pipeline centralizes preview, normalization, and persistence
- Ownership-aware data models enforce permissions on shared lists
- Shared Puppeteer browser instance reduces overhead and manages lifecycle cleanly
UI shaped by backend structure
The UI stays intentionally simple:
- playlist-style item cards
- inline category assignment
- filter, sort, and search powered by normalized data
This keeps the interface usable even as collections grow.
Engineering challenges
- Scraping dynamic marketplaces without polluting core logic
- Enforcing collaboration rules without breaking data integrity
- Keeping totals correct across shared, overlapping categories
Each challenge pushed the architecture toward clearer boundaries and stricter normalization.
Tech stack
- Backend: Node.js, Express
- Database: MongoDB + Mongoose
- Auth: Passport.js (session-based)
- Scraping: Puppeteer, Axios, Cheerio
- Frontend: EJS + vanilla JavaScript
Why it stands out
Marketplace Cart is less about scraping and more about engineering around unreliable inputs.
It reflects a backend-first mindset: validate early, normalize once, and design systems that stay correct as features and users scale.