Open-source people search engine with natural language queries, intelligent caching, and AI-powered research reports.
Features • Quick Start • Tech Stack • How It Works
PeopleHub solves a common problem: finding and researching professionals is either slow (manual LinkedIn searching) or expensive (premium tools charging $5+ per profile).
Instead of spending hours manually searching LinkedIn and taking notes, just type what you're looking for in plain English:
PeopleHub combines Google Gemini 2.0 for intelligent query parsing, Bright Data APIs for LinkedIn scraping, and LangGraph for automated research workflows.
Search for professionals using plain English. No complex filters or Boolean operators needed.
Example queries: - "5 AI Engineers in Israel" - "Software engineers at Google" - "Product managers in San Francisco with startup experience"
Automated due diligence with LangGraph workflows: - LinkedIn profile analysis - Web scraping for recent projects and achievements - AI-powered summarization of technical expertise - Industry reputation analysis - Comprehensive reports with sources
Country-specific search results with automatic geo-targeting
git clone https://github.com/MeirKaD/pepolehub
cd peoplehub
npm install
cp .env.example .env
Edit .env and add your credentials:
# Database (Supabase PostgreSQL)
DATABASE_URL="your-supabase-connection-pooling-url"
DIRECT_URL="your-supabase-direct-url"
# Supabase (optional for future features)
NEXT_PUBLIC_SUPABASE_URL="your-supabase-project-url"
NEXT_PUBLIC_SUPABASE_ANON_KEY="your-supabase-anon-key"
# Bright Data API
BRIGHTDATA_API_TOKEN="your-brightdata-api-token"
# Google AI (Gemini 2.0)
GOOGLE_GENERATIVE_AI_API_KEY="your-google-ai-api-key"
# Redis (optional, for hot cache)
REDIS_URL="your-redis-url"
npx prisma generate
npx prisma db push
npm run dev
Open http://localhost:3000 to see the app.
User Query → AI Parser (Gemini 2.0) → Cache Check → LinkedIn Scraper → Database → Results
↓
Research Engine (LangGraph)
↓
Web Scraping + Summarization
↓
Research Report

gemini-2.0-flash-exp)@ai-sdk/google 2.0.17)User queries are parsed using Google Gemini 2.0 Flash with structured output via Zod schemas:
Input: "5 AI Engineers in Israel"
AI Parsed Output:
{
"count": 5,
"role": "AI Engineer",
"location": "Israel",
"countryCode": "IL",
"keywords": [],
"googleQuery": "site:linkedin.com/in \"AI Engineer\" \"Israel\""
}
Tier 1: Redis (Hot Cache) - Sub-millisecond lookups for popular searches - 30-minute TTL for search results - Reduces database load by 70-90%
Tier 2: PostgreSQL (Persistent Cache)
- 180-day freshness tracking
- Popularity-based prioritization (searchCount field)
- Batch optimization for multiple profiles
Performance Impact: - First search: ~120 seconds (LinkedIn scraping bottleneck) - Cached search: ~2.5 seconds (database lookup) - Batch lookup: 10-50ms for 100 profiles - Cost reduction: 70-90% with 90% cache hit rate
Automated due diligence reports using LangChain's LangGraph framework:
Features: - Stateful multi-step workflows - Parallel web scraping (fan-out/fan-in pattern) - LinkedIn profile analysis - Google search for recent projects - AI-powered content summarization - Comprehensive report generation with sources
Example Research Report Sections: - Professional Background - Recent Projects and Achievements - Technical Expertise - Industry Reputation - Sources with URLs
peoplehub/
├── prisma/
│ └── schema.prisma # Database schema (Person, Search, Research models)
├── src/
│ ├── app/
│ │ ├── api/
│ │ │ ├── search/ # Main search endpoint
│ │ │ ├── research/ # Research engine endpoint
│ │ │ ├── profiles/ # Recent profiles API
│ │ │ └── proxy-image/ # Image proxy for LinkedIn avatars
│ │ ├── search/ # Search results page
│ │ ├── previous/ # Previous searches page
│ │ ├── research/[id]/ # Research report page
│ │ └── page.tsx # Homepage with aurora background
│ ├── components/
│ │ ├── ui/ # shadcn/ui components
│ │ ├── Navigation.tsx # Glassmorphism navbar
│ │ ├── PersonCard.tsx # Expandable profile card
│ │ ├── SearchBar.tsx # Search input component
│ │ ├── FloatingOrbs.tsx # 3D magnifying glasses
│ │ └── LoadingState.tsx # Skeleton loader
│ ├── lib/
│ │ ├── brightdata/ # Bright Data API integration
│ │ │ ├── search.ts # Google Search API
│ │ │ ├── linkedin.ts # LinkedIn Scraper API
│ │ │ └── client.ts # MCP client for research
│ │ ├── cache/ # Caching layer (DB + Redis)
│ │ ├── redis/ # Redis hot cache
│ │ ├── search/ # AI query parsing (Gemini)
│ │ ├── research/ # LangGraph research engine
│ │ │ ├── graph.ts # Research workflow graph
│ │ │ ├── nodes.ts # Individual workflow nodes
│ │ │ └── runner.ts # Graph execution
│ │ └── prisma.ts # Prisma client singleton
│ └── types/
│ └── linkedin.ts # LinkedIn profile types
├── tests/ # Test scripts
└── package.json
npm run dev - Start development servernpm run build - Build for productionnpm run start - Start production servernpm run lint - Run ESLintnpx prisma generate - Generate Prisma Clientnpx prisma db push - Push schema changes to databasenpx prisma studio - Open Prisma Studio (database GUI)npx tsx src/tests/test-parser.ts - Test AI query parsingnpx tsx src/tests/test-search-flow.ts - Test search → Google → LinkedIn flownpx tsx src/tests/test-cache.ts - Test caching layernpx tsx src/tests/test-recent-api.ts - Test /api/profiles/recent endpointContributions are welcome! Here's how you can help:
git checkout -b feature/amazing-feature)git commit -m 'Add amazing feature')git push origin feature/amazing-feature)Please ensure your PR: - Includes tests for new features - Updates documentation as needed
MIT License - see LICENSE file for details.
Built by Meir Kadosh
Questions or feedback? Open an issue or reach out!
Star this repo if you find it useful! ⭐
$ claude mcp add pepolehub \
-- python -m otcore.mcp_server <graph>