A client-side companion that turns your GitHub activity into a feedback-cycle self-review.
Pull every PR you authored, reviewed, or commented on, and every issue you opened or participated in within a date range. Then, optionally, point an AI provider at the data to generate a structured self-review with themes, headline accomplishments, and STAR stories — or ask freeform questions like "What auth work did I do?" or "Which PRs took longest to merge?"
Everything runs in your browser. No backend, no telemetry, no servers I control. Your GitHub PAT and AI key are sent directly from your browser to the respective APIs and nowhere else.
npm install
npm run devOpen the URL Vite prints (usually http://localhost:5173).
npm run buildThe build emits a static site to ./dist. Drop that folder onto any static host.
A ready-to-use Actions workflow lives at .github/workflows/deploy.yml. To turn it on:
- Push this repo to GitHub.
- On GitHub: Settings → Pages → Build and deployment → Source: GitHub Actions.
- Push to
main(or trigger the workflow manually). The action builds and publishes to Pages. - The site appears at
https://<your-username>.github.io/<repo-name>/.
The Vite config uses base: './' so the build works from any subpath without configuration.
A .nojekyll is included so Pages doesn't strip files starting with _.
- Netlify / Vercel / Cloudflare Pages — point them at the repo, build command
npm run build, publish directorydist - Self-hosted —
npx serve distor any nginx/Caddy static config
- Contributed — PRs you authored (
is:pr author:USER) - Reviewed — PRs you formally reviewed or left comments on (
reviewed-by:USER∪commenter:USER) - Issues — Issues you opened or participated in (
is:issue involves:USER)
Each view shows a stat count, expandable cards, and direct links to GitHub.
When an AI key is present, each view gets a "Generate" button that produces:
- Headline accomplishments with PR/issue links
- 2–4 themes grouping related work
- "By the numbers" paragraph
- One STAR-format story for a standout item
Plus a global Q&A bar that answers freeform questions against all your cached contributions.
- Anthropic (Claude Sonnet 4.5)
- OpenAI (GPT-4o)
- Google (Gemini 2.5 Pro)
Bring your own key for any of them.
Create a Personal Access Token with these scopes:
repo— read your private repos and orgs (usepublic_repoif you only need public access)read:org— see contributions in org reposread:user— read your own profile for the username fallback
A fine-grained PAT scoped to read-only on the orgs/repos you care about is the most secure option.
SSO orgs: If any of your orgs use SAML/SSO, go back to the tokens page after creating the token, click Configure SSO next to it, and authorize each org. Without this, contributions in those orgs are silently missing from results.
- No server. Everything is a static SPA. Your tokens go from your browser straight to
api.github.comand your AI provider's API. - Storage. Keys live in
sessionStorageby default (cleared when the tab closes). The "Remember on this device" checkbox switches tolocalStorage. The "Clear data" button on the setup screen wipes both. - No analytics, no telemetry, no third-party JS beyond Google Fonts (loaded once at startup).
- GitHub's search API caps results at 1,000 per query. For very long windows on a very active user, narrow the date range or filter by repo.
- GraphQL is used wherever cheaper than REST, but a power-user query against many repos can still consume a few hundred rate-limit points. The progress screen shows your remaining quota.
- AI calls truncate item descriptions to keep prompts compact. For very long PRs, follow the links in the AI's output for full context.
src/
App.jsx ← Top-level orchestration of the four screens
main.jsx ← Vite entry
index.css ← Tailwind + custom typography
components/
ui.jsx ← Shared primitives (Button, Input, Logo, Section)
SetupScreen.jsx ← Token entry + AI provider selection
FilterScreen.jsx ← Date range + repo type-ahead
FetchProgress.jsx ← Animated fetch progress
ResultsScreen.jsx ← Three-tab results + AI summaries + Q&A
lib/
storage.js ← localStorage/sessionStorage wrapper
github.js ← GraphQL queries + pagination
ai.js ← Provider-agnostic AI calls
MIT — do whatever you want with it.