




Bricked Up is a full-stack web app that aggregates and analyzes LEGO deals π§© scraped from public sources. Users can browse deals, filter and sort listings, save favorites, and gain insights with interactive price indicators.
π Live Demo: Visit Bricked Up
Bricked Up solves the challenge of finding the best LEGO deals in a user-friendly, responsive, and automated way. By leveraging scraping, APIs, and automation, it ensures LEGO enthusiasts never miss out on a great deal. π§±β¨
- π View Deals: Browse through aggregated LEGO offers.
- π Relevance Score:
- Each deal is scored based on its popularity, discount, freshness, and resalability metrics.
- Relevance helps users prioritize the best deals.
- π Interactive Filters:
- π Best Discount
- π₯ Hot Deals
- π Popular Deals
- Relevance-based sorting
- π Deal Insights:
- Average and percentile price indicators.
- Expiration countdown for time-sensitive offers.
- β€οΈ Save Favorites: Mark and revisit your favorite deals.
- π Dark Mode: Toggle between light and dark themes.
- π Automated Refresh: Deals update daily at 5 AM and 6 PM UTC+2.
- π± Responsive Design: Works seamlessly on all devices, with optimized modals and layouts.
- π οΈ How It Works Accordion: Guides users on searching, sorting, and understanding the scores.
- Frontend: HTML, CSS (Bootstrap 5) π¨, JavaScript β‘
- Backend: Node.js with Express.js π
- Database: MongoDB Atlas ποΈ
- Web Scraping: Puppeteer π·οΈ, Cheerio πΏ
- Deployment: Vercel π οΈ
- Automation: GitHub Actions π

A clean, interactive homepage for LEGO enthusiasts.

Key price insights with visual indicators.
The Relevance Score is a calculated metric that helps users identify the best deals. It evaluates:
- Discount: The percentage off the original price.
- Popularity: Based on the number of comments and likes.
- Freshness: How recently the deal was published.
- Resalability: Resale potential based on average resale prices and listing activity.
- Temperature: A dealβs popularity among community users.
- Expiry: Whether the deal is expiring soon. The score ranges from 0% (low relevance) to 100% (high relevance).
The Relevance Score is a metric (ranging from 0 to 1) used to rank LEGO deals based on their value and appeal. It evaluates multiple factors with assigned weights to provide a comprehensive score.
Where:
-
$W$ : Weight assigned to each factor -
$S$ : Scaled score of each factor - Subscripts:
-
$d$ : Discount -
$p$ : Popularity -
$f$ : Freshness -
$e$ : Expiry -
$h$ : Heat -
$r$ : Resalability
-
-
Discount Score (
$S_d$ ): Percentage discount ($S_d = \min(\frac{\text{Discount}}{100}, 1)$ ). -
Popularity Score (
$S_p$ ): Community engagement ($S_p = \min(\frac{\text{Comments}}{\text{MAX COMMENTS}}, 1)$ ). -
Freshness Score (
$S_f$ ): Time since publication ($S_f = \max(1 – \frac{\text{Days}}{\text{MAX AGE DAYS}}, 0)$ ). -
Expiry Score (
$S_e$ ): Penalizes deals expiring soon ($S_e = 0.5$ if expiring soon,$S_e = 1$ otherwise). -
Heat Score (
$S_h$ ): Based on temperature ($S_h = \min(\frac{\text{Temperature}}{\text{MAX TEMPERATURE}}, 1)$ ). -
Resalability Score (
$S_r$ ): Combines:-
Profitability: (
$\max(\frac{\text{Resale Price} – \text{Price}}{\text{Price}}, 0)$ ), -
Demand: (
$\min(\frac{\text{Resale Listings}}{\text{MAX LISTINGS}}, 1)$ ), -
Velocity: (
$\min(\frac{\text{Weekly Resales}}{\text{MAX WEEKLY SALES}}, 1)$ ).
-
Profitability: (
- Discount: 20%
- Popularity: 20%
- Freshness: 15%
- Expiry: 5%
- Heat: 10%
- Resalability: 30%
- Profitability: 50%
- Demand: 30%
- Velocity: 20%
The Relevance Score provides a quick, data-driven insight into the best LEGO deals available.
- Data Collection: π·οΈ Deals are scraped from public sources like Dealabs and Vinted.
- Backend API: π‘ Data is stored in MongoDB Atlas and served through an Express.js API.
- Scheduled Updates: β° GitHub Actions refresh the data automatically twice a day.
- Client Rendering: π The deals are displayed interactively with filtering, sorting, and responsive design.
The data refreshes automatically:
β° Daily at 5 AM and 6 PM UTC+2
Using GitHub Actions to ensure users always get the latest deals.
bricked-up/
βββ client/
β βββ v2/
β βββ index.html # Main client HTML file
β βββ styles.css # Custom CSS styles
β βββ portfolio.js # Client-side logic
β βββ assets/ # Images and other assets
β βββ utils.js # Utility functions
β
βββ server/
β βββ api.js # Main server file (Express routes)
β βββ refresh_database.js # Script to refresh MongoDB
β βββ dealabs.js # Scraping script for Dealabs
β βββ vinted.js # Scraping script for Vinted
β βββ node_modules/ # Installed dependencies
β
βββ .github/
β βββ workflows/
β βββ database-refresh.yml # GitHub Actions for scheduled scraping
β
βββ vercel.json # Vercel deployment configuration
βββ package.json # Dependencies for server and client
βββ README.md # Project documentation
- Public data sources: Dealabs and Vinted
- Frameworks & Tools: Bootstrap, Puppeteer, Node.js, MongoDB
- Icons: Flaticon
Developed by: Joyce Lapilus
Project Repository: GitHub
For inquiries, feel free to contact via joyce.lapilus@gmail.com.
This website aggregates publicly available data for educational and informational purposes only.
π No malicious intent is associated with data scraping. For any concerns, feel free to contact me.
π Thank you for visiting Bricked Up! π§±β¨


Leave a Reply