A modern, responsive search interface for Philippine government procurement records built with Vite, React 19, TypeScript, Tailwind CSS v4, and MeiliSearch.
- π Smart Search: Real-time full-text search across multiple fields with advanced query syntax
- π Interactive Dashboard: Statistics, analytics, and visualizations for search results
- ποΈ Entity Directories: Browse contractors, organizations, locations, and categories
- π Data Insights: Charts and trends for procurement spending over time
- π¨ Modern UI/UX: Clean, professional design with responsive tables and mobile support
- π± Mobile Responsive: Optimized for all screen sizes with touch-friendly interfaces
- β‘ Fast Performance: Powered by MeiliSearch for instant search results
- π§ Advanced Filtering: Multi-select filters for areas, awardees, and organizations
- π₯ CSV Export: Download search results for offline analysis
- Frontend: Vite, React 19, TypeScript, React Router
- Styling: Tailwind CSS v4, Figtree font, custom animations
- Search Engine: MeiliSearch with instant search and filtering
- UI Components: shadcn/ui (Radix UI primitives), Lucide React icons
- Charts: Recharts for data visualization
- SEO: React Helmet for meta tags
- State Management: React hooks with debounced search
- Data Processing: Python scripts with pandas and pyarrow
git clone <repository-url>
cd philgeps
npm installCopy the environment example file and configure your settings:
cp .env.example .envEdit .env with your configuration:
# MeiliSearch Configuration
VITE_MEILISEARCH_HOST=http://localhost:7700
VITE_MEILISEARCH_API_KEY=your_master_key_here
VITE_MEILISEARCH_INDEX_NAME=philgeps
# Application Configuration
VITE_APP_NAME=PHILGEPS Search
VITE_APP_DESCRIPTION=Government Procurement Search Platformnpm run devVisit http://localhost:5173 to see your application running!
The application allows searching across these comprehensive fields:
reference_id- Reference IDcontract_no- Contract Numberaward_title- Award Titlenotice_title- Notice Titleawardee_name- Awardee Nameorganization_name- Organization Namearea_of_delivery- Area of Deliverybusiness_category- Business Categorycontract_amount- Contract Amountaward_date- Award Dateaward_status- Award Status
- Type your search query in the main search bar
- Results appear instantly as you type with debounced search
- View contract details, amounts, and status information
- Click the "Filters" button to open the filter panel
- Filter by business category (Construction, IT, Medical Equipment, etc.)
- Sort results by relevance, award date, or contract amount
- View real-time statistics and analytics
- Smart Search: Finds matches across all fields simultaneously
- Category Icons: Visual indicators for different business categories
- Currency Formatting: Philippine Peso (PHP) formatting for contract amounts
- Date Formatting: Localized date display
- Status Indicators: Color-coded award status badges
- Responsive Cards: Hover effects and smooth transitions
For detailed instructions on downloading data, setting up MeiliSearch, and importing PhilGEPS data, see:
The data loading process includes:
- Downloading parquet files from Hugging Face
- Extracting data using DuckDB
- Importing main contract data into MeiliSearch
- Importing pre-aggregated filter data for efficient browsing
- Edit
src/index.cssfor global styles and animations - Modify
tailwind.config.jsfor Tailwind CSS configuration - Update component styles in individual
.tsxfiles
- Navigation: Main navigation with dropdown menus
- EnhancedSearchInterface: Advanced search with filters, sorting, and pagination
- Directory Pages: Contractors, Organizations, Locations, Categories list views
- Detail Pages: Individual entity pages with statistics and charts
- Footer: Site-wide footer component
- SearchGuide: Interactive search syntax guide
- UI Components: Reusable shadcn/ui components in
src/components/ui/ - ErrorBoundary: Error handling component
- Types: TypeScript definitions in
src/types/
| Variable | Description | Default |
|---|---|---|
VITE_MEILISEARCH_HOST |
MeiliSearch server URL | http://localhost:7700 |
VITE_MEILISEARCH_API_KEY |
MeiliSearch API key | masterKey |
VITE_MEILISEARCH_INDEX_NAME |
Search index name | philgeps |
VITE_APP_NAME |
Application name | PHILGEPS Search |
VITE_APP_DESCRIPTION |
App description | Government Procurement Search Platform |
npm run dev # Start development server
npm run build # Build for production
npm run lint # Run ESLint
npm run preview # Preview production build# Full pipeline: CSV β Parquet β Aggregates β MeiliSearch
npm run gaa:pipeline
# Individual steps:
npm run gaa:csv-to-parquet # Convert CSV files to Parquet
npm run gaa:create-aggregates # Generate JSON aggregates
npm run gaa:import # Import to MeiliSearch
npm run gaa:configure-search # Configure MeiliSearch index
# Quick reload (skip CSV/aggregates):
npm run gaa:reload # Re-import and configure search onlynpm run generate:sitemap # Generate budget sitemap
npm run generate:sitemap:procurement # Generate procurement sitemap
npm run generate:sitemap:index # Generate sitemap index
npm run generate:sitemaps:all # Generate all sitemapsnpm run seed # Seed MeiliSearch with sample data
npm run search:stats # Display search statisticsphilgeps/
βββ src/
β βββ components/
β β βββ ui/ # shadcn/ui components
β β β βββ autocomplete.tsx
β β β βββ button.tsx
β β β βββ card.tsx
β β β βββ input.tsx
β β βββ AwardeePage.tsx # Individual contractor detail page
β β βββ CategoriesListPage.tsx # Categories directory
β β βββ CategoryPage.tsx # Category detail page
β β βββ ContractorsPage.tsx # Contractors directory
β β βββ EnhancedSearchInterface.tsx # Main search interface
β β βββ ErrorBoundary.tsx # Error handling
β β βββ Footer.tsx # Site footer
β β βββ LocationPage.tsx # Location detail page
β β βββ LocationsListPage.tsx # Locations directory
β β βββ Navigation.tsx # Main navigation
β β βββ OrganizationPage.tsx # Organization detail page
β β βββ OrganizationsListPage.tsx # Organizations directory
β β βββ SearchGuide.tsx # Search syntax guide
β βββ lib/
β β βββ meilisearch.ts # MeiliSearch client config
β β βββ utils.ts # Utility functions
β βββ types/
β β βββ search.ts # TypeScript interfaces
β βββ App.tsx # Root component with routing
β βββ main.tsx # React 19 render root
β βββ index.css # Global styles
β βββ App.css # Component styles
βββ data/
β βββ philgeps/
β β βββ import.py # Main data import script
β β βββ import_extras.py # Aggregated data import
β β βββ philgeps-extract.sql # DuckDB extraction script
β β βββ update_index.py # Index update script
β βββ gaa/
β β βββ import_gaa.py # GAA data import
β βββ requirements.txt # Python dependencies
β βββ README.md # Data setup instructions
βββ .env.example # Environment variables example
βββ tailwind.config.js # Tailwind CSS v4 config
βββ vite.config.ts # Vite configuration
βββ LICENSE # MIT License
βββ README.md
The application includes comprehensive error handling:
- Error Boundary: Catches and displays React component errors
- Search Error Handling: Graceful handling of MeiliSearch connection issues
- Loading States: Smooth loading indicators during search operations
- Network Error Recovery: Automatic retry mechanisms
- Chrome (latest)
- Firefox (latest)
- Safari (latest)
- Edge (latest)
MIT License - see LICENSE file for details.
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests if applicable
- Submit a pull request
For issues and questions:
- Check the MeiliSearch documentation
- Review the error messages in the browser console
- Verify your environment variables are correctly set
- Ensure MeiliSearch is running and accessible
Happy Searching! π