Skip to content

atharrva01/Gitpulse

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

53 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation



image

Your commits. Finally quantified.

GitHub activity β†’ Impact Score Β· live streaks Β· shareable proof


πŸš€ Live Demo Β Β·Β  πŸ“– Docs Β Β·Β  πŸ› Issues


GitPulse Hero Streak PRs


The problem with GitHub profiles

Your GitHub profile shows a green square for the day you renamed a variable and the same green square for the day you fixed a CVE. No weighting. No context. No way to show that 50 merged PRs across Kyverno, Hyperledger, and CNCF projects represent months of serious systems work β€” not just commit spam.

GitPulse fixes that. It pulls your real GitHub activity, runs it through a weighted Impact Score algorithm, and produces a dashboard and shareable profile that actually reflects what you've built.


✨ Features

Feature What it does
Impact Score Weighted formula: (PRs Γ— 10) + (Reviews Γ— 5) + (Issues Γ— 3) + (Comments Γ— 1) + (Streak Γ— 2). A number that means something.
Live Streak Tracking Counts every day you merged a PR or submitted a review. Calendar heatmap over 52 weeks.
Cross-Repo Dashboard Aggregates contributions across all your public repos β€” not just one project.
Public Profile Page gitpulse.dev/u/{username} β€” shareable, no login required to view.
Repository Breakdown Per-repo stats: PR count, review count, lines contributed, first and most recent contribution.
Review Latency Tracker Average time from PR open to your first review. A metric that shows you're a reliable reviewer, not just an author.
GitHub OAuth One-click login. Read-only scope. We never touch your code.
Zero-cost infra Built entirely on the free GitHub GraphQL API. No paid third-party services required.

πŸ—οΈ Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                         GitPulse                            β”‚
β”‚                                                             β”‚
β”‚   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”         β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚   β”‚  React + Vite β”‚ ──────► β”‚   Go (Fiber) REST API    β”‚   β”‚
β”‚   β”‚  TypeScript   β”‚ ◄────── β”‚                          β”‚   β”‚
β”‚   β”‚  (frontend/)  β”‚  JSON   β”‚   GitHub OAuth handler   β”‚   β”‚
β”‚   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜         β”‚   Impact Score engine    β”‚   β”‚
β”‚                             β”‚   PR sync pipeline       β”‚   β”‚
β”‚                             β”‚   Streak calculator      β”‚   β”‚
β”‚                             β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                        β”‚                    β”‚
β”‚                             β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚                             β”‚      PostgreSQL 15        β”‚   β”‚
β”‚                             β”‚  pull_requests Β· users   β”‚   β”‚
β”‚                             β”‚  reviews Β· sync_jobs     β”‚   β”‚
β”‚                             β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                                        β”‚                    β”‚
β”‚                             β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚                             β”‚   GitHub GraphQL API v4  β”‚   β”‚
β”‚                             β”‚   5,000 req/hr Β· free    β”‚   β”‚
β”‚                             β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Stack breakdown:

backend/    β†’ Go 1.22 + Fiber Β· PostgreSQL Β· GitHub GraphQL API
frontend/   β†’ React 18 + TypeScript + Vite Β· Recharts
infra/      β†’ Docker + docker-compose Β· Deployed on Render

πŸš€ Getting Started

Prerequisites

1. Clone the repo

git clone https://github.com/atharrva01/Gitpulse.git
cd Gitpulse

2. Configure environment

# backend/.env
cp backend/.env.example backend/.env
# GitHub OAuth
GITHUB_CLIENT_ID=your_client_id
GITHUB_CLIENT_SECRET=your_client_secret
GITHUB_REDIRECT_URI=http://localhost:8080/auth/callback

# Database
DATABASE_URL=postgres://user:password@localhost:5432/gitpulse

# App
JWT_SECRET=your_jwt_secret
PORT=8080
FRONTEND_URL=http://localhost:5173

3. Run with Docker (recommended)

docker-compose up --build

Frontend: http://localhost:5173
Backend: http://localhost:8080

4. Run manually

# Terminal 1 β€” backend
cd backend
go mod download
go run main.go

# Terminal 2 β€” frontend
cd frontend
npm install
npm run dev

πŸ“ Project Structure

Gitpulse/
β”œβ”€β”€ backend/
β”‚   β”œβ”€β”€ main.go              # Entry point, route registration
β”‚   β”œβ”€β”€ handlers/            # HTTP handlers (auth, dashboard, profile)
β”‚   β”œβ”€β”€ models/              # PostgreSQL models (User, PR, Review)
β”‚   β”œβ”€β”€ services/            # GitHub API sync, Impact Score engine
β”‚   β”œβ”€β”€ middleware/          # JWT auth, CORS
β”‚   └── db/                  # Migrations, connection pool
β”‚
β”œβ”€β”€ frontend/
β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”œβ”€β”€ pages/           # Dashboard, Profile, Landing
β”‚   β”‚   β”œβ”€β”€ components/      # ImpactScore, StreakCalendar, RepoCard
β”‚   β”‚   β”œβ”€β”€ hooks/           # useGitHubData, useStreak, useAuth
β”‚   β”‚   └── api/             # Typed fetch wrappers
β”‚   └── vite.config.ts
β”‚
β”œβ”€β”€ Dockerfile
β”œβ”€β”€ docker-compose.yml
└── .dockerignore

πŸ“Š The Impact Score

The score is fully transparent and versioned. No black box.

Impact Score = (PRs Merged  Γ— 10)
             + (Reviews Given Γ— 5)
             + (Issues Closed Γ— 3)
             + (PR Comments   Γ— 1)
             + (Current Streak Γ— 2)

Max: 1000 Β· Updated: every 24 hours Β· Source: GitHub GraphQL API

Why weighted this way? Merging a PR takes more sustained effort than leaving a comment. Reviews are undervalued by every other tool, GitPulse gives them real weight. Streak multiplier rewards consistency over burst activity.

The formula lives in backend/services/impact_score.go and is open to community tuning.


πŸ”Œ API Reference

All endpoints return JSON. Protected routes require Authorization: Bearer <jwt>.

GET  /auth/github              β†’ Redirect to GitHub OAuth
GET  /auth/callback            β†’ OAuth callback, issues JWT

GET  /api/me                   β†’ Full dashboard (protected)
GET  /api/me/streak            β†’ Streak + heatmap data (protected)
GET  /api/me/repos             β†’ Per-repo breakdown (protected)
GET  /api/me/wrapped/:year     β†’ OSS Wrapped data (protected)

POST /api/sync                 β†’ Trigger manual sync (protected)

GET  /api/u/:username          β†’ Public profile (no auth)
GET  /api/u/:username/badge.svg β†’ Dynamic README badge (no auth)

GET  /api/maintainer/repo/:owner/:name β†’ Project health (protected)
POST /api/maintainer/repos     β†’ Watch a repository (protected)

🌐 Deployment

GitPulse is deployed on Render (free tier).

Backend: Render Web Service , Go binary, auto-deploy on push to main
Database: Render PostgreSQL , 1GB free
Frontend: Vercel , static React build, CDN edge deployment

To deploy your own instance:

# Build the Docker image
docker build -t gitpulse .

# Or deploy to Render directly
# 1. Connect your fork to Render
# 2. Set environment variables in Render dashboard
# 3. Push to main β€” Render auto-deploys

🀝 Contributing

Contributions are welcome. GitPulse is built for the open source community, it should be shaped by it.

# Fork and clone
git clone https://github.com/YOUR_USERNAME/Gitpulse.git

# Create a feature branch
git checkout -b feat/your-feature

# Make your changes, then open a PR
# PR description should include: what changed, why, and how to test it

Check open issues for good first contributions. If you're adding a new metric or changing the Impact Score formula, open a discussion first.


πŸ”’ Privacy

  • GitPulse only requests read-only GitHub OAuth scopes (read:user, public_repo)
  • We only fetch data that is already public on GitHub
  • Access tokens are encrypted at rest
  • No private repository data is ever accessed
  • You can delete your account and all associated data at any time

πŸ“„ License

MIT - use it, fork it, build on it.


Built with obsession by atharrva01
50+ merged PRs across CNCF, Hyperledger, and Linux Foundation projects Β· and counting

If GitPulse helped you prove your open source impact, star the repo.
⭐

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors