React + TypeScript + Vite app that surfaces trending GitHub repositories with rich filtering, sorting, personalization, and discovery. Fully client-side — user provides their own GitHub PAT via Settings.
| Layer | Choice |
|---|---|
| Framework | React 19 + Vite 7 |
| Styling | Tailwind CSS 3 |
| Data Fetching | TanStack Query 5 (infinite scroll) |
| Routing | React Router 7 |
| Testing | Vitest 4 + React Testing Library + MSW 2 |
- REST search for repo listing (
/search/repositories), GraphQL for enrichment (PR counts, contributor data, README text) - Filter/sort state in URL search params — every combination is bookmarkable
- localStorage for personalization (bookmarks, collections, followed topics, ignore list, theme, PAT)
- No backend — PAT stored in localStorage, never sent anywhere except GitHub
- Client-side license filtering for "Open Source Only" / "No License" (GitHub API doesn't support
license:nullorORbetween qualifiers) stars:>=Nreplaces defaultstars:>50— GitHub ignores duplicate star qualifiers- Ignored languages use separate
-language:Xper language (not grouped)
license:nullis not a valid qualifier (returns 422)- GitHub REST search does not support
ORbetween qualifiers - Repeated
stars:qualifiers — only the first is used - Time range maxes at 30 days — beyond that
pushed:>date stars:>50 sort:starsreturns all-time popular repos
- Dark mode default, light toggle (persisted)
- Responsive: 1-col mobile, 2-col tablet, 3-col desktop
- Skeleton loading, error states with retry, empty states with reset CTA
- All interactive elements keyboard-navigable with ARIA labels
- Auto commit/push: After each feature, suggest commit+push. When user says "ok", do it.
- DONE.md changelog: Log every change at project root.
- Check README after every feature add/remove — scan for mentions in feature lists, structure, test counts.
- Run
tsc --noEmitafter multi-file refactors before committing. grepfor cross-file references before deleting any type, function, or file.
- Orphaned
try/catchblocks — when removing code inside atry, always verify the structure is still valid. A lonetry {withoutcatch/finallybreaks the file. - Always check README after feature additions/removals — scan for mentions: feature lists, project structure, test counts, descriptions. Don't wait to be told.
- Run typecheck after multi-file refactors —
tsc --noEmitcatches syntax errors that grep-based edits miss. grepfor cross-file references before deleting — search the entire codebase for imports and usages first. Don't rely on memory.- Verify
try/catchnesting after edits — nested try/catch blocks ingithub.tsare fragile. Check indentation and block boundaries.