The best tech jobs aren't on job boards. They're hiding in LinkedIn posts.
A community-driven job discovery platform. We watch real hiring managers — founders, VPs, team leads — across LinkedIn and X. Whenever they post a job, we capture it and display it in our feed — ranked by the community through upvotes and downvotes. No job boards. Just real jobs from the people actually hiring.
Live: skiptheboard.in
- We watch — Our system monitors hiring posts from real decision-makers on LinkedIn and X.
- We display — Every captured post appears in the feed with the original author, role, company, and a direct link to the source.
- You vote — Upvote quality posts (real hiring managers, clear roles) and downvote spam (recruiters, vague listings).
- Posts expire — Jobs auto-expire after 30 days. Fresh stuff only.
HireGene/
├── frontend/ # Next.js 16 app (React 19, TypeScript, Tailwind CSS 4)
│ ├── src/app/ # App Router — pages, layout, global styles
│ ├── src/components/ # UI components (JobCard, UpvoteButton, Sidebar, SocialProof)
│ └── src/lib/ # Data types, constants, config, API client, mock data
├── backend/ # Hono API server (Prisma, PostgreSQL, Apify, Groq)
│ ├── api/ # Vercel serverless entry point ([[...route]].ts)
│ ├── prisma/ # Database schema and migrations
│ ├── src/routes/ # API routes (posts, admin, submissions)
│ ├── src/lib/ # Prisma client, Apify scraper, LLM classifier, config
│ └── scripts/ # Utility scripts (avatar updates, etc.)
├── DEPLOYMENT.md # Full deployment guide (frontend + backend)
└── README.md
- Frontend: Next.js 16, React 19, TypeScript, Tailwind CSS 4, Google Analytics 4
- Backend: Hono, Prisma, PostgreSQL, Apify (LinkedIn/X scraping), Groq (AI enrichment)
- Deployment: Vercel (both frontend and backend)
cd frontend
npm install
npm run devOpen http://localhost:3000.
Environment variables:
NEXT_PUBLIC_BACKEND_URL— Backend API URLNEXT_PUBLIC_API_KEY— API key for backend requestsNEXT_PUBLIC_GA_ID— Google Analytics 4 Measurement ID (e.g.G-XXXXXXXXXX)
cd backend
npm install
npx prisma migrate deploy
npm run devEnvironment variables:
DATABASE_URL— PostgreSQL connection stringAPI_KEY— Shared API key for feed endpointsADMIN_SECRET— Bearer token for admin endpointsAPIFY_TOKEN— Apify API token for LinkedIn/X scraping (APIFY_API_KEYis accepted as a fallback)APIFY_MAX_CONCURRENT— Max simultaneous Apify runs (default 5, Apify free-plan cap)GROQ_API_KEY— Groq API key for AI-powered post enrichmentGROQ_MODEL— Optional Groq model override (defaultopenai/gpt-oss-120b)INGEST_ROLE_FAMILIES— Role families allowed into the feed, comma-separated (defaultengineering,ai_ml); see the ingest quality gates in DEPLOYMENT.mdCORS_ORIGIN— Allowed frontend origin(s), comma-separated
| Method | Endpoint | Auth | Description |
|---|---|---|---|
| GET | /api/posts/recent |
API key | Fetch filtered/sorted job feed |
| POST | /api/posts/:id/vote |
Public | Upvote/downvote a job (IP-based dedup) |
| POST | /api/submit |
Public | Submit a recruiter suggestion |
| GET | /api/admin/recruiters |
Admin | List all tracked recruiters |
| POST | /api/admin/recruiter |
Admin | Add a new recruiter |
| POST | /api/admin/scrape |
Admin | Trigger manual scrape |
| GET/POST | /api/cron/scrape |
Cron / Admin | Due scrape (batch in one request, no self-call) |
| GET | /api/admin/submissions |
Admin | List community submissions |
| POST | /api/admin/submissions/:id/approve |
Admin | Approve a submission |
| POST | /api/admin/submissions/:id/reject |
Admin | Reject a submission |
| DELETE | /api/admin/jobs |
Admin | Clear jobs (expired/all/older than N days) |
Both frontend and backend are deployed on Vercel.
- Frontend: skiptheboard.in (custom domain via GoDaddy)
- Backend: backend-umber-nu-43.vercel.app
See DEPLOYMENT.md for complete step-by-step instructions.
# Frontend
cd frontend && npx vercel --prod --yes
# Backend
cd backend && npx vercel --prod --yes