Analyze commit quality. Understand developer behavior. Improve your Git workflow.
Turns commit analysis from a score into a feedback system.
Actively developed. Open to feedback and improvements.
GitAnalyzer fetches commit data from any public GitHub user or repository and applies a rule-based scoring system to evaluate commit message quality. It surfaces common problems β vague language, missing structure, inconsistent style β and gives concrete suggestions to fix them.
Unlike generic linters, GitAnalyzer works at the repository level. It looks at patterns across all commits, not just a single message. It identifies a developer's commit style, flags systemic issues, and provides ranked suggestions. For logged-in users, it also offers AI-powered commit message improvements and saves analysis history across sessions.
-
Commit scoring (0β10) β Scores commit messages based on clarity, structure, and consistency
-
Sub-score breakdown β Three sub-metrics displayed alongside the main score:
- Clarity β penalizes messages that start with vague terms like
fix,update,wip, ormisc - Structure β measures what percentage of commits use typed prefixes (
feat:,fix:,chore:, etc.) - Consistency β evaluates how uniform commit quality is across the repository using score variance
- Clarity β penalizes messages that start with vague terms like
-
Confidence indicator β If a repository has fewer than 20 commits, the dashboard shows a low-confidence warning so you know the data is limited
-
Top Issues β Automatically identifies the most impactful problems:
- High rate of vague commit openers
- Missing Conventional Commits prefixes
- High score variance across contributors
- Bad commit percentage above a threshold
-
Suggested Improvements β Rule-based suggestions derived from each repository's specific weaknesses (not generic advice)
-
Developer Type classification β Categorizes commit behavior into one of four types: Night Owl Coder, Consistent Builder, Burst Committer, or Weekend Hacker β based on time-of-day and day-of-week patterns
-
Dashboard visualizations β Commit time distribution chart, commit type breakdown, score distribution bar, and history timeline
-
AI commit suggestions (logged-in users only) β Logged-in users can request an AI-rewritten version of any commit message. The AI strictly follows Conventional Commits and enforces imperative mood. This feature is gated to manage API usage and provide a personalized experience. Supported providers: Gemini, OpenRouter, Groq (with automatic fallback)
-
Persistent analysis history β Logged-in users have their repository analyses saved to Supabase. Guest sessions use localStorage
-
Authentication β Email/password sign-up and sign-in via Supabase Auth. Username is collected at registration and displayed in the navbar
-
Copy Summary β One-click button to copy a plain-text analysis summary to the clipboard
- Enter a target β Type a GitHub username (e.g.
torvalds) or a repository path (e.g.facebook/react) into the search bar - Data is fetched β The GitHub API returns up to 100 recent commits from the target
- Messages are analyzed β Each commit message is scored individually using the rule-based engine
- Insights are computed β Sub-scores, developer type, top issues, and suggestions are derived from aggregate patterns
- Dashboard renders β Results are displayed across score cards, charts, and feedback sections
- AI suggestions (logged-in only) β Users can click "Improve with AI" on any commit to get a rewritten message
- History is saved β Logged-in users have the analysis persisted to their Supabase profile for future reference
Each commit message starts at a score of 10. Points are deducted for:
| Rule | Deduction |
|---|---|
Missing Conventional Commits prefix (e.g. feat:) |
β2 |
| Subject line shorter than 10 characters | β2 |
Contains vague words (stuff, things, wip, misc) |
β2 |
| Subject does not start with an imperative verb | β1 |
| Subject ends with a period | β1 |
Score interpretation:
8β10β Good6β7β Warning0β5β Bad
Examples:
β fix bug
Score: 4/10 β missing prefix, too short, non-specific subject
β
fix(auth): remove null check in login token validator
Score: 10/10 β typed prefix, imperative verb, specific subject, correct length
βββββββββββββββββββββββββββββββββββββββββββββββ
β Browser β
β β
β React + TypeScript (Vite) β
β βββ InputSection β user/repo entry β
β βββ SummarySection β scores + insights β
β βββ CommitList β per-commit breakdown β
β βββ Playground β AI suggestion editor β
β βββ HistorySidebar β saved analyses β
ββββββββββββββββ¬βββββββββββββββββββββββββββββββ
β
βββββββββΌβββββββββ
β GitHub REST β
β API v3 β
βββββββββ¬βββββββββ
β
ββββββββββββΌβββββββββββββββ
β Rule-Based Analyzer β
β simpleAnalyzer.ts β
β - per-commit scoring β
β - sub-score aggregationβ
β - feedback generation β
ββββββββββββ¬βββββββββββββββ
β
ββββββββββββΌβββββββββββββββ
β AI Layer (optional) β
β llmService.ts β
β Gemini β OpenRouter β
β β Groq β
ββββββββββββ¬βββββββββββββββ
β
ββββββββββββΌβββββββββββββββ
β Supabase β
β - Auth (email/password)β
β - Analysis persistence β
βββββββββββββββββββββββββββ
src/
βββ components/ # Reusable UI components (React)
βββ contexts/ # React Context providers (Auth, Theme)
βββ services/ # External API integrations (GitHub, Supabase, LLMs)
βββ types/ # TypeScript type definitions
βββ utils/ # Helper functions and analysis logic
βββ App.tsx # Main application component
βββ main.tsx # Application entry point
| Layer | Technology |
|---|---|
| Framework | React 18 + TypeScript |
| Build Tool | Vite |
| Styling | Vanilla CSS with CSS custom properties |
| Data Source | GitHub REST API v3 |
| AI Providers | Google Gemini, OpenRouter, Groq |
| Auth + Database | Supabase |
| Deployment | Netlify |
| Dashboard | Commit Analysis | AI Suggestion |
|---|---|---|
![]() |
![]() |
![]() |
- Node.js β₯ 18
- A Supabase project (for auth and history)
- Optional: API keys for Gemini, OpenRouter, or Groq (for AI suggestions)
# 1. Clone the repository
git clone https://github.com/gcharpe1604/gitanalyzer.git
cd gitanalyzer
# 2. Install dependencies
npm install
# 3. Configure environment variables
cp .env.example .env
# Edit .env with your values
# 4. Start the development server
npm run dev# Supabase (required for auth and history)
VITE_SUPABASE_URL=https://your-project.supabase.co
VITE_SUPABASE_ANON_KEY=your-anon-key
# GitHub token (optional β increases rate limit from 60 to 5000 req/hr)
VITE_GITHUB_TOKEN=your_github_token
# AI providers (optional β at least one required for AI suggestions)
VITE_GEMINI_API_KEY=your_gemini_key
VITE_OPENROUTER_API_KEY=your_openrouter_key
VITE_GROQ_API_KEY=your_groq_keyThe app works without AI keys β scoring and insights are fully rule-based. AI suggestions are only activated when at least one provider key is configured and the user is signed in.
A commit message is documentation written at the moment of change β when context is freshest. Poor commit histories make code review harder, debug sessions slower, and onboarding more painful.
Tools like git blame, git bisect, and changelogs all depend on meaningful commit messages. Yet most teams treat commit messages as an afterthought.
GitAnalyzer makes the quality of commit messages visible. By scoring and surfacing patterns at the repository level, it gives developers and teams a concrete starting point for improvement β without needing to read through hundreds of commits manually.
MIT


