{"id":28508664,"url":"https://github.com/e-candeloro/vintage_ai","last_synced_at":"2025-07-02T22:31:42.371Z","repository":{"id":297908396,"uuid":"995450866","full_name":"e-candeloro/vintage_ai","owner":"e-candeloro","description":"Vintage AI — AI-driven platform for exploring classic car sentiment \u0026 market trends.   Built with FastAPI, Streamlit \u0026 DuckDB to deliver real-time insights to enthusiasts and investors.","archived":false,"fork":false,"pushed_at":"2025-06-17T08:02:17.000Z","size":13869,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-06-25T10:55:40.250Z","etag":null,"topics":["ai","classic-cars","duckdb","fastapi","market-trends","pydantic","sentiment-analysis","streamlit","vintage-ai"],"latest_commit_sha":null,"homepage":"","language":"Jupyter Notebook","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/e-candeloro.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-06-03T13:54:54.000Z","updated_at":"2025-06-17T08:07:10.000Z","dependencies_parsed_at":null,"dependency_job_id":"3bcef804-27ae-45f2-8cb3-8c821cce40fe","html_url":"https://github.com/e-candeloro/vintage_ai","commit_stats":null,"previous_names":["e-candeloro/vintage_ai"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/e-candeloro/vintage_ai","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/e-candeloro%2Fvintage_ai","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/e-candeloro%2Fvintage_ai/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/e-candeloro%2Fvintage_ai/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/e-candeloro%2Fvintage_ai/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/e-candeloro","download_url":"https://codeload.github.com/e-candeloro/vintage_ai/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/e-candeloro%2Fvintage_ai/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":263225959,"owners_count":23433609,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","classic-cars","duckdb","fastapi","market-trends","pydantic","sentiment-analysis","streamlit","vintage-ai"],"created_at":"2025-06-08T21:39:17.649Z","updated_at":"2025-07-02T22:31:42.354Z","avatar_url":"https://github.com/e-candeloro.png","language":"Jupyter Notebook","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🚗 Vintage AI - MVA Hackathon 2025 🧠\n\n![FastAPI](https://img.shields.io/badge/FastAPI-005571?logo=fastapi\u0026logoColor=white)\n![Streamlit](https://img.shields.io/badge/Streamlit-FF4B4B?logo=streamlit\u0026logoColor=white)\n![DuckDB](https://img.shields.io/badge/DuckDB-yellow?logo=duckdb\u0026logoColor=black)\n![Python](https://img.shields.io/badge/Python-3.10%2B-blue?logo=python)\n![License](https://img.shields.io/github/license/e-candeloro/vintage_ai)\n![Pre-commit](https://img.shields.io/badge/Pre--commit-enabled-green)\n\n\u003e 💡 AI-powered tool for understanding classic car market trends and sentiment analysis across the web.\n\n## 📽️ Demo Video\n\nhttps://github.com/user-attachments/assets/8e5a05c8-4982-44bd-bad1-1282149bc8da\n\n## 🧠 Project Overview\n\nVintage AI scrapes social media, forums and Google Trends to deliver **sentiment analysis** and **topic discovery** on classic-car models.\n\nThe 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.\n\n| Layer     | Tech                                                                                    |\n| --------- | --------------------------------------------------------------------------------------- |\n| Backend   | [FastAPI](https://fastapi.tiangolo.com/), [Pydantic](https://docs.pydantic.dev/latest/) |\n| Frontend  | [Streamlit](https://streamlit.io/)                                                      |\n| Storage   | [DuckDB](https://duckdb.org/)                                                           |\n| Dev tools | [uv](https://github.com/astral-sh/uv), [pre-commit](https://pre-commit.com/)            |\n\n## 🎯 Challenge\n\nVintage 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).\n\nThe 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 \u0026 Company](https://www.mckinsey.com).\n\n\u003e 🙏 **Special thanks** to the organizers, sponsors, jury members, and mentors for supporting and facilitating the event.\n\n## ✅ Hackathon Alignment\n\nThis solution is designed to meet the hackathon's evaluation criteria:\n\n* 💡**Technical innovation** – modular Python stack, NLP pipelines  \n* 📈 **Accuracy \u0026 reliability** – median aggregation, strict schema validation  \n* 🎨 **Usability \u0026 UX** – one-click dashboard, interactive charts  \n* ⚙️ **Scalability \u0026 performance** – DuckDB analytics, FastAPI async support, caching  \n* 💼 **Business relevance** – investor-oriented insights for classic-car valuation  \n* 📣 **Presentation \u0026 clarity** – clean architecture and documentation\n\n## Installation\n\n1. Install uv globally\n2. Clone this repo\n\n        git clone https://github.com/e-candeloro/vintage_ai.git\n\n3. Go to the repo directory\n\n        cd vintage_ai\n\n4. Create and install dependencies\n    \n        uv sync\n\n5. Install and test the pre-commit hooks\n\n        pre-commit install\n        pre-commit run --all-files\n\n6. Rename the `.env.example` to `.env`. Inside this file there will be important environment settings for the program to use.  \n\n7. Run the backend\n   \n        PYTHONPATH=src uvicorn vintage_ai.api.main:app --reload\n\n8. Open a new shell an run the streamlit front-end:\n\n        streamlit run dashboard/app.py\n\nThis 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`\n\n\n\n\n## 🧑‍💻 Codebase Highlights\n\n*   **`src/vintage_ai/`**: Contains the core backend logic.\n    *   **`api/`**: Defines the FastAPI application, including routes (`routes/cars.py`) and core schemas (`core/schemas/v1.py`).\n        *   `main.py`: Sets up the FastAPI application and middleware.\n        *   `routes/cars.py`: Handles API requests related to car data, currently providing a snapshot endpoint.\n        *   `core/schemas/v1.py`: Defines Pydantic models for request and response data structures, ensuring type safety and validation.\n    *   **`services/`**: Houses business logic.\n        *   `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.\n        *   `trends_services.py`: (Referenced in `car_data_service.py`) Likely contains logic for fetching trend data from external APIs like Google Trends.\n    *   **`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.\n\n*   **`dashboard/app.py`**: A Streamlit application that serves as the user interface.\n    *   It takes user input for a car model.\n    *   Calls the backend API to fetch processed data.\n    *   Displays various metrics and visualizations, including:\n        *   Time-series charts for price and popularity.\n        *   Correlation between price and popularity.\n        *   Sentiment analysis (top topics and overall score).\n        *   Summary metrics in a tabular and JSON format.\n    *   Includes error handling for API calls and data processing.\n    *   Uses caching to improve performance.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fe-candeloro%2Fvintage_ai","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fe-candeloro%2Fvintage_ai","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fe-candeloro%2Fvintage_ai/lists"}