https://github.com/e-candeloro/vintage_ai
Vintage AI — AI-driven platform for exploring classic car sentiment & market trends. Built with FastAPI, Streamlit & DuckDB to deliver real-time insights to enthusiasts and investors.
https://github.com/e-candeloro/vintage_ai
ai classic-cars duckdb fastapi market-trends pydantic sentiment-analysis streamlit vintage-ai
Last synced: 12 months ago
JSON representation
Vintage AI — AI-driven platform for exploring classic car sentiment & market trends. Built with FastAPI, Streamlit & DuckDB to deliver real-time insights to enthusiasts and investors.
- Host: GitHub
- URL: https://github.com/e-candeloro/vintage_ai
- Owner: e-candeloro
- Created: 2025-06-03T13:54:54.000Z (about 1 year ago)
- Default Branch: master
- Last Pushed: 2025-06-17T08:02:17.000Z (about 1 year ago)
- Last Synced: 2025-06-25T10:55:40.250Z (about 1 year ago)
- Topics: ai, classic-cars, duckdb, fastapi, market-trends, pydantic, sentiment-analysis, streamlit, vintage-ai
- Language: Jupyter Notebook
- Homepage:
- Size: 13.2 MB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# 🚗 Vintage AI - MVA Hackathon 2025 🧠






> 💡 AI-powered tool for understanding classic car market trends and sentiment analysis across the web.
## 📽️ Demo Video
https://github.com/user-attachments/assets/8e5a05c8-4982-44bd-bad1-1282149bc8da
## 🧠 Project Overview
Vintage AI scrapes social media, forums and Google Trends to deliver **sentiment analysis** and **topic discovery** on classic-car models.
The project is built with a Python backend using FastAPI and a Streamlit-based dashboard for user interaction. Data is managed using DuckDB, and various Python libraries are employed for data scraping, processing, and analysis.
| Layer | Tech |
| --------- | --------------------------------------------------------------------------------------- |
| Backend | [FastAPI](https://fastapi.tiangolo.com/), [Pydantic](https://docs.pydantic.dev/latest/) |
| Frontend | [Streamlit](https://streamlit.io/) |
| Storage | [DuckDB](https://duckdb.org/) |
| Dev tools | [uv](https://github.com/astral-sh/uv), [pre-commit](https://pre-commit.com/) |
## 🎯 Challenge
Vintage AI was created for the [Motor Valley Fest Accelerator Hackathon 2025](https://www.motorvalley.it/motorvalleyfest/eventi/hackathon-motor-valley-fest-2025/), a unique event organized by [AssetClassic](https://www.assetclassic.com) and [Motor Valley Accelerator](https://motorvalleyaccelerator.it), sponsored by [TikTok](https://www.tiktok.com).
The challenge invited students and recent graduates passionate about AI, data science, and vintage cars to develop innovative digital solutions. Teams leveraged provided datasets and open-source tools to uncover hidden insights into market sentiment and trends around classic cars, presenting their projects to a jury including representatives from AssetClassic, Motor Valley Accelerator, TikTok, and [McKinsey & Company](https://www.mckinsey.com).
> 🙏 **Special thanks** to the organizers, sponsors, jury members, and mentors for supporting and facilitating the event.
## ✅ Hackathon Alignment
This solution is designed to meet the hackathon's evaluation criteria:
* 💡**Technical innovation** – modular Python stack, NLP pipelines
* 📈 **Accuracy & reliability** – median aggregation, strict schema validation
* 🎨 **Usability & UX** – one-click dashboard, interactive charts
* ⚙️ **Scalability & performance** – DuckDB analytics, FastAPI async support, caching
* 💼 **Business relevance** – investor-oriented insights for classic-car valuation
* 📣 **Presentation & clarity** – clean architecture and documentation
## Installation
1. Install uv globally
2. Clone this repo
git clone https://github.com/e-candeloro/vintage_ai.git
3. Go to the repo directory
cd vintage_ai
4. Create and install dependencies
uv sync
5. Install and test the pre-commit hooks
pre-commit install
pre-commit run --all-files
6. Rename the `.env.example` to `.env`. Inside this file there will be important environment settings for the program to use.
7. Run the backend
PYTHONPATH=src uvicorn vintage_ai.api.main:app --reload
8. Open a new shell an run the streamlit front-end:
streamlit run dashboard/app.py
This will install all the dependencies, spin the FastAPI backend at `http://127.0.0.1:8000` and start the Streamlit dashboard at ` http://localhost:8501`
## 🧑💻 Codebase Highlights
* **`src/vintage_ai/`**: Contains the core backend logic.
* **`api/`**: Defines the FastAPI application, including routes (`routes/cars.py`) and core schemas (`core/schemas/v1.py`).
* `main.py`: Sets up the FastAPI application and middleware.
* `routes/cars.py`: Handles API requests related to car data, currently providing a snapshot endpoint.
* `core/schemas/v1.py`: Defines Pydantic models for request and response data structures, ensuring type safety and validation.
* **`services/`**: Houses business logic.
* `car_data_service.py`: Contains functions to fetch, aggregate, and process car-related data from DuckDB and potentially other sources like Google Trends (via `fetch_trends_global`). It aggregates metrics from different platforms and stores/retrieves overall snapshots.
* `trends_services.py`: (Referenced in `car_data_service.py`) Likely contains logic for fetching trend data from external APIs like Google Trends.
* **`settings.py`**: Manages application settings using Pydantic's `BaseSettings`, allowing configuration via environment variables or a `.env` file. This is crucial for managing different environments (dev, prod) and sensitive information.
* **`dashboard/app.py`**: A Streamlit application that serves as the user interface.
* It takes user input for a car model.
* Calls the backend API to fetch processed data.
* Displays various metrics and visualizations, including:
* Time-series charts for price and popularity.
* Correlation between price and popularity.
* Sentiment analysis (top topics and overall score).
* Summary metrics in a tabular and JSON format.
* Includes error handling for API calls and data processing.
* Uses caching to improve performance.