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.
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.
| 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.
- 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:
Rrefreshes,Dtoggles theme,?opens shortcut help - Installable PWA with responsive light and dark modes
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]
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 |
- OAuth state is generated per login and checked on callback.
- The access token stays inside a signed,
HttpOnly,SameSite=Laxcookie. - 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
reposcope is requested so private-repository contributions can appear. Use a dedicated test account if you are evaluating the app with sensitive private repositories.
- 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 devOpen http://localhost:5173.
| 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 |
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 appCI runs type checking, linting, tests, coverage, and both production builds on every pull request.
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
- 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