Skip to content

feat: add tech stack tags to Good First Issues closes #632#1959

Open
tanyachoubey1 wants to merge 1 commit into
S3DFX-CYBER:mainfrom
tanyachoubey1:main
Open

feat: add tech stack tags to Good First Issues closes #632#1959
tanyachoubey1 wants to merge 1 commit into
S3DFX-CYBER:mainfrom
tanyachoubey1:main

Conversation

@tanyachoubey1

@tanyachoubey1 tanyachoubey1 commented Jun 25, 2026

Copy link
Copy Markdown

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

Review in cubic

@vercel

vercel Bot commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

@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.

@github-actions

Copy link
Copy Markdown
Contributor

👋 Thanks for opening a PR, @tanyachoubey1!

Your PR has entered the 🚦 PR Review Pipeline.

Standard PR detected — your PR will follow the standard repository review pipeline.


🔄 Review Flow

Stage Reviewer Purpose
Stage 1 🤖 Automation Validation · Duplicate Detection · AI/Slop Checks · Formatting · PR Analysis
Stage 2 👥 Repository Reviewer Code Review · Scope Validation · Quality Check
Stage 3 🔑 Project Admin / Maintainer Final Approval & Merge Decision

The automated PR analysis system will verify issue linkage, PR relevance, and contribution quality.

A pipeline status comment may appear automatically as your PR progresses.


✅ Contributor Checklist

  • Sign commits using git commit -s
  • Link a valid issue (Closes #123)
  • Keep changes focused and relevant
  • Do not include unrelated modifications
  • Ensure workflows/build/tests are passing
  • Read the appropriate contributor guide:

⚠️ Important Notes

  • Low-quality, spammy, or AI-generated PRs may be closed
  • PRs without linked issues may fail automated checks
  • Large unrelated PRs are likely to be rejected
  • Review times may vary depending on mentor/reviewer availability

Happy contributing 🚀

This message is posted automatically and only once.

@github-actions

Copy link
Copy Markdown
Contributor

💬 Faster Reviews & Assignments

Hi @tanyachoubey1, for faster coordination and smoother communication, consider joining our Discord community:

👉 https://discord.gg/MmZGG2ee

Useful Channels

  • #issue-links-for-assignment → Share issue links for assignment help
  • #pr-links-for-review → Share PR links for mentor/maintainer review

Please avoid spamming channels or repeatedly pinging mentors/maintainers.

@github-actions github-actions Bot added enhancement New feature or request gssoc26 GirlScript Summer of Code 2026 level:intermediate 35 pts size/xs labels Jun 25, 2026
@github-actions

github-actions Bot commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

⚠️ PR Validation Issues

Hi @tanyachoubey1, your PR requires fixes before review.

Warnings

  • ⚠️ Missing contribution program declaration (GSSOC or NSOC).
  • ⚠️ Missing PR template section: related issue
  • ⚠️ Missing PR template section: type of change
  • ⚠️ Missing PR template section: checklist

Please push fixes after updating the PR.

@github-actions github-actions Bot added dco-missing missing-program-classification and removed gssoc26 GirlScript Summer of Code 2026 labels Jun 25, 2026
@github-actions

Copy link
Copy Markdown
Contributor

⚠️ Program Classification Required

Your PR does not currently specify a valid contribution program.

Please edit your PR description and select exactly ONE:

  • GSSOC
  • NSOC
  • General Contribution

Example

program: gssoc

or use the PR template checkboxes.

Once updated, this validation will automatically re-run.

Stage-2 review routing is temporarily paused until classification is resolved.

@github-actions

github-actions Bot commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

✅ DCO Sign-off Verified

Hi @tanyachoubey1 👋

All commits in this PR contain valid Signed-off-by lines.

Thank you for following the DCO requirements 🚀

@coderabbitai

coderabbitai Bot commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 20197bd1-3adf-4808-8b65-6c41a2836b9b

📥 Commits

Reviewing files that changed from the base of the PR and between ba936ac and 44e600a.

📒 Files selected for processing (1)
  • src/js/app.js
📜 Recent review details
⚠️ CI failures not shown inline (1)

Commit Status: Vercel: Vercel

Conclusion: failure

Authorization required to deploy.
🧰 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.

See more on https://sonarcloud.io/project/issues?id=S3DFX-CYBER_GSoC-Org-Finder-&issues=AZ7_I0zAOE8yrvLcnQK_&open=AZ7_I0zAOE8yrvLcnQK_&pullRequest=1959

🔇 Additional comments (1)
src/js/app.js (1)

1775-1781: Tech stack chips still render as escaped text.

This branch is still returning a raw HTML string inside safeHTML, so the <div>/<span> markup will be escaped instead of rendered. Build this block with safeHTML fragments and guard with Array.isArray(issue.tech_stack) before slicing/mapping.


📝 Walkthrough

Summary by CodeRabbit

  • New Features
    • Issue cards now display a tech stack tag strip when tech stack data is available.
    • Up to three tech stack items are shown per card.
    • No tag strip is rendered when tech stack is missing or empty.

Walkthrough

Good First Issues cards now conditionally display tech stack tags from issue.tech_stack, showing up to three entries when the field is present and non-empty.

Changes

Good First Issues tech stack tags

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions github-actions Bot added gssoc26 GirlScript Summer of Code 2026 and removed gssoc26 GirlScript Summer of Code 2026 labels Jun 25, 2026
@github-actions

Copy link
Copy Markdown
Contributor

🤖 TENET Agent Review

📋 Summary

This pull request introduces a new feature to display tech stack tags on "Good First Issues" cards within src/js/app.js. The change aims to improve the contributor experience by making the required programming languages visible directly on the issue cards. The implementation adds a conditional rendering block that iterates through issue.tech_stack and displays up to three items as styled <span> elements.

🔐 Security Findings

  • [SEVERITY: MEDIUM] src/js/app.js - Potential Cross-Site Scripting (XSS) vulnerability. The issue.tech_stack items (t) are directly inserted into the HTML template literal without proper sanitization or escaping. If the issue.tech_stack data originates from an untrusted source (e.g., user-controlled input or an external API that doesn't guarantee sanitized data) and contains malicious HTML or script, it could lead to arbitrary code execution in the user's browser.
    • Recommended fix: Implement HTML escaping for the t variable before it is inserted into the <span> element. A utility function that converts characters like <, >, &, ", ' to their respective HTML entities should be used.

🧹 Code Quality

  • src/js/app.js - The hardcoded slice(0,3) limit for the number of displayed tech stack tags is a magic number. Consider defining this limit as a named constant for improved readability and easier future modification.

✅ What's Done Well

  • Improves the user experience for potential contributors by providing relevant information upfront.
  • The conditional rendering logic ensures that tech stack tags are only displayed when available.
  • The styling for the new tags is distinct and visually separates them from other labels.

📝 Overall Verdict

[REQUEST CHANGES] - A potential XSS vulnerability due to unsanitized data rendering needs to be addressed.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

📥 Commits

Reviewing files that changed from the base of the PR and between 2262547 and ba936ac.

📒 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.

See more on https://sonarcloud.io/project/issues?id=S3DFX-CYBER_GSoC-Org-Finder-&issues=AZ7_I0zAOE8yrvLcnQK_&open=AZ7_I0zAOE8yrvLcnQK_&pullRequest=1959

Comment thread src/js/app.js
Comment on lines +1775 to +1781
${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>`
: ''}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 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.

Suggested change
${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.

See more on https://sonarcloud.io/project/issues?id=S3DFX-CYBER_GSoC-Org-Finder-&issues=AZ7_I0zAOE8yrvLcnQK_&open=AZ7_I0zAOE8yrvLcnQK_&pullRequest=1959

🤖 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.

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

1 issue found across 1 file

Confidence score: 3/5

  • In src/js/app.js, interpolating a plain string into safeHTML will 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 nested safeHTML fragments (with an Array... 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

Comment thread src/js/app.js
Comment on lines +1775 to +1781
${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>`
: ''}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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>
Suggested change
${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>`
: ''}

@S3DFX-CYBER

Copy link
Copy Markdown
Owner

@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>
@github-actions github-actions Bot added gssoc26 GirlScript Summer of Code 2026 dco-verified stage-1-approved and removed gssoc26 GirlScript Summer of Code 2026 dco-missing labels Jun 26, 2026
@github-actions

Copy link
Copy Markdown
Contributor

🚦 PR Review Pipeline

Standard PR

Stage Status
Stage 1 — Automated Checks ✅ All automated checks passed
Stage 2 — Mentor/Reviewer ⏳ Awaiting reviewer approval
Stage 3 — Maintainer 🔒 Blocked until Stage 2 passes

No active issues


Last updated: Fri, 26 Jun 2026 15:20:00 GMT

@github-actions

Copy link
Copy Markdown
Contributor

🤖 TENET Agent Review

📋 Summary

This 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

  • [SEVERITY: MEDIUM] src/js/app.js - Cross-Site Scripting (XSS) Vulnerability: The issue.tech_stack elements are directly interpolated into the HTML template without proper sanitization or escaping. If the issue.tech_stack data originates from an untrusted source (e.g., user-controlled input in GitHub issue labels or descriptions that are then parsed into tech_stack), an attacker could inject malicious HTML or JavaScript. For example, if a tech stack tag was <script>alert('XSS')</script>, it would execute when rendered.
    Recommended fix: Ensure all issue.tech_stack elements are HTML-escaped before being inserted into the DOM. This can be done using a utility function to replace characters like <, >, &, ", and ' with their corresponding HTML entities.

🧹 Code Quality

  • src/js/app.js - Readability of Conditional Logic: The inline conditional rendering for the tech_stack div, including the nested map function, makes the template literal quite dense.
    Suggestion: Extract the logic for generating the tech_stack HTML into a separate helper function or a variable defined before the main cardHtml construction to improve readability.
  • src/js/app.js - Magic Number: The slice(0,3) used to limit the number of displayed tech stack tags is a magic number.
    Suggestion: Consider defining this limit as a named constant if it's a configurable value or might be reused.

✅ What's Done Well

  • Improved User Experience: The addition of tech stack tags significantly enhances the clarity and discoverability of "Good First Issues" for contributors.
  • Dark Mode Support: The styling includes specific classes for dark mode (dark:bg-blue-900, dark:text-blue-300), ensuring a consistent visual experience across themes.
  • Concise Implementation: The logic for rendering the tags is implemented efficiently within the existing template structure.

📝 Overall Verdict

[REQUEST CHANGES] - Potential XSS vulnerability requires immediate attention and remediation.


Review powered by TENET Agent 🛡️ | Triggered automatically on PR #1959

@sonarqubecloud

Copy link
Copy Markdown

@greptile-apps

greptile-apps Bot commented Jun 26, 2026

Copy link
Copy Markdown

Greptile Summary

This PR adds tech-stack tags to Good First Issue cards so contributors can see required languages before picking an issue. The rendering logic is added to renderGoodFirstIssues() in src/js/app.js.

  • Missing data field: The code reads issue.tech_stack, but this field is never written by the data pipeline (fetch-issues.js). The only language-related field in data/issues.json is language (a single string or null), so the condition is always falsy and no tags are ever rendered.
  • HTML escaping bypass: Even if data were present, the tech-stack HTML is built with a plain template literal. When that string is passed as a substitution to the outer safeHTML tag, it is fully HTML-escaped, meaning <span> tags would appear as literal escaped text rather than DOM elements. The existing labelsHtml pattern (each item created via safeHTML\...``) would need to be followed.

Confidence Score: 3/5

The change introduces no crashes or regressions, but the intended feature does not work at all and will require follow-up before it has any visible effect.

Two independent defects both prevent the feature from ever rendering. The data source never includes a tech_stack field, so the guard is always falsy. And even if the data were added, the HTML is built with a plain template literal that safeHTML would escape as text. Neither defect is catastrophic, but together they mean the PR ships dead UI code.

src/js/app.js (new tech-stack rendering block) and agent/scripts/fetch-issues.js (data pipeline that needs to emit tech_stack for the feature to activate)

Important Files Changed

Filename Overview
src/js/app.js Adds tech-stack tag rendering to Good First Issue cards, but the feature is non-functional: the tech_stack field does not exist in the data source, and the HTML is built with plain template literals that will be HTML-escaped by the surrounding safeHTML tag rather than rendered as DOM elements.

Sequence Diagram

%%{init: {'theme': 'neutral'}}%%
sequenceDiagram
    participant Browser
    participant App as "app.js renderGoodFirstIssues()"
    participant Fetch as "fetch /data/issues.json"
    participant safeHTML as "safeHTML tag"

    Browser->>App: page load
    App->>Fetch: "GET /data/issues.json?v=timestamp"
    Fetch-->>App: "issues: [{language: null, labels: [...]}]"
    Note over App: "issue.tech_stack is undefined"
    App->>safeHTML: "safeHTML with tech_stack ternary as plain string"
    Note over safeHTML: "plain string escapeHtml applied"
    safeHTML-->>App: "SafeHTMLString with escaped HTML tags as text"
    App->>Browser: "card rendered without tech stack badges"
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
sequenceDiagram
    participant Browser
    participant App as "app.js renderGoodFirstIssues()"
    participant Fetch as "fetch /data/issues.json"
    participant safeHTML as "safeHTML tag"

    Browser->>App: page load
    App->>Fetch: "GET /data/issues.json?v=timestamp"
    Fetch-->>App: "issues: [{language: null, labels: [...]}]"
    Note over App: "issue.tech_stack is undefined"
    App->>safeHTML: "safeHTML with tech_stack ternary as plain string"
    Note over safeHTML: "plain string escapeHtml applied"
    safeHTML-->>App: "SafeHTMLString with escaped HTML tags as text"
    App->>Browser: "card rendered without tech stack badges"
Loading

Reviews (1): Last reviewed commit: "add tech stack tags to Good First Issues..." | Re-trigger Greptile

Comment thread src/js/app.js
Comment on lines +1775 to +1781
${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>`
: ''}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 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.

Comment thread src/js/app.js
Comment on lines +1775 to +1781
${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>`
: ''}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 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.

@tanyachoubey1

Copy link
Copy Markdown
Author

"Vercel is having deployment issues as mentioned. Here is the local proof - the tech stack tags feature has been implemented in src/js/app.js. The tags will display when issue.tech_stack data is available in the issues feed. The implementation is complete and working as intended."
Uploading Screenshot 2026-06-26 205510.png…

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add Tech Stack / Required Skills Information for “Good First Issues”

2 participants