@@ -56,6 +56,190 @@ const builderFieldOrder = [
5656 "releaseTag" ,
5757] ;
5858
59+ const searchExplorerSections = [
60+ {
61+ title : "Custom GitHub Searches" ,
62+ items : [
63+ { title : "Paid Bounties" , emoji : "💲" , query : "type:issue state:open label:bounty" , searchType : "issues" } ,
64+ {
65+ title : "Documentation Issues" ,
66+ emoji : "📄" ,
67+ query : "type:issue state:open label:documentation" ,
68+ searchType : "issues" ,
69+ } ,
70+ {
71+ title : "Good First Issues" ,
72+ emoji : "🥇" ,
73+ query : 'type:issue state:open label:"good first issue"' ,
74+ searchType : "issues" ,
75+ } ,
76+ {
77+ title : "Help Wanted Issues" ,
78+ emoji : "🆘" ,
79+ query : 'type:issue state:open label:"help wanted"' ,
80+ searchType : "issues" ,
81+ } ,
82+ ] ,
83+ } ,
84+ {
85+ title : "Find Repositories" ,
86+ items : [
87+ {
88+ title : "Find boilerplates & starter kits" ,
89+ emoji : "✅" ,
90+ query : '"starter template" vite react' ,
91+ searchType : "repositories" ,
92+ } ,
93+ {
94+ title : "Find repos using specific tools" ,
95+ emoji : "🧰" ,
96+ query : 'vite react "gh-pages"' ,
97+ searchType : "repositories" ,
98+ } ,
99+ {
100+ title : "Find experimental / weird projects" ,
101+ emoji : "⭐" ,
102+ query : "topic:creative-coding stars:<100" ,
103+ searchType : "repositories" ,
104+ } ,
105+ {
106+ title : "Find weird projects by phrase" ,
107+ emoji : "🧪" ,
108+ query : '"weird project" stars:<50' ,
109+ searchType : "repositories" ,
110+ } ,
111+ {
112+ title : "Find small, under-the-radar gems" ,
113+ emoji : "💎" ,
114+ query : "stars:10..50 pushed:>2026-01-01" ,
115+ searchType : "repositories" ,
116+ } ,
117+ {
118+ title : "Find trending repos" ,
119+ emoji : "💖" ,
120+ query : "stars:>1000 created:>2026-04-01" ,
121+ searchType : "repositories" ,
122+ } ,
123+ {
124+ title : "Find repos by tech + popularity" ,
125+ emoji : "🧩" ,
126+ query : "topic:streamlit stars:>100" ,
127+ searchType : "repositories" ,
128+ } ,
129+ {
130+ title : "Find repos with specific features" ,
131+ emoji : "📝" ,
132+ query : '"markdown editor" react' ,
133+ searchType : "repositories" ,
134+ } ,
135+ { title : "Find repos with demos" , emoji : "🎬" , query : '"live demo" github.io' , searchType : "repositories" } ,
136+ {
137+ title : "Find repos with contribution guides" ,
138+ emoji : "🤝" ,
139+ query : '"CONTRIBUTING.md" stars:<200' ,
140+ searchType : "repositories" ,
141+ } ,
142+ {
143+ title : "Find repos with real usage (stars + forks)" ,
144+ emoji : "📦" ,
145+ query : "stars:>50 forks:>20" ,
146+ searchType : "repositories" ,
147+ } ,
148+ {
149+ title : "Find abandoned but popular repos" ,
150+ emoji : "🏚️" ,
151+ query : "stars:>100 pushed:<2025-01-01" ,
152+ searchType : "repositories" ,
153+ } ,
154+ {
155+ title : "Find early-stage trending repos" ,
156+ emoji : "🚀" ,
157+ query : "stars:20..200 created:>2026-01-01" ,
158+ searchType : "repositories" ,
159+ } ,
160+ { title : "Find tools by GitHub Topics" , emoji : "📫" , query : "topic:email-builder" , searchType : "repositories" } ,
161+ ] ,
162+ } ,
163+ {
164+ title : "Find People" ,
165+ items : [
166+ {
167+ title : "Find collaborators or interesting devs" ,
168+ emoji : "👋" ,
169+ query : "followers:>100 location:portland language:JavaScript" ,
170+ searchType : "users" ,
171+ } ,
172+ {
173+ title : "Find people building lots of small projects" ,
174+ emoji : "🧠" ,
175+ query : "repos:>20 followers:<200" ,
176+ searchType : "users" ,
177+ } ,
178+ {
179+ title : "Find niche experts" ,
180+ emoji : "🎯" ,
181+ query : "language:TypeScript repos:>5 followers:>20" ,
182+ searchType : "users" ,
183+ } ,
184+ { title : "Find local developers" , emoji : "📍" , query : "location:portland language:JavaScript" , searchType : "users" } ,
185+ { title : "Find indie builders" , emoji : "🛠️" , query : "followers:<200 repos:>15" , searchType : "users" } ,
186+ ] ,
187+ } ,
188+ {
189+ title : "Find Issues" ,
190+ items : [
191+ {
192+ title : "Find ignored issues (low competition)" ,
193+ emoji : "👻" ,
194+ query : "type:issue state:open comments:0" ,
195+ searchType : "issues" ,
196+ } ,
197+ {
198+ title : "Find high-demand feature requests" ,
199+ emoji : "🔥" ,
200+ query : "type:issue state:open label:enhancement reactions:>10" ,
201+ searchType : "issues" ,
202+ } ,
203+ {
204+ title : "Find bugs nobody is working on" ,
205+ emoji : "🐛" ,
206+ query : "type:issue state:open label:bug no:assignee" ,
207+ searchType : "issues" ,
208+ } ,
209+ { title : "Find stale issues" , emoji : "🕰️" , query : "type:issue state:open updated:<2026-01-01" , searchType : "issues" } ,
210+ {
211+ title : "Find discussions about specific problems" ,
212+ emoji : "💬" ,
213+ query : '"github pages" "vite" type:issue' ,
214+ searchType : "issues" ,
215+ } ,
216+ ] ,
217+ } ,
218+ {
219+ title : "Find Code Patterns" ,
220+ items : [
221+ { title : "Find repos needing work (TODOs in code)" , emoji : "🛠️" , query : '"TODO" in:file stars:<100' , searchType : "code" } ,
222+ { title : "Find markdown-heavy projects" , emoji : "🧾" , query : 'extension:md "##"' , searchType : "code" } ,
223+ { title : "Find contenteditable implementations" , emoji : "✏️" , query : '"contenteditable" "onInput"' , searchType : "code" } ,
224+ { title : "Find drag-and-drop implementations" , emoji : "🖱️" , query : '"dragstart" "drop"' , searchType : "code" } ,
225+ { title : "Find file upload patterns" , emoji : "📤" , query : '"type=\\"file\\"" "onChange"' , searchType : "code" } ,
226+ { title : "Find API call patterns" , emoji : "🌐" , query : '"fetch(" "POST"' , searchType : "code" } ,
227+ {
228+ title : "Find reusable components" ,
229+ emoji : "🧩" ,
230+ query : '"export function" "component" language:TypeScript' ,
231+ searchType : "code" ,
232+ } ,
233+ { title : "Find projects built just for fun" , emoji : "🎲" , query : '"just for fun" stars:<100' , searchType : "repositories" } ,
234+ ] ,
235+ } ,
236+ ] ;
237+
238+ function buildGitHubSearchUrl ( query , searchType ) {
239+ const params = new URLSearchParams ( { q : query , type : searchType } ) ;
240+ return `https://github.com/search?${ params . toString ( ) } ` ;
241+ }
242+
59243function generateProfileLinks ( username ) {
60244 if ( ! username ) return [ ] ;
61245 return dedupeByUrl (
@@ -371,6 +555,7 @@ export default function GitHubPowerLinksGenerator() {
371555 } ) ;
372556 const [ builderError , setBuilderError ] = useState ( "" ) ;
373557 const [ builderCopiedKey , setBuilderCopiedKey ] = useState ( "" ) ;
558+ const [ searchCopiedKey , setSearchCopiedKey ] = useState ( "" ) ;
374559
375560 const cleanUsername = parseUsername ( username ) ;
376561 const cleanRepo = parseRepo ( repo ) ;
@@ -514,6 +699,13 @@ export default function GitHubPowerLinksGenerator() {
514699 setTimeout ( ( ) => setBuilderCopiedKey ( "" ) , 1200 ) ;
515700 }
516701
702+ async function copySearchValue ( key , value ) {
703+ const ok = await copyToClipboard ( value ) ;
704+ if ( ! ok ) return ;
705+ setSearchCopiedKey ( key ) ;
706+ setTimeout ( ( ) => setSearchCopiedKey ( "" ) , 1200 ) ;
707+ }
708+
517709 return (
518710 < div className = "min-h-screen bg-zinc-100 text-zinc-900" >
519711 < div className = "mx-auto w-full max-w-[1700px] px-4 py-8 sm:px-6 lg:px-8" >
@@ -547,6 +739,14 @@ export default function GitHubPowerLinksGenerator() {
547739 >
548740 Builder
549741 </ button >
742+ < button
743+ onClick = { ( ) => handleModeChange ( "searchExplorer" ) }
744+ className = { `rounded-xl px-4 py-2 text-sm font-semibold ${
745+ mode === "searchExplorer" ? "bg-zinc-900 text-white" : "text-zinc-700"
746+ } `}
747+ >
748+ Search Explorer
749+ </ button >
550750 </ div >
551751 </ div >
552752
@@ -663,7 +863,7 @@ export default function GitHubPowerLinksGenerator() {
663863 ) }
664864 < TestCasesPanel />
665865 </ >
666- ) : (
866+ ) : mode === "builder" ? (
667867 < div className = "grid gap-8 lg:grid-cols-[minmax(0,1fr)_minmax(0,1fr)] 2xl:grid-cols-[minmax(0,1.08fr)_minmax(0,1fr)]" >
668868 < section className = "rounded-3xl border-4 border-zinc-900 bg-white p-6 shadow-[8px_8px_0_0_#18181b]" >
669869 < h2 className = "text-2xl font-black" > Build link</ h2 >
@@ -863,6 +1063,73 @@ export default function GitHubPowerLinksGenerator() {
8631063 </ div >
8641064 </ section >
8651065 </ div >
1066+ ) : (
1067+ < div className = "space-y-6" >
1068+ < div className = "rounded-3xl border-4 border-zinc-900 bg-white p-6 shadow-[8px_8px_0_0_#18181b]" >
1069+ < h2 className = "text-2xl font-black" > Link Explorer</ h2 >
1070+ < p className = "mt-1 text-sm text-zinc-600" >
1071+ Curated GitHub search queries for finding issues, repos, code patterns, and people faster.
1072+ </ p >
1073+ </ div >
1074+
1075+ { searchExplorerSections . map ( ( section ) => (
1076+ < section
1077+ key = { section . title }
1078+ className = "rounded-3xl border-4 border-zinc-900 bg-white p-6 shadow-[8px_8px_0_0_#18181b]"
1079+ >
1080+ < h3 className = "text-xl font-black" > { section . title } </ h3 >
1081+ < div className = "mt-4 grid gap-4 md:grid-cols-2" >
1082+ { section . items . map ( ( item ) => {
1083+ const url = buildGitHubSearchUrl ( item . query , item . searchType ) ;
1084+ return (
1085+ < article key = { `${ section . title } -${ item . title } ` } className = "rounded-2xl border-2 border-zinc-300 p-4" >
1086+ < div className = "text-sm font-black" >
1087+ < span className = "mr-2" > { item . emoji } </ span >
1088+ { item . title }
1089+ </ div >
1090+ < a
1091+ href = { url }
1092+ target = "_blank"
1093+ rel = "noreferrer"
1094+ className = "mt-2 inline-flex break-all text-sm font-semibold text-blue-700 underline"
1095+ >
1096+ { item . query }
1097+ </ a >
1098+ < pre className = "mt-3 overflow-x-auto rounded-xl border border-zinc-300 bg-zinc-50 p-3 text-xs" >
1099+ { item . query }
1100+ </ pre >
1101+ < div className = "mt-3 flex flex-wrap gap-2" >
1102+ < button
1103+ onClick = { ( ) => copySearchValue ( `query-${ item . title } ` , item . query ) }
1104+ className = "inline-flex items-center gap-2 rounded-xl border-2 border-zinc-900 px-3 py-2 text-xs font-semibold"
1105+ >
1106+ < CopyIcon size = { 14 } />
1107+ { searchCopiedKey === `query-${ item . title } ` ? "Copied query" : "Copy query" }
1108+ </ button >
1109+ < button
1110+ onClick = { ( ) => copySearchValue ( `url-${ item . title } ` , url ) }
1111+ className = "inline-flex items-center gap-2 rounded-xl border-2 border-zinc-900 px-3 py-2 text-xs font-semibold"
1112+ >
1113+ < CopyIcon size = { 14 } />
1114+ { searchCopiedKey === `url-${ item . title } ` ? "Copied link" : "Copy link" }
1115+ </ button >
1116+ < a
1117+ href = { url }
1118+ target = "_blank"
1119+ rel = "noreferrer"
1120+ className = "inline-flex items-center gap-2 rounded-xl border-2 border-zinc-900 px-3 py-2 text-xs font-semibold"
1121+ >
1122+ < ExternalLinkIcon size = { 14 } />
1123+ Open
1124+ </ a >
1125+ </ div >
1126+ </ article >
1127+ ) ;
1128+ } ) }
1129+ </ div >
1130+ </ section >
1131+ ) ) }
1132+ </ div >
8661133 ) }
8671134 </ div >
8681135 </ div >
0 commit comments