Techdive is a modern remote tech jobs discovery and matching platform that connects developers worldwide with high-quality remote opportunities. Find your next remote role, track applications, and manage subscriptions all in one place.
Live: techdive.space
- π Browse Jobs - Aggregate remote jobs from Remotive, Arbeitnow, and more
- π― Smart Filtering - Filter by category, experience, job type, salary range
- πΎ Save Jobs - Bookmark interesting opportunities for later
- π Track Applications - Monitor application status (applied, interviewing, accepted, rejected)
- π€ AI Recommendations - Get personalized job matches based on your skills
- π§ Email Alerts - Daily/weekly job digests tailored to your preferences
- π³ Flexible Subscriptions - Free, Pro ($9.99/month), or Enterprise plans
- π Multi-currency Support - KES, USD with Paystack/Stripe integration
- π Secure Authentication - JWT tokens, cookie-based sessions
- π Real-time Analytics - Vercel Analytics tracking user engagement
- π¨ Dark Theme UI - Modern, accessible design with Tailwind CSS
- π± Fully Responsive - Works seamlessly on mobile and desktop
- Framework: Next.js 16 with App Router
- Styling: Tailwind CSS
- State Management: Zustand
- Hosting: Vercel
- UI Components: Custom + Lucide icons
- Type Safety: TypeScript
- Runtime: Node.js
- Framework: Express 5
- Database: PostgreSQL with Prisma ORM
- Authentication: JWT + HTTP-only cookies
- Hosting: Railway
- Job Scheduling: Node.js intervals (every 6 hours)
- Payment: Paystack API integration
- Database Hosting: Neon PostgreSQL
- Email: Resend (planned)
- Analytics: Vercel Analytics
- Version Control: Git/GitHub
- Monitoring: Railway logs
techdive/
βββ frontend/ # Next.js application
β βββ app/
β β βββ (public)/ # Public pages (landing, auth, etc)
β β βββ (dashboard)/ # Protected dashboard routes
β β βββ components/ # Reusable React components
β β βββ lib/ # Utilities, hooks, API client
β β βββ layout.tsx
β βββ public/ # Static assets
β βββ package.json
β
βββ backend/ # Express API
βββ src/
β βββ controllers/ # Request handlers
β βββ routes/ # API route definitions
β βββ middleware/ # Auth, error handling, rate limiting
β βββ services/ # Business logic (payments, scraping)
β βββ lib/ # Database, utilities
β βββ index.js # Entry point
βββ prisma/ # Database schema & migrations
βββ package.json
- Node.js 22+
- npm or yarn
- PostgreSQL database
- Paystack account (for payments)
# Clone repository
git clone https://github.com/tintin-dev/techdive.git
cd techdive
# Frontend setup
cd frontend
npm install
# Backend setup (in new terminal)
cd ../backend
npm installBackend: backend/.env
# Database
DATABASE_URL=postgresql://*******
# JWT
JWT_SECRET=your_super_secret_key_here
JWT_EXPIRE=24h
# Paystack
PAYSTACK_SECRET_KEY=sk_test_xxxxx
PAYSTACK_PLAN_PRO=PLN_xxxxx
PAYSTACK_PLAN_ENTERPRISE=PLN_xxxxx
# Frontend
FRONTEND_URL=http://localhost:3000
# Admin
ADMIN_API_KEY=secret_admin_key
# Optional
AFRICA_TALKING_API_KEY=xxxxxFrontend: frontend/.env.local
NEXT_PUBLIC_API_URL=http://localhost:5000/apicd backend
# Create database
npx prisma migrate dev --name init
# Seed data (optional)
npx prisma db seed# Terminal 1: Backend (port 5000)
cd backend
npm run dev
# Terminal 2: Frontend (port 3000)
cd frontend
npm run devVisit http://localhost:3000 π
POST /api/auth/signup- Create accountPOST /api/auth/login- LoginGET /api/auth/me- Get current user
GET /api/jobs- List jobs with filtersGET /api/jobs/:id- Get job detailsPOST /api/jobs/save- Save jobPOST /api/jobs/unsave- Unsave jobGET /api/jobs/saved- Get saved jobs
GET /api/applications- List user applicationsPOST /api/applications- Apply for jobPATCH /api/applications/:id- Update application status
GET /api/subscriptions- Get subscription statusPOST /api/subscriptions/paystack/checkout- Initiate Paystack paymentPOST /api/subscriptions/payments/verify/:reference- Verify paymentPOST /api/subscriptions/cancel- Cancel subscription
GET /api/recommendations- Get personalized jobsGET /api/recommendations/trending- Trending jobs this weekGET /api/recommendations/similar/:jobId- Similar jobs
PATCH /api/users/profile- Update profileGET /api/users/preferences- Get email preferencesPATCH /api/users/preferences- Update preferencesDELETE /api/users/delete- Delete account
- User - User accounts, profiles, preferences
- Subscription - Subscription plans and billing
- Job - Job listings with details
- SavedJob - Bookmarked jobs
- JobApplication - Application tracking
- Invoice - Payment history
- JobScrapeLog - Scraper run logs
See prisma/schema.prisma for full schema.
# Login to Railway
railway login
# Link project
railway link
# Deploy
railway up
# View logs
railway logsSet environment variables in Railway dashboard.
# Push to GitHub (auto-deploys)
git push origin main
# Or manual deploy
vercel deploy --prodImportant: Set NEXT_PUBLIC_API_URL in Vercel Environment Variables!
NEXT_PUBLIC_API_URL=https://your-railway-backend.up.railway.app/apiJobs are automatically scraped every 6 hours from:
- Remotive - Remote-first jobs (https://remotive.com/api/remote-jobs)
- Arbeitnow - Tech jobs worldwide (https://www.arbeitnow.com/api/job-board-posts)
Scraper runs on backend startup and scheduled intervals.
To manually trigger:
curl -X GET http://localhost:5000/api/admin/scrape \
-H "Authorization: Bearer $ADMIN_API_KEY"- Create Account - https://paystack.com
- Create Plans
- Pro: 1899 KES
- Enterprise: 3999 KES
- Get Credentials
- Secret Key
- Plan Codes (PLN_xxx)
- Set Webhook URL (Production)
https://your-backend.up.railway.app/api/webhooks/paystack
Use Paystack test mode cards:
- Visa:
4111 1111 1111 1111 - Mastercard:
5399 8181 8181 8181 - Any expiry/CVV in test mode
- Resend - Email delivery
- Job alerts - Daily/weekly digests
- Application updates - Status changes
- Newsletter - Platform tips & updates
- Google/GitHub OAuth
- Resume upload & matching
- Interview scheduling
- Employer dashboard
- Sponsored job listings
- API access (Enterprise)
- Teams collaboration
- Mobile app (React Native)
/- Landing page with pricing/jobs- Browse all jobs/jobs/[id]- Job details/signup- Create account/login- Sign in/blog- Blog posts/faq- FAQs/contact- Contact form/privacy- Privacy policy/terms- Terms of service/cookies- Cookie policy
/dashboard- Home with stats/dashboard/jobs- Job browser/dashboard/applications- Application tracker/dashboard/saved- Saved jobs/dashboard/pricing- Upgrade plan/dashboard/profile- Edit profile/dashboard/settings- Account settings
| Variable | Required | Description |
|---|---|---|
DATABASE_URL |
β | PostgreSQL connection string |
JWT_SECRET |
β | JWT signing key |
PAYSTACK_SECRET_KEY |
β | Paystack API key |
PAYSTACK_PLAN_PRO |
β | Paystack Pro plan code |
PAYSTACK_PLAN_ENTERPRISE |
β | Paystack Enterprise plan code |
FRONTEND_URL |
β | Frontend base URL |
ADMIN_API_KEY |
β | Admin endpoint auth |
NEXT_PUBLIC_API_URL |
β | API base URL (frontend only) |
JWT_EXPIRE |
β | Token expiry (default: 24h) |
PORT |
β | Backend port (default: 5000) |
- Sign up with email
- Browse jobs on
/jobs - Click job to view details
- Save a job
- Go to dashboard
- View saved jobs
- Test subscription upgrade
- Track application status
# Run tests (coming soon)
npm test- Lighthouse Score: 76+ (Speed, SEO, Best Practices)
- LCP (Largest Contentful Paint): < 2.5s
- CLS (Cumulative Layout Shift): < 0.1
- TTL (Time to First Byte): < 1s
- Image optimization (WebP, AVIF)
- Code splitting & lazy loading
- Database query optimization
- Redis caching (planned)
- Check scraper logs:
npm run devin backend - Verify database connection:
npx prisma studio - Manually trigger scrape (see Job Scraping section)
- Check webhook URL on Paystack dashboard
- Verify
PAYSTACK_SECRET_KEYis correct - Check Railway logs for webhook errors
- Use ngrok for local testing:
ngrok http 5000
- Ensure
NEXT_PUBLIC_API_URLis set on Vercel - Backend job endpoint exists:
GET /api/jobs/:id - Redeploy frontend after env var change
- Check cookie in DevTools (Application β Cookies)
- Verify JWT secret is same on frontend and backend
- Check token expiry:
JWT_EXPIRE
- Fork the repository
- Create feature branch:
git checkout -b feature/amazing-feature - Commit changes:
git commit -m 'Add amazing feature' - Push to branch:
git push origin feature/amazing-feature - Open Pull Request
This project is licensed under the MIT License - see LICENSE file for details.
- Email: support@techdive.space
- Contact Form: https://techdive.space/contact
- GitHub Issues: Report bugs and request features
Martin - Full-stack developer in Nairobi, Kenya
- GitHub: @TintinSDev
- Portfolio: techdive.space
- Job Sources: Remotive, Arbeitnow
- Hosting: Vercel, Railway, Neon
- Payments: Paystack
- Icons: Lucide React
- Design: Tailwind CSS
May 30, 2026
Status: Live & Production Ready
Happy coding! π