CRITICAL: This project follows a strict task completion protocol that MUST be followed for every task:
- Mark task complete in
tasks/tasks-prd-flight-scraping-app.md - Document all files changed with descriptions
- Run validation (
npm testornpx tsc --noEmit) - Stage and commit with proper conventional commit format
- Wait for user approval before next task
- Check if changes are in PRD (
tasks/prd-flight-scraping-app.md) - If not, prompt user to update PRD first
- Update task list accordingly
See .cursor/rules/project-management.mdc for full protocol details.
A full-stack flight scraping application built with React, TypeScript, and Convex. The system scrapes flight data from multiple sources (Skyscanner and Kiwi) based on user-defined search criteria, stores the results in a database, and displays matching flight bundles to users.
- Multi-Source Flight Aggregation: Scrape and aggregate flight data from Skyscanner and Kiwi in parallel
- Real-Time User Experience: Provide immediate feedback on scraping progress without blocking the user interface
- Flexible Search Capabilities: Support both one-way and round-trip searches with comprehensive filtering options
- Efficient Data Management: Store and retrieve flight data efficiently with automatic cleanup of expired entries
- Responsive Performance: Deliver search results within 30 seconds when possible
- Graceful Error Handling: Continue operation even when individual scraping sources fail
- Frontend: React 19, TypeScript, Tailwind CSS, shadcn/ui
- Backend: Convex (database, real-time updates, serverless functions)
- Scraping: Multi-source web scraping with rate limiting and error handling
- State Management: React Context + localStorage for persistence
-
Install dependencies:
npm install
-
Start development servers:
npm run dev
-
Open the application:
- Frontend: http://localhost:5173
- Convex Dashboard: https://dashboard.convex.dev
├── convex/ # Convex backend (database, functions, actions)
├── src/ # React frontend
│ ├── components/ # UI components
│ ├── hooks/ # Custom React hooks
│ └── utils/ # Utility functions
├── tasks/ # Project documentation
│ ├── prd-flight-scraping-app.md
│ └── tasks-prd-flight-scraping-app.md
└── .cursor/rules/ # Cursor IDE rules and protocols
- One-way & Round Trip: Toggle between one-way and round trip flights with an intuitive date picker
- IATA Code Input: Smart autocomplete for airport codes with validation and history
- Real-time Progress: Live progress indicators for multi-source scraping operations
- Responsive Design: Mobile-first design that works on all devices
- Accessibility: Full keyboard navigation and screen reader support
- Custom date picker with round trip toggle
- Fixed width to prevent layout shifts
- Integrated validation and error handling
- IATA code input with autocomplete
- Priority-based search (exact match, history, popularity)
- Real-time validation against airport database
- Combined search interface with all flight search fields
- LocalStorage integration for search preferences
- Comprehensive form validation
The application uses Convex with the following main tables:
- airports: Airport information with IATA codes and popularity scores
- flights: Individual flight records with departure/arrival details
- bundles: Flight bundles combining outbound and inbound flights
- bookingOptions: Pricing and booking information for each bundle
- scrapingLogs: Monitoring and debugging information for scraping operations
- Follow the task completion protocol for all changes
- Check the PRD before implementing new features
- Update task list as work progresses
- Ensure all changes are properly documented and committed
This project is private and proprietary.