From 214189b667c4f8b47f241bfaf19f39d98c92ea9b Mon Sep 17 00:00:00 2001 From: Diksha Dabhole Date: Mon, 11 May 2026 20:31:11 +0530 Subject: [PATCH 1/7] feat: improve watchlist UX with richer metadata, progress tracking, and personalized insights - Add watchlist metadata persistence (checklist, notes, progress) via localStorage - Display richer org cards with: category, competition level, codebase difficulty, tech stack - Add progress bar and interactive checklist for proposal preparation - Add personal notes textarea per organization - Generate personalized AI insights based on watchlist progress and top technologies - Responsive grid layout adapts to mobile/tablet/desktop - Maintains minimal code philosophy with no external dependencies --- index.html | 108 +++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 89 insertions(+), 19 deletions(-) diff --git a/index.html b/index.html index 38704d0..e7cb713 100644 --- a/index.html +++ b/index.html @@ -2073,12 +2073,56 @@

ORGS.find(o => o.name === name)).filter(Boolean); + const watchlistMeta = loadWatchlistMeta(); if (bookmarks.length === 0) { container.innerHTML = ` @@ -2100,39 +2145,64 @@

${k.replace(/_/g, ' ')}`).join(''); + const progressPct = meta.progress || 0; + const item = document.createElement('div'); - item.className = 'bg-white rounded-2xl p-6 border border-zinc-100 flex flex-col sm:flex-row gap-4 items-start hover:shadow-lg transition-all animate-fade-up'; + item.className = 'bg-white rounded-2xl p-6 border border-zinc-100 grid md:grid-cols-[1fr,240px] gap-4 hover:shadow-lg hover:border-primary/30 transition-all'; item.innerHTML = ` -
- psychology -
-
-
-

${escapeHtml(org.name)}

- Watchlisted +
+
+
+

${escapeHtml(org.name)}

+

${escapeHtml(org.cat)} • ${escapeHtml(org.competition)} • ${org.years}y

+
+ watchlisted +
+

${escapeHtml(org.desc)}

+
+ ⭐ ${org.years}y veteran + 📊 ${escapeHtml(org.competition)} + 🔧 ${escapeHtml(org.codebase)}
-

${escapeHtml(org.desc)}

-
- code ${escapeHtml(org.github)} - bar_chart ${escapeHtml(org.competition)} - +
+ ${org.tags.slice(0, 4).map(t => `${escapeHtml(t)}`).join('')} + ${org.tags.length > 4 ? `+${org.tags.length - 4}` : ''}
+ `; container.appendChild(item); attachOrgCardListeners(item); }); - // Data-driven AI Insight + // Personalized AI insights based on watchlist const allTags = bookmarks.flatMap(o => o.tags); const topTag = [...new Set(allTags)].sort((a,b) => allTags.filter(t => t===b).length - allTags.filter(t => t===a).length)[0]; - const skillFocus = topTag ? `Focus on mastering **${escapeHtml(topTag)}**` : "Start contributing to Good First Issues"; - const safeTopTag = topTag ? escapeHtml(topTag) : null; + const avgProgress = Math.round(Object.values(watchlistMeta).reduce((sum, m) => sum + (m.progress || 0), 0) / bookmarks.length); + const insight = avgProgress < 40 + ? `Keep momentum! ${avgProgress}% progress. Pick one org and read its ideas list this week.` + : `Nice start! ${avgProgress}% progress. Consider drafting a proposal for your top-fit org.`; document.getElementById('aiInsightText').innerHTML = ` - sparkles - Insight: Your watchlist highlights a strong interest in ${safeTopTag || 'diverse stacks'}. ${skillFocus} to increase your acceptance odds for GSoC 2026. + lightbulb + Watching: ${bookmarks.length} org${bookmarks.length !== 1 ? 's' : ''}. Top skill: ${escapeHtml(topTag || 'diverse')}. ${insight} `; } From 94ce9e6d8e15554eeae068e6e8fcf7519b82036a Mon Sep 17 00:00:00 2001 From: Diksha Dabhole Date: Mon, 11 May 2026 20:43:55 +0530 Subject: [PATCH 2/7] fix: add missing bookmark-btn class to remove button in watchlist cards --- index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.html b/index.html index e7cb713..d667cf2 100644 --- a/index.html +++ b/index.html @@ -2184,7 +2184,7 @@

${escapeHtml(org.name)}

    ${checklistItems}
- + `; container.appendChild(item); From 8808e3becb80cd687b4dab66236adc4c4448706b Mon Sep 17 00:00:00 2001 From: Diksha Dabhole Date: Mon, 11 May 2026 20:52:16 +0530 Subject: [PATCH 3/7] refactor: replace inline handlers with data-* attributes and delegated listeners --- index.html | 30 +++++++++++++++++++++++++----- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/index.html b/index.html index d667cf2..ca6fabe 100644 --- a/index.html +++ b/index.html @@ -721,8 +721,8 @@

event Upcoming Deadlines

-

MAR 31, 2026

Proposal Submission Deadline

Ensure your final proposals are submitted by 18:00 UTC.

-

APR 21, 2026

Review Period Starts

Mentors begin ranking of proposals.

+

MAR 31, 2026

Proposal Submission Deadline

Ensure your final proposals are submitted by 18:00 UTC.

+

APR 21, 2026

Review Period Starts

Mentors begin ranking of proposals.

@@ -1940,6 +1940,24 @@

{ const meta = getOrgMeta(watchlistMeta, org.name); - const checklistItems = Object.entries(meta.checklist).map(([k, v]) => `
  • ${k.replace(/_/g, ' ')}
  • `).join(''); + const checklistItems = Object.entries(meta.checklist).map(([k, v]) => `
  • ${k.replace(/_/g, ' ')}
  • `).join(''); const progressPct = meta.progress || 0; const item = document.createElement('div'); @@ -2183,7 +2201,7 @@

    ${escapeHtml(org.name)}

    Checklist
      ${checklistItems}
    - + `; @@ -2194,7 +2212,9 @@

    ${escapeHtml(org.name)}

    // Personalized AI insights based on watchlist const allTags = bookmarks.flatMap(o => o.tags); const topTag = [...new Set(allTags)].sort((a,b) => allTags.filter(t => t===b).length - allTags.filter(t => t===a).length)[0]; - const avgProgress = Math.round(Object.values(watchlistMeta).reduce((sum, m) => sum + (m.progress || 0), 0) / bookmarks.length); + const avgProgress = bookmarks.length > 0 + ? Math.round(bookmarks.reduce((sum, org) => sum + (watchlistMeta[org.name]?.progress || 0), 0) / bookmarks.length) + : 0; const insight = avgProgress < 40 ? `Keep momentum! ${avgProgress}% progress. Pick one org and read its ideas list this week.` : `Nice start! ${avgProgress}% progress. Consider drafting a proposal for your top-fit org.`; From 15e7b6a222c4602559d48a7f10acd00b00347675 Mon Sep 17 00:00:00 2001 From: Diksha Dabhole Date: Wed, 13 May 2026 15:42:37 +0530 Subject: [PATCH 4/7] refresh: trigger PR checks From ed67c84e21979fe17b8610d4acc78ed10e8d03c3 Mon Sep 17 00:00:00 2001 From: Diksha Dabhole Date: Wed, 13 May 2026 15:45:32 +0530 Subject: [PATCH 5/7] Resolve merge conflicts: keep watchlist + refreshOrgGridPreservingVisibleCount --- index.html | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/index.html b/index.html index ca6fabe..42262c4 100644 --- a/index.html +++ b/index.html @@ -2135,12 +2135,21 @@

    Date: Wed, 13 May 2026 17:00:17 +0530 Subject: [PATCH 7/7] fix: preserve details drawer open state on checklist toggle --- index.html | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/index.html b/index.html index 82473b3..39cebba 100644 --- a/index.html +++ b/index.html @@ -2176,6 +2176,11 @@

    ${escapeHtml(org.name)}

    ${progressPct}%

    -
    +
    Checklist
      ${checklistItems}