feat: add tech stack tags to Good First Issues closes #632#1959
feat: add tech stack tags to Good First Issues closes #632#1959tanyachoubey1 wants to merge 1 commit into
Conversation
|
@tanyachoubey1 is attempting to deploy a commit to the s3dfx-cyber's projects Team on Vercel. A member of the Team first needs to authorize it. |
👋 Thanks for opening a PR, @tanyachoubey1!Your PR has entered the 🚦 PR Review Pipeline.
🔄 Review Flow
A pipeline status comment may appear automatically as your PR progresses. ✅ Contributor Checklist
|
💬 Faster Reviews & AssignmentsHi @tanyachoubey1, for faster coordination and smoother communication, consider joining our Discord community: Useful Channels
|
|
|
✅ DCO Sign-off VerifiedHi @tanyachoubey1 👋 All commits in this PR contain valid Thank you for following the DCO requirements 🚀 |
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (1)
📜 Recent review details
|
| Layer / File(s) | Summary |
|---|---|
Conditional tech stack strip in issue cards src/js/app.js |
The Good First Issues card template renders a flex tag strip from issue.tech_stack when populated, limited to the first three items, and renders nothing otherwise. |
Estimated code review effort
🎯 1 (Trivial) | ⏱️ ~2 minutes
Poem
I hopped by the issue list, so neat and bright,
With tech stack tags to guide each bite of light.
Three little labels, soft as clover dew,
A bunny-friendly clue for what to pursue.
🐰✨
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
| Check name | Status | Explanation |
|---|---|---|
| Title check | ✅ Passed | The title accurately summarizes the main change by adding tech stack tags to Good First Issues. |
| Description check | ✅ Passed | The description matches the implemented Good First Issues tech stack tags and the linked issue. |
| Linked Issues check | ✅ Passed | The change satisfies #632 by surfacing tech stack information on Good First Issues cards. |
| Out of Scope Changes check | ✅ Passed | No clearly unrelated code changes are present beyond the requested Good First Issues tech stack tags. |
| Docstring Coverage | ✅ Passed | Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%. |
✨ Finishing Touches
🧪 Generate unit tests (beta)
- Create PR with unit tests
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.
Comment @coderabbitai help to get the list of available commands.
🤖 TENET Agent Review📋 SummaryThis pull request introduces a new feature to display tech stack tags on "Good First Issues" cards within 🔐 Security Findings
🧹 Code Quality
✅ What's Done Well
📝 Overall Verdict[REQUEST CHANGES] - A potential XSS vulnerability due to unsanitized data rendering needs to be addressed. |
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/js/app.js`:
- Around line 1775-1781: The tech stack chip block in the app.js render path is
being returned as a plain string inside safeHTML, so the div/span markup is
escaped instead of rendered. Update the issue.tech_stack branch to build the
chips using safeHTML fragments rather than a raw template string, and add an
Array.isArray check before slicing/mapping issue.tech_stack. Keep the fix
localized to the tech stack rendering logic in the issue card/template code so
the chips render as real HTML.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 3f7b9bb2-8303-4b8d-8e79-dab8a9c7e1df
📒 Files selected for processing (1)
src/js/app.js
📜 Review details
⏰ Context from checks skipped due to timeout. (1)
- GitHub Check: cubic · AI code reviewer
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2026-06-15T18:15:28.688Z
Learnt from: arghya29
Repo: S3DFX-CYBER/GSoC-Org-Finder- PR: 1882
File: src/js/footer.js:33-33
Timestamp: 2026-06-15T18:15:28.688Z
Learning: In this repo’s JavaScript (e.g., footer.js), `globalThis` is intentionally preferred over `window` to keep code environment-agnostic and to satisfy SonarCloud static analysis. The project targets modern browsers (ES2021) with no transpilation, so `globalThis` is fully supported—do not flag `globalThis` usage as a browser compatibility concern or suggest replacing it with `window` during review.
Applied to files:
src/js/app.js
🪛 GitHub Check: SonarCloud Code Analysis
src/js/app.js
[warning] 1775-1775: Prefer using an optional chain expression instead, as it's more concise and easier to read.
| ${issue.tech_stack && issue.tech_stack.length ? | ||
| `<div class="flex flex-wrap gap-1 mt-1"> | ||
| ${issue.tech_stack.slice(0,3).map(t => | ||
| `<span class="text-[10px] px-2 py-0.5 bg-blue-100 dark:bg-blue-900 text-blue-700 dark:text-blue-300 rounded-full font-mono">${t}</span>` | ||
| ).join('')} | ||
| </div>` | ||
| : ''} |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Tech stack chips are currently escaped, not rendered (Line 1775).
Because this branch returns a plain string inside safeHTML, the <div>/<span> markup is HTML-escaped and shown as text instead of tags. Build this block with safeHTML fragments (and Array.isArray guard) so chips render correctly.
Suggested fix
- ${issue.tech_stack && issue.tech_stack.length ?
- `<div class="flex flex-wrap gap-1 mt-1">
- ${issue.tech_stack.slice(0,3).map(t =>
- `<span class="text-[10px] px-2 py-0.5 bg-blue-100 dark:bg-blue-900 text-blue-700 dark:text-blue-300 rounded-full font-mono">${t}</span>`
- ).join('')}
- </div>`
-: ''}
+ ${Array.isArray(issue.tech_stack) && issue.tech_stack.length
+ ? safeHTML`<div class="flex flex-wrap gap-1 mt-1">
+ ${issue.tech_stack.slice(0, 3).map(t =>
+ safeHTML`<span class="text-[10px] px-2 py-0.5 bg-blue-100 dark:bg-blue-900 text-blue-700 dark:text-blue-300 rounded-full font-mono">${t}</span>`
+ )}
+ </div>`
+ : ''}📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| ${issue.tech_stack && issue.tech_stack.length ? | |
| `<div class="flex flex-wrap gap-1 mt-1"> | |
| ${issue.tech_stack.slice(0,3).map(t => | |
| `<span class="text-[10px] px-2 py-0.5 bg-blue-100 dark:bg-blue-900 text-blue-700 dark:text-blue-300 rounded-full font-mono">${t}</span>` | |
| ).join('')} | |
| </div>` | |
| : ''} | |
| ${Array.isArray(issue.tech_stack) && issue.tech_stack.length | |
| ? safeHTML`<div class="flex flex-wrap gap-1 mt-1"> | |
| ${issue.tech_stack.slice(0, 3).map(t => | |
| safeHTML`<span class="text-[10px] px-2 py-0.5 bg-blue-100 dark:bg-blue-900 text-blue-700 dark:text-blue-300 rounded-full font-mono">${t}</span>` | |
| )} | |
| </div>` | |
| : ''} |
🧰 Tools
🪛 GitHub Check: SonarCloud Code Analysis
[warning] 1775-1775: Prefer using an optional chain expression instead, as it's more concise and easier to read.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/js/app.js` around lines 1775 - 1781, The tech stack chip block in the
app.js render path is being returned as a plain string inside safeHTML, so the
div/span markup is escaped instead of rendered. Update the issue.tech_stack
branch to build the chips using safeHTML fragments rather than a raw template
string, and add an Array.isArray check before slicing/mapping issue.tech_stack.
Keep the fix localized to the tech stack rendering logic in the issue
card/template code so the chips render as real HTML.
There was a problem hiding this comment.
1 issue found across 1 file
Confidence score: 3/5
- In
src/js/app.js, interpolating a plain string intosafeHTMLwill escape the intended<div>/<span>tech-stack markup, so users will see raw HTML text instead of chip UI; this is a concrete rendering regression in the shipped interface — rebuild that section using nestedsafeHTMLfragments (with anArray...join pattern) before merging.
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="src/js/app.js">
<violation number="1" location="src/js/app.js:1775">
P1: This interpolates a plain string into a `safeHTML` template, so the tech stack `<div>/<span>` markup gets escaped and renders as text instead of chips. Build this block with nested `safeHTML` fragments (and an `Array.isArray` guard) before interpolation.</violation>
</file>
Reply with feedback, questions, or to request a fix.
Re-trigger cubic
| ${issue.tech_stack && issue.tech_stack.length ? | ||
| `<div class="flex flex-wrap gap-1 mt-1"> | ||
| ${issue.tech_stack.slice(0,3).map(t => | ||
| `<span class="text-[10px] px-2 py-0.5 bg-blue-100 dark:bg-blue-900 text-blue-700 dark:text-blue-300 rounded-full font-mono">${t}</span>` | ||
| ).join('')} | ||
| </div>` | ||
| : ''} |
There was a problem hiding this comment.
P1: This interpolates a plain string into a safeHTML template, so the tech stack <div>/<span> markup gets escaped and renders as text instead of chips. Build this block with nested safeHTML fragments (and an Array.isArray guard) before interpolation.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At src/js/app.js, line 1775:
<comment>This interpolates a plain string into a `safeHTML` template, so the tech stack `<div>/<span>` markup gets escaped and renders as text instead of chips. Build this block with nested `safeHTML` fragments (and an `Array.isArray` guard) before interpolation.</comment>
<file context>
@@ -1772,6 +1772,13 @@ async function renderGoodFirstIssues() {
<p class="text-xs text-zinc-500 mb-3 font-mono">${issue.repo || ''}</p>
<div class="flex flex-wrap gap-1.5">
${labelsHtml}
+ ${issue.tech_stack && issue.tech_stack.length ?
+ `<div class="flex flex-wrap gap-1 mt-1">
+ ${issue.tech_stack.slice(0,3).map(t =>
</file context>
| ${issue.tech_stack && issue.tech_stack.length ? | |
| `<div class="flex flex-wrap gap-1 mt-1"> | |
| ${issue.tech_stack.slice(0,3).map(t => | |
| `<span class="text-[10px] px-2 py-0.5 bg-blue-100 dark:bg-blue-900 text-blue-700 dark:text-blue-300 rounded-full font-mono">${t}</span>` | |
| ).join('')} | |
| </div>` | |
| : ''} | |
| ${Array.isArray(issue.tech_stack) && issue.tech_stack.length | |
| ? safeHTML`<div class="flex flex-wrap gap-1 mt-1"> | |
| ${issue.tech_stack.slice(0, 3).map( | |
| (t) => safeHTML`<span class="text-[10px] px-2 py-0.5 bg-blue-100 dark:bg-blue-900 text-blue-700 dark:text-blue-300 rounded-full font-mono">${t}</span>` | |
| )} | |
| </div>` | |
| : ''} |
|
@tanyachoubey1 currently vercel is having issues with preview deployment, hence we request you to provide a working proof to ensure the changes are legit |
Signed-off-by: tanyachoubey1 <choubeytanya5@gmail.com>
🚦 PR Review Pipeline
Last updated: Fri, 26 Jun 2026 15:20:00 GMT |
🤖 TENET Agent Review📋 SummaryThis pull request introduces a new feature to display tech stack tags on "Good First Issues" cards. It dynamically renders up to three programming language or framework tags below existing labels, improving visibility for potential contributors. The approach aims to enhance user experience by providing quick insights into an issue's technical requirements. 🔐 Security Findings
🧹 Code Quality
✅ What's Done Well
📝 Overall Verdict[REQUEST CHANGES] - Potential XSS vulnerability requires immediate attention and remediation. Review powered by TENET Agent 🛡️ | Triggered automatically on PR #1959 |
|
| ${issue.tech_stack && issue.tech_stack.length ? | ||
| `<div class="flex flex-wrap gap-1 mt-1"> | ||
| ${issue.tech_stack.slice(0,3).map(t => | ||
| `<span class="text-[10px] px-2 py-0.5 bg-blue-100 dark:bg-blue-900 text-blue-700 dark:text-blue-300 rounded-full font-mono">${t}</span>` | ||
| ).join('')} | ||
| </div>` | ||
| : ''} |
There was a problem hiding this comment.
tech_stack field absent from data source — feature is silently inert
issue.tech_stack is never populated by the data pipeline. fetch-issues.js writes each issue with org, title, url, repo, labels, comments, created_at, updated_at, and language (a single string or null) — there is no tech_stack array anywhere in data/issues.json (confirmed: 0 occurrences). Because issue.tech_stack is always undefined, the guard issue.tech_stack && issue.tech_stack.length is always falsy and the tag block never renders. The feature has no visible effect on the page.
| ${issue.tech_stack && issue.tech_stack.length ? | ||
| `<div class="flex flex-wrap gap-1 mt-1"> | ||
| ${issue.tech_stack.slice(0,3).map(t => | ||
| `<span class="text-[10px] px-2 py-0.5 bg-blue-100 dark:bg-blue-900 text-blue-700 dark:text-blue-300 rounded-full font-mono">${t}</span>` | ||
| ).join('')} | ||
| </div>` | ||
| : ''} |
There was a problem hiding this comment.
Plain template literal HTML is HTML-escaped by
safeHTML, not rendered
The outer card.innerHTML assignment uses the safeHTML tagged template. Inside that tag, substitution values that are not SafeHTMLString instances go through escapeHtml() (see safeHTML at line 342). The new ternary expression returns a plain JS string, so safeHTML will escape every < and >, and users would see literal tag text in the DOM instead of styled badges. Compare how labelsHtml is built: each <span> is wrapped with safeHTML\...`producing aSafeHTMLString, which safeHTML` then passes through unescaped. The tech-stack block needs the same treatment.



What changes did I make?
Added tech stack tags to Good First Issues section so contributors can see required programming languages before picking an issue.
How does it work?
Each issue card now shows language/framework tags below the existing labels.
Fixes #632