Track GitHub issues. Watch labels. Get notified — email, push, in-app.
Stop manually refreshing GitHub. IssuePulse watches repos on your behalf — when a new issue appears with a label you care about, you get notified instantly.
You add → owner/repo + labels to watch
IssuePulse polls → every 10 min via Vercel Cron
New issue found → email + browser push + in-app bell
┌─────────────────────────────────────────────────────────────┐
│ Browser (You) │
│ Dashboard · Repo Detail · Settings │
└────────────────────┬────────────────────────────────────────┘
│ HTTPS
┌────────────────────▼────────────────────────────────────────┐
│ Next.js 16 App Router │
│ │
│ /api/repos → CRUD tracked repos │
│ /api/repos/[id]/labels → manage label subscriptions │
│ /api/notifications → read / mark as read │
│ /api/web-push → subscribe / unsubscribe browser │
│ /api/cron/poll-issues ← Vercel Cron every 10 min │
└───┬──────────┬───────────┬───────────┬───────────┬──────────┘
│ │ │ │ │
Prisma Octokit Resend web-push Clerk
(Supabase) (GitHub) (Email) (Browser (Auth)
Push)
| Framework | Next.js 16 · App Router · TypeScript |
| Auth | Clerk (GitHub OAuth + Email) |
| Database | Supabase PostgreSQL + Prisma ORM |
| UI | Tailwind CSS v4 · shadcn/ui · Framer Motion |
| Resend | |
| Push | Web Push API (VAPID) |
| GitHub API | Octokit REST |
| Cron | Vercel Cron Jobs |
| Service | What you need | Link |
|---|---|---|
| Clerk | Publishable key + Secret key | dashboard.clerk.com |
| Supabase | PostgreSQL connection string | supabase.com → Project → Settings → Database |
| Resend | API key + sender email | resend.com |
| GitHub | Personal Access Token (optional) | github.com/settings/tokens |
Generate VAPID keys locally once:
npx web-push generate-vapid-keys
# → copy NEXT_PUBLIC_VAPID_PUBLIC_KEY and VAPID_PRIVATE_KEYGenerate a cron secret:
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"# Run once locally before/after deploying
npx prisma db pushClick Deploy with Vercel above or:
npm i -g vercel
vercel --prodGo to Project → Settings → Environment Variables and add:
| Variable | Where to get it |
|---|---|
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY |
Clerk Dashboard |
CLERK_SECRET_KEY |
Clerk Dashboard |
NEXT_PUBLIC_CLERK_SIGN_IN_URL |
/sign-in |
NEXT_PUBLIC_CLERK_SIGN_UP_URL |
/sign-up |
NEXT_PUBLIC_CLERK_AFTER_SIGN_IN_URL |
/dashboard |
NEXT_PUBLIC_CLERK_AFTER_SIGN_UP_URL |
/dashboard |
DATABASE_URL |
Supabase → Database → Connection string (pooled) |
GITHUB_TOKEN |
GitHub PAT (read:public_repo scope) |
RESEND_API_KEY |
Resend dashboard |
RESEND_FROM_EMAIL |
Your verified sender email |
NEXT_PUBLIC_VAPID_PUBLIC_KEY |
From npx web-push generate-vapid-keys |
VAPID_PRIVATE_KEY |
From npx web-push generate-vapid-keys |
CRON_SECRET |
Any random 32-char hex string |
In Clerk Dashboard → Redirect URLs, add your Vercel domain:
https://your-app.vercel.app
https://your-app.vercel.app/sign-in
https://your-app.vercel.app/sign-up
https://your-app.vercel.app/dashboard
The cron job (vercel.json) runs automatically every 10 minutes on Vercel's infrastructure.
git clone https://github.com/abhay-codes07/issuepulse.git
cd issuepulse
npm install
cp .env.example .env.local
# fill in .env.local
npx prisma db push # push schema once
npm run dev # http://localhost:3000src/
├── app/
│ ├── page.tsx # Landing
│ ├── dashboard/
│ │ ├── page.tsx # Issue feed
│ │ ├── [owner]/[repo]/page.tsx # Repo detail
│ │ └── settings/page.tsx # Notification settings
│ └── api/
│ ├── repos/ # CRUD
│ ├── notifications/ # Read / ack
│ ├── web-push/ # Push subscribe
│ └── cron/poll-issues/ # ← Vercel runs this
├── components/
│ ├── notification-bell.tsx
│ ├── add-repo-modal.tsx
│ ├── label-selector.tsx
│ └── onboarding.tsx
└── lib/
├── github.ts # Octokit
├── email.ts # Resend
└── push.ts # Web Push
MIT
