Skip to content

Repository files navigation

GitMaintainer — Priority Inbox for GitHub contributors

Live app CI status TypeScript Progressive Web App

GitHub notifications tell you what happened. GitMaintainer tells you what to do next.

It combines assigned issues, watched discussions, linked pull requests, review state, comments, and staleness into one ranked inbox. Changes requested rise above work in review; work in review rises above items waiting on someone else. No manual labels or duplicate project board required.

Open the live app →

The problem

Active contributors work across repositories, issues, pull requests, email, and notifications. The important question is rarely “what changed most recently?” It is:

What is waiting on me right now?

GitMaintainer answers that with a deterministic status engine and a priority-ordered dashboard.

What it detects

Group Signals
Urgent A reviewer requested changes, or a maintainer comment needs a response
In progress A pull request is in review, ready to merge, still a draft, or has not been opened yet
Waiting The latest response means the next move belongs to someone else
Done A linked pull request was merged
Watching A discussion you joined is active, or has gone stale for 14+ days
Closed The underlying issue is closed without a merged linked pull request

The engine models 11 typed states, assigns each a stable priority, then groups the final inbox into six human-readable queues. Its edge cases are covered by 20 focused unit scenarios, including dismissed reviews, conflicting reviewer states, draft/live PR coexistence, merged PR precedence, and stale discussions.

Product highlights

  • Cross-repository priority inbox for assigned and watched issues
  • Automatic issue ↔ pull-request linking through GitHub timeline cross-references
  • Repository, status, and title filters with URL-synced state
  • Five-minute background refresh with pagination and deduplication
  • Rate-limit awareness that pauses refresh before the GitHub quota is exhausted
  • Signed, HttpOnly sessions; access tokens are never exposed to client JavaScript
  • Keyboard workflow: R refreshes, D toggles theme, ? opens shortcut help
  • Installable PWA with responsive light and dark modes

Architecture

flowchart LR
    B[React PWA] -->|signed session cookie| A[Hono API]
    A -->|OAuth token, server-side| G[GitHub GraphQL API]
    G --> Q[Assigned + watched issues]
    Q --> L[Linked PRs, reviews, comments]
    L --> E[11-state priority engine]
    E --> I[Ranked contributor inbox]
Loading

The monorepo keeps queries, domain types, UI, and API boundaries explicit:

Layer Implementation
Web React 18, TypeScript, Vite, TanStack Query, Tailwind CSS
API Hono, GitHub OAuth, Web Crypto HMAC sessions, Zod configuration
Data GitHub GraphQL search, cursor pagination, timeline cross-references
Shared packages Typed GraphQL responses, contribution states, status groups
Quality Vitest, ESLint, TypeScript project checks, GitHub Actions
Delivery Vercel web/API deployments, preview workflow, PWA manifest

Security model

  • OAuth state is generated per login and checked on callback.
  • The access token stays inside a signed, HttpOnly, SameSite=Lax cookie.
  • The browser calls a same-origin GraphQL proxy; it never reads the token.
  • API responses include secure headers and an explicit CORS allowlist.
  • The GraphQL route is protected by a per-IP request window.
  • Product behavior is read-only: the interface only queries contribution data.

The classic GitHub OAuth repo scope is requested so private-repository contributions can appear. Use a dedicated test account if you are evaluating the app with sensitive private repositories.

Run locally

Requirements

  • Node.js 18+
  • pnpm 9+
  • A GitHub OAuth App

Create an OAuth App with:

Setting Local value
Homepage URL http://localhost:5173
Authorization callback URL http://localhost:3001/api/auth/github/callback

Then start the monorepo:

git clone https://github.com/vikrantwiz02/GitMaintainer.git
cd GitMaintainer

corepack enable
pnpm install

cp apps/api/.env.example apps/api/.env
cp apps/web/.env.example apps/web/.env
# Add your GitHub OAuth credentials and a 32+ character SESSION_SECRET.

pnpm dev

Open http://localhost:5173.

Environment variables

Variable Purpose
GITHUB_CLIENT_ID OAuth application identifier
GITHUB_CLIENT_SECRET OAuth application secret; API only
SESSION_SECRET HMAC key for signed sessions; minimum 32 characters
CORS_ORIGIN Allowed frontend origin
API_URL Public API URL used to build the OAuth callback
VITE_API_URL Frontend API base URL; empty for same-origin production rewrites

Quality gates

pnpm typecheck       # TypeScript project checks across the workspace
pnpm lint            # ESLint with zero warnings allowed
pnpm test            # Vitest status-engine scenarios
pnpm build           # Production builds for every package and app

CI runs type checking, linting, tests, coverage, and both production builds on every pull request.

Repository map

GitMaintainer/
├── apps/
│   ├── web/                    React PWA and contributor dashboard
│   └── api/                    Hono OAuth and GraphQL proxy
├── packages/
│   ├── github-graphql/         Queries and response contracts
│   └── types/                  Shared domain and status types
├── tests/unit/                 Priority-engine scenarios
└── .github/workflows/          CI, preview, and deployment pipelines

Roadmap

  • Organization and repository presets
  • Notification and SLA rules per status group
  • Maintainer-team views without losing the personal inbox
  • Fine-grained GitHub App permissions

Built by Vikrant Kumar · Live app · Portfolio

About

Priority Inbox for GitHub contributors — see every issue and PR that needs your attention, ranked by urgency, in real time.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages