Swipe right to contribute, left to skip, or bookmark issues for later β all while earning XP, maintaining streaks, and climbing the developer ranks.
Code. Create. Conquer.
Demo GIF / screenshots coming soon β swipe feed, onboarding, and admin dashboard previews will go here.
- Features
- Getting Started
- Project Structure
- Match Scoring Algorithm
- XP & Rank System
- Environment Variables
- Available Scripts
- Tech Stack
- Deployment
- Contributing
- License
| Feature | Description |
|---|---|
| π Swipe Feed | Tinder-style drag-to-swipe card interface powered by Framer Motion |
| π§ Smart Matching | Scoring engine matches issues to your languages, interests & skill level |
| π Gamification | XP system, 5 developer ranks, daily streak tracking |
| π Saved Matches | Bookmark issues and track your contribution workflow (Opened β PR β Merged) |
| π GitHub Sync | Live GraphQL API sync for good first issue and help wanted labels |
| π€ GitHub OAuth | Secure login with JWT session management |
| π Admin Dashboard | Platform analytics: swipe ratios, popular tech, most-swiped repos |
| π Dev Mode | Full local development with mock auth β no GitHub OAuth app required |
- Node.js 20+
- npm or pnpm
git clone https://github.com/Demon-Die/issueswipe.git
cd issueswipe
npm installcp .env.example .envEdit .env with your values. For local development, leave NEXT_PUBLIC_DEV_MODE="true" and skip the GitHub OAuth setup entirely.
# Push schema to SQLite
npx prisma db push
# Seed with sample repositories, issues, and users
npx prisma db seednpm run devOpen http://localhost:3000 β you'll be automatically logged in as the mock developer account.
issueswipe/
βββ prisma/
β βββ schema.prisma # Database models
β βββ seed.ts # Sample data seeder
βββ src/
β βββ app/
β β βββ api/ # Next.js API Route Handlers
β β β βββ auth/ # GitHub OAuth + session endpoints
β β β βββ issues/ # Feed API with match scoring
β β β βββ matches/ # Saved issues CRUD
β β β βββ profile/ # User profile + onboarding
β β β βββ swipe/ # Swipe registration + XP
β β β βββ sync/ # GitHub GraphQL sync trigger
β β β βββ admin/ # Analytics dashboard API
β β βββ swipe/ # Swipe feed page
β β βββ onboarding/ # User preference setup
β β βββ matches/ # Saved matches page
β β βββ profile/ # User profile page
β β βββ admin/ # Admin dashboard page
β βββ components/
β β βββ LandingPage.tsx
β β βββ Navbar.tsx
β β βββ SwipeFeed.tsx
β β βββ OnboardingForm.tsx
β β βββ SavedMatches.tsx
β β βββ UserProfile.tsx
β β βββ AdminDashboard.tsx
β βββ lib/
β βββ auth.ts # JWT session management
β βββ db.ts # Prisma client singleton
β βββ github.ts # GitHub GraphQL sync
β βββ matching.ts # Issue match scoring algorithm
β βββ xp.ts # XP & rank computation
Issues are scored 0β100 based on:
| Factor | Max Points |
|---|---|
| Language match (repo language == user language) | 30 |
| Interest match (labels/title keywords vs user interests) | 25 |
| Difficulty/experience alignment | 20 |
good first issue / help wanted labels |
15 |
| Repository star count (popularity bonus) | 10 |
| Action | XP Gained |
|---|---|
| Save an issue | +10 XP |
| Swipe right (Contribute) | +25 XP |
| Submit a PR | +100 XP |
| Get a PR Merged | +250 XP |
| Rank | XP Required |
|---|---|
| New Contributor | 0 β 100 |
| Issue Hunter | 101 β 500 |
| PR Warrior | 501 β 1,500 |
| Merge Machine | 1,501 β 5,000 |
| Open Source Legend | 5,001+ |
See .env.example for the full list. Key variables:
| Variable | Description |
|---|---|
DATABASE_URL |
SQLite connection string (default: file:./dev.db) |
GITHUB_CLIENT_ID |
GitHub OAuth App Client ID |
GITHUB_CLIENT_SECRET |
GitHub OAuth App Client Secret |
GITHUB_PERSONAL_ACCESS_TOKEN |
For live issue sync (optional, falls back to simulation) |
JWT_SECRET |
Secret key for signing session JWTs |
NEXT_PUBLIC_DEV_MODE |
Set "true" to skip OAuth and use a mock dev account |
| Command | Description |
|---|---|
npm run dev |
Start the development server |
npm run build |
Create a production build |
npm run start |
Run the production build locally |
npm run lint |
Run ESLint across the codebase |
npx prisma studio |
Open Prisma's visual database editor |
npx prisma db push |
Sync the schema to the database |
npx prisma db seed |
Seed the database with sample data |
- Framework: Next.js 16 (App Router)
- Language: TypeScript 5
- Database: SQLite via Prisma 7 +
better-sqlite3 - Animations: Framer Motion 12
- Styling: Tailwind CSS v4 (custom dark theme)
- Icons: Lucide React
- Auth: GitHub OAuth 2.0 + JWT (via
jose)
IssueSwipe deploys cleanly to Vercel:
- Push your fork/branch to GitHub
- Import the repo into Vercel
- Add the environment variables from
.env.examplein the Vercel project settings - For production, swap SQLite for a hosted database (e.g. Turso or PostgreSQL via Prisma) and update
DATABASE_URLaccordingly βbetter-sqlite3is intended for local/dev use
IssueSwipe is built in the open under the Demon-Die organization and proudly participates in GSSoC'26 (GirlScript Summer of Code). Contributions of all sizes are welcome!
- Find an issue β check the Issues tab for anything labeled
gssoc26,good first issue, orhelp wanted - Get assigned β comment on the issue asking to be assigned; please wait for a maintainer to assign it to you before starting work
- Fork & branch β fork the repo and create a feature branch (
feature/short-description) - Code β follow the existing project structure and lint rules (
npm run lintbefore committing) - Commit β use clear, conventional commit messages (e.g.
feat: add streak freeze logic) - Open a PR β target
main, reference the issue number (Closes #123), and describe what changed and how to test it
Please don't open issues and immediately self-assign/PR against them β let a maintainer review and assign first, in line with GSSoC contribution etiquette.
For larger features or architectural changes, open an issue to discuss before submitting a PR.
MIT Β© Demon-Die
Built with π₯ by the Demon-Die team Β· Code. Create. Conquer.