feat(release): add deb packaging pipeline - #1655

Closed
YougLin-dev wants to merge 2 commits into
pingdotgg:mainfrom
YougLin-dev:feat/deb-release-pipeline
Closed

feat(release): add deb packaging pipeline#1655
YougLin-dev wants to merge 2 commits into
pingdotgg:mainfrom
YougLin-dev:feat/deb-release-pipeline

Conversation

@YougLin-dev

@YougLin-devYougLin-dev commented Apr 1, 2026

Copy link
Copy Markdown

What Changed

  • Added Linux .deb packaging to the desktop release flow.
  • Updated the GitHub release workflow to build, collect, and publish .deb artifacts alongside the existing desktop assets.
  • Added a dedicated local command for Debian packaging: bun run dist:desktop:deb.
  • Hardened the desktop artifact build script so staging installs no longer depend on a globally available node-gyp.
  • Added the Debian metadata required by electron-builder / fpm for .deb output.
  • Updated the marketing download surfaces to expose the new Linux .deb download option.
  • Updated release documentation to reflect the new release artifact set and Linux packaging behavior.

Why

  • We needed a first-class Debian package in addition to the existing AppImage output.
  • Local packaging was working, but CI/CD was not set up to produce and publish .deb assets.
  • The packaging flow was brittle because staging installs could fail when node-pty needed to rebuild without a resolvable node-gyp.
  • Debian packaging also requires metadata that was not previously present in the staged package config.
  • The download UI needed to reflect the new distribution option so users can actually discover and install it.

UI Changes

  • Added a new Linux download card for Debian / Ubuntu (.deb) on the /download page.
  • Updated the Linux homepage download CTA to fall back to .deb when an AppImage asset is not available.
  • No animation or interaction behavior changed.

Before:

  • Linux downloads exposed AppImage only.

After:

  • Linux downloads expose both AppImage and .deb.

Screenshots:

  • Attach before/after screenshots of the /download page showing the added .deb card.

Video:

  • Not applicable. There are no animation or interaction changes in this PR.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes (not applicable: no animation/interaction changes)

Note

Medium Risk
Changes the CI release matrix and desktop artifact build/staging process, which could break production release builds or dependency installation (notably native modules) across platforms. Limited runtime impact for users, but packaging/metadata changes for Linux releases need verification.

Overview
Adds first-class Linux .deb packaging to the desktop release workflow: CI now builds an additional Linux deb target, collects/publishes *.deb assets, and includes them in the GitHub Release upload set.

Extends local tooling and build staging to support .deb output by adding dist:desktop:deb, injecting Debian metadata (homepage, Linux maintainer) into the staged package.json, and hardening dependency installs via a generated node-gyp shim + cleaned env so staging no longer relies on a globally available node-gyp.

Updates marketing download surfaces to expose the new .deb option (new Linux download card on /download, and homepage Linux CTA falls back to .deb if no AppImage), and refreshes docs/release.md to document the new artifact set and that Linux auto-update remains AppImage-only.

Written by Cursor Bugbot for commit 8fbc65d. This will update automatically on new commits. Configure here.

@coderabbitai

coderabbitaiBot commented Apr 1, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 1c404c4f-9d6f-4f6e-b957-b8bf9c90d166

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ 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 and usage tips.

@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Apr 1, 2026

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

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

"release/*.dmg" \
"release/*.zip" \
"release/*.AppImage" \
"release/*.deb" \

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.

Duplicate artifact name causes Linux build upload conflict

High Severity

The two new Linux matrix entries (Linux x64 AppImage and Linux x64 deb) both have platform: linux and arch: x64, so the artifact upload name desktop-${{ matrix.platform }}-${{ matrix.arch }} resolves to desktop-linux-x64 for both jobs. With actions/upload-artifact@v7, uploading a second artifact with the same name in the same workflow run results in a 409 Conflict error. The artifact name template needs to incorporate matrix.target to differentiate the two Linux builds.

Additional Locations (1)
Fix in CursorFix in Web

if (nodeGypShim) {
buildEnv.PATH = [nodeGypShim.shimDir, buildEnv.PATH]
.filter(Boolean)
.join(process.platform === "win32" ? ";" : ":");

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.

Windows PATH key casing causes broken environment variable

Medium Severity

On Windows, spreading process.env into a plain object loses case-insensitivity — the path key is stored as Path, not PATH. Reading buildEnv.PATH returns undefined, so the assignment creates a newPATH key containing only nodeGypShim.shimDir, while Path (with the real system path) remains untouched. The resulting env object has both Path and PATH, leading to unpredictable behavior: the child process may lose the system path entirely, preventing bun and other tools from being found.

Fix in CursorFix in Web

@LouisDeconinck

Copy link
Copy Markdown

What is the status on this?

@juliusmarmingejuliusmarminge mentioned this pull request Jun 10, 2026
4 tasks
@juliusmarmingeChatGPT Codex Connector

Copy link
Copy Markdown
Member

Closing because the artifact-name collision remains unresolved, the release pipeline changed materially, and there has been no author follow-up.

This was closed as part of a large repo-wide maintenance sweep. If you think it's still relevant, please reopen.

bigpod98 pushed a commit to bigpod98/t3code that referenced this pull request Aug 6, 2026
The packaging metadata in this branch is complete, but nothing builds or ships
the packages: the release matrix builds AppImage only, and the collect and
upload steps never mention .deb or .rpm.
Rather than add a matrix entry per format, the existing Linux entry now builds
`AppImage,deb,rpm` in one electron-builder run. A second entry would collide on
the upload artifact name -- `desktop-${platform}-${arch}` is identical for two
entries differing only by target, which is what sank pingdotgg#1655 -- while
artifactName's ${ext} already keeps the output files apart. One runner, one
artifact name, no extra release wall-clock.
`resolveLinuxTargets` splits the comma-separated target, and the deb/rpm config
sections plus the headless launcher now key off the resolved list rather than an
exact string match, so a combined build configures both formats.
Both `action-gh-release` blocks (first release and subsequent releases) carry
their own file list; both needed the new patterns, otherwise the packages build
and never ship.
electron-builder shells out to rpmbuild for the rpm target. The Ubuntu runner
image ships it in the `rpm` package (4.18.2 on 24.04), so the added step is a
no-op there; it installs the package only when the binary is missing.
Also adds the per-arch dist script variants (matching dist:desktop:dmg/win),
docs for both formats, download-page cards, and tests over the target split.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@YougLin-dev@LouisDeconinck@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat(release): add deb packaging pipeline - #1655

Closed
YougLin-dev wants to merge 2 commits into
pingdotgg:mainfrom
YougLin-dev:feat/deb-release-pipeline
Closed

feat(release): add deb packaging pipeline#1655
YougLin-dev wants to merge 2 commits into
pingdotgg:mainfrom
YougLin-dev:feat/deb-release-pipeline

Conversation

@YougLin-dev

@YougLin-devYougLin-dev commented Apr 1, 2026

Copy link
Copy Markdown

What Changed

  • Added Linux .deb packaging to the desktop release flow.
  • Updated the GitHub release workflow to build, collect, and publish .deb artifacts alongside the existing desktop assets.
  • Added a dedicated local command for Debian packaging: bun run dist:desktop:deb.
  • Hardened the desktop artifact build script so staging installs no longer depend on a globally available node-gyp.
  • Added the Debian metadata required by electron-builder / fpm for .deb output.
  • Updated the marketing download surfaces to expose the new Linux .deb download option.
  • Updated release documentation to reflect the new release artifact set and Linux packaging behavior.

Why

  • We needed a first-class Debian package in addition to the existing AppImage output.
  • Local packaging was working, but CI/CD was not set up to produce and publish .deb assets.
  • The packaging flow was brittle because staging installs could fail when node-pty needed to rebuild without a resolvable node-gyp.
  • Debian packaging also requires metadata that was not previously present in the staged package config.
  • The download UI needed to reflect the new distribution option so users can actually discover and install it.

UI Changes

  • Added a new Linux download card for Debian / Ubuntu (.deb) on the /download page.
  • Updated the Linux homepage download CTA to fall back to .deb when an AppImage asset is not available.
  • No animation or interaction behavior changed.

Before:

  • Linux downloads exposed AppImage only.

After:

  • Linux downloads expose both AppImage and .deb.

Screenshots:

  • Attach before/after screenshots of the /download page showing the added .deb card.

Video:

  • Not applicable. There are no animation or interaction changes in this PR.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes (not applicable: no animation/interaction changes)

Note

Medium Risk
Changes the CI release matrix and desktop artifact build/staging process, which could break production release builds or dependency installation (notably native modules) across platforms. Limited runtime impact for users, but packaging/metadata changes for Linux releases need verification.

Overview
Adds first-class Linux .deb packaging to the desktop release workflow: CI now builds an additional Linux deb target, collects/publishes *.deb assets, and includes them in the GitHub Release upload set.

Extends local tooling and build staging to support .deb output by adding dist:desktop:deb, injecting Debian metadata (homepage, Linux maintainer) into the staged package.json, and hardening dependency installs via a generated node-gyp shim + cleaned env so staging no longer relies on a globally available node-gyp.

Updates marketing download surfaces to expose the new .deb option (new Linux download card on /download, and homepage Linux CTA falls back to .deb if no AppImage), and refreshes docs/release.md to document the new artifact set and that Linux auto-update remains AppImage-only.

Written by Cursor Bugbot for commit 8fbc65d. This will update automatically on new commits. Configure here.

@coderabbitai

coderabbitaiBot commented Apr 1, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 1c404c4f-9d6f-4f6e-b957-b8bf9c90d166

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ 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 and usage tips.

@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Apr 1, 2026

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

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

"release/*.dmg" \
"release/*.zip" \
"release/*.AppImage" \
"release/*.deb" \

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.

Duplicate artifact name causes Linux build upload conflict

High Severity

The two new Linux matrix entries (Linux x64 AppImage and Linux x64 deb) both have platform: linux and arch: x64, so the artifact upload name desktop-${{ matrix.platform }}-${{ matrix.arch }} resolves to desktop-linux-x64 for both jobs. With actions/upload-artifact@v7, uploading a second artifact with the same name in the same workflow run results in a 409 Conflict error. The artifact name template needs to incorporate matrix.target to differentiate the two Linux builds.

Additional Locations (1)
Fix in CursorFix in Web

if (nodeGypShim) {
buildEnv.PATH = [nodeGypShim.shimDir, buildEnv.PATH]
.filter(Boolean)
.join(process.platform === "win32" ? ";" : ":");

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.

Windows PATH key casing causes broken environment variable

Medium Severity

On Windows, spreading process.env into a plain object loses case-insensitivity — the path key is stored as Path, not PATH. Reading buildEnv.PATH returns undefined, so the assignment creates a newPATH key containing only nodeGypShim.shimDir, while Path (with the real system path) remains untouched. The resulting env object has both Path and PATH, leading to unpredictable behavior: the child process may lose the system path entirely, preventing bun and other tools from being found.

Fix in CursorFix in Web

@LouisDeconinck

Copy link
Copy Markdown

What is the status on this?

@juliusmarmingejuliusmarminge mentioned this pull request Jun 10, 2026
4 tasks
@juliusmarmingeChatGPT Codex Connector

Copy link
Copy Markdown
Member

Closing because the artifact-name collision remains unresolved, the release pipeline changed materially, and there has been no author follow-up.

This was closed as part of a large repo-wide maintenance sweep. If you think it's still relevant, please reopen.

bigpod98 pushed a commit to bigpod98/t3code that referenced this pull request Aug 6, 2026
The packaging metadata in this branch is complete, but nothing builds or ships
the packages: the release matrix builds AppImage only, and the collect and
upload steps never mention .deb or .rpm.
Rather than add a matrix entry per format, the existing Linux entry now builds
`AppImage,deb,rpm` in one electron-builder run. A second entry would collide on
the upload artifact name -- `desktop-${platform}-${arch}` is identical for two
entries differing only by target, which is what sank pingdotgg#1655 -- while
artifactName's ${ext} already keeps the output files apart. One runner, one
artifact name, no extra release wall-clock.
`resolveLinuxTargets` splits the comma-separated target, and the deb/rpm config
sections plus the headless launcher now key off the resolved list rather than an
exact string match, so a combined build configures both formats.
Both `action-gh-release` blocks (first release and subsequent releases) carry
their own file list; both needed the new patterns, otherwise the packages build
and never ship.
electron-builder shells out to rpmbuild for the rpm target. The Ubuntu runner
image ships it in the `rpm` package (4.18.2 on 24.04), so the added step is a
no-op there; it installs the package only when the binary is missing.
Also adds the per-arch dist script variants (matching dist:desktop:dmg/win),
docs for both formats, download-page cards, and tests over the target split.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@YougLin-dev@LouisDeconinck@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(release): add deb packaging pipeline - #1655

Closed
YougLin-dev wants to merge 2 commits into
pingdotgg:mainfrom
YougLin-dev:feat/deb-release-pipeline
Closed

feat(release): add deb packaging pipeline#1655
YougLin-dev wants to merge 2 commits into
pingdotgg:mainfrom
YougLin-dev:feat/deb-release-pipeline

Conversation

@YougLin-dev

@YougLin-devYougLin-dev commented Apr 1, 2026

Copy link
Copy Markdown

What Changed

  • Added Linux .deb packaging to the desktop release flow.
  • Updated the GitHub release workflow to build, collect, and publish .deb artifacts alongside the existing desktop assets.
  • Added a dedicated local command for Debian packaging: bun run dist:desktop:deb.
  • Hardened the desktop artifact build script so staging installs no longer depend on a globally available node-gyp.
  • Added the Debian metadata required by electron-builder / fpm for .deb output.
  • Updated the marketing download surfaces to expose the new Linux .deb download option.
  • Updated release documentation to reflect the new release artifact set and Linux packaging behavior.

Why

  • We needed a first-class Debian package in addition to the existing AppImage output.
  • Local packaging was working, but CI/CD was not set up to produce and publish .deb assets.
  • The packaging flow was brittle because staging installs could fail when node-pty needed to rebuild without a resolvable node-gyp.
  • Debian packaging also requires metadata that was not previously present in the staged package config.
  • The download UI needed to reflect the new distribution option so users can actually discover and install it.

UI Changes

  • Added a new Linux download card for Debian / Ubuntu (.deb) on the /download page.
  • Updated the Linux homepage download CTA to fall back to .deb when an AppImage asset is not available.
  • No animation or interaction behavior changed.

Before:

  • Linux downloads exposed AppImage only.

After:

  • Linux downloads expose both AppImage and .deb.

Screenshots:

  • Attach before/after screenshots of the /download page showing the added .deb card.

Video:

  • Not applicable. There are no animation or interaction changes in this PR.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes (not applicable: no animation/interaction changes)

Note

Medium Risk
Changes the CI release matrix and desktop artifact build/staging process, which could break production release builds or dependency installation (notably native modules) across platforms. Limited runtime impact for users, but packaging/metadata changes for Linux releases need verification.

Overview
Adds first-class Linux .deb packaging to the desktop release workflow: CI now builds an additional Linux deb target, collects/publishes *.deb assets, and includes them in the GitHub Release upload set.

Extends local tooling and build staging to support .deb output by adding dist:desktop:deb, injecting Debian metadata (homepage, Linux maintainer) into the staged package.json, and hardening dependency installs via a generated node-gyp shim + cleaned env so staging no longer relies on a globally available node-gyp.

Updates marketing download surfaces to expose the new .deb option (new Linux download card on /download, and homepage Linux CTA falls back to .deb if no AppImage), and refreshes docs/release.md to document the new artifact set and that Linux auto-update remains AppImage-only.

Written by Cursor Bugbot for commit 8fbc65d. This will update automatically on new commits. Configure here.

@coderabbitai

coderabbitaiBot commented Apr 1, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 1c404c4f-9d6f-4f6e-b957-b8bf9c90d166

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ 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 and usage tips.

@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Apr 1, 2026

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

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

"release/*.dmg" \
"release/*.zip" \
"release/*.AppImage" \
"release/*.deb" \

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.

Duplicate artifact name causes Linux build upload conflict

High Severity

The two new Linux matrix entries (Linux x64 AppImage and Linux x64 deb) both have platform: linux and arch: x64, so the artifact upload name desktop-${{ matrix.platform }}-${{ matrix.arch }} resolves to desktop-linux-x64 for both jobs. With actions/upload-artifact@v7, uploading a second artifact with the same name in the same workflow run results in a 409 Conflict error. The artifact name template needs to incorporate matrix.target to differentiate the two Linux builds.

Additional Locations (1)
Fix in CursorFix in Web

if (nodeGypShim) {
buildEnv.PATH = [nodeGypShim.shimDir, buildEnv.PATH]
.filter(Boolean)
.join(process.platform === "win32" ? ";" : ":");

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.

Windows PATH key casing causes broken environment variable

Medium Severity

On Windows, spreading process.env into a plain object loses case-insensitivity — the path key is stored as Path, not PATH. Reading buildEnv.PATH returns undefined, so the assignment creates a newPATH key containing only nodeGypShim.shimDir, while Path (with the real system path) remains untouched. The resulting env object has both Path and PATH, leading to unpredictable behavior: the child process may lose the system path entirely, preventing bun and other tools from being found.

Fix in CursorFix in Web

@LouisDeconinck

Copy link
Copy Markdown

What is the status on this?

@juliusmarmingejuliusmarminge mentioned this pull request Jun 10, 2026
4 tasks
@juliusmarmingeChatGPT Codex Connector

Copy link
Copy Markdown
Member

Closing because the artifact-name collision remains unresolved, the release pipeline changed materially, and there has been no author follow-up.

This was closed as part of a large repo-wide maintenance sweep. If you think it's still relevant, please reopen.

bigpod98 pushed a commit to bigpod98/t3code that referenced this pull request Aug 6, 2026
The packaging metadata in this branch is complete, but nothing builds or ships
the packages: the release matrix builds AppImage only, and the collect and
upload steps never mention .deb or .rpm.
Rather than add a matrix entry per format, the existing Linux entry now builds
`AppImage,deb,rpm` in one electron-builder run. A second entry would collide on
the upload artifact name -- `desktop-${platform}-${arch}` is identical for two
entries differing only by target, which is what sank pingdotgg#1655 -- while
artifactName's ${ext} already keeps the output files apart. One runner, one
artifact name, no extra release wall-clock.
`resolveLinuxTargets` splits the comma-separated target, and the deb/rpm config
sections plus the headless launcher now key off the resolved list rather than an
exact string match, so a combined build configures both formats.
Both `action-gh-release` blocks (first release and subsequent releases) carry
their own file list; both needed the new patterns, otherwise the packages build
and never ship.
electron-builder shells out to rpmbuild for the rpm target. The Ubuntu runner
image ships it in the `rpm` package (4.18.2 on 24.04), so the added step is a
no-op there; it installs the package only when the binary is missing.
Also adds the per-arch dist script variants (matching dist:desktop:dmg/win),
docs for both formats, download-page cards, and tests over the target split.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@YougLin-dev@LouisDeconinck@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(release): add deb packaging pipeline - #1655

Closed
YougLin-dev wants to merge 2 commits into
pingdotgg:mainfrom
YougLin-dev:feat/deb-release-pipeline
Closed

feat(release): add deb packaging pipeline#1655
YougLin-dev wants to merge 2 commits into
pingdotgg:mainfrom
YougLin-dev:feat/deb-release-pipeline

Conversation

@YougLin-dev

@YougLin-devYougLin-dev commented Apr 1, 2026

Copy link
Copy Markdown

What Changed

  • Added Linux .deb packaging to the desktop release flow.
  • Updated the GitHub release workflow to build, collect, and publish .deb artifacts alongside the existing desktop assets.
  • Added a dedicated local command for Debian packaging: bun run dist:desktop:deb.
  • Hardened the desktop artifact build script so staging installs no longer depend on a globally available node-gyp.
  • Added the Debian metadata required by electron-builder / fpm for .deb output.
  • Updated the marketing download surfaces to expose the new Linux .deb download option.
  • Updated release documentation to reflect the new release artifact set and Linux packaging behavior.

Why

  • We needed a first-class Debian package in addition to the existing AppImage output.
  • Local packaging was working, but CI/CD was not set up to produce and publish .deb assets.
  • The packaging flow was brittle because staging installs could fail when node-pty needed to rebuild without a resolvable node-gyp.
  • Debian packaging also requires metadata that was not previously present in the staged package config.
  • The download UI needed to reflect the new distribution option so users can actually discover and install it.

UI Changes

  • Added a new Linux download card for Debian / Ubuntu (.deb) on the /download page.
  • Updated the Linux homepage download CTA to fall back to .deb when an AppImage asset is not available.
  • No animation or interaction behavior changed.

Before:

  • Linux downloads exposed AppImage only.

After:

  • Linux downloads expose both AppImage and .deb.

Screenshots:

  • Attach before/after screenshots of the /download page showing the added .deb card.

Video:

  • Not applicable. There are no animation or interaction changes in this PR.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes (not applicable: no animation/interaction changes)

Note

Medium Risk
Changes the CI release matrix and desktop artifact build/staging process, which could break production release builds or dependency installation (notably native modules) across platforms. Limited runtime impact for users, but packaging/metadata changes for Linux releases need verification.

Overview
Adds first-class Linux .deb packaging to the desktop release workflow: CI now builds an additional Linux deb target, collects/publishes *.deb assets, and includes them in the GitHub Release upload set.

Extends local tooling and build staging to support .deb output by adding dist:desktop:deb, injecting Debian metadata (homepage, Linux maintainer) into the staged package.json, and hardening dependency installs via a generated node-gyp shim + cleaned env so staging no longer relies on a globally available node-gyp.

Updates marketing download surfaces to expose the new .deb option (new Linux download card on /download, and homepage Linux CTA falls back to .deb if no AppImage), and refreshes docs/release.md to document the new artifact set and that Linux auto-update remains AppImage-only.

Written by Cursor Bugbot for commit 8fbc65d. This will update automatically on new commits. Configure here.

@coderabbitai

coderabbitaiBot commented Apr 1, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 1c404c4f-9d6f-4f6e-b957-b8bf9c90d166

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ 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 and usage tips.

@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Apr 1, 2026

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

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

"release/*.dmg" \
"release/*.zip" \
"release/*.AppImage" \
"release/*.deb" \

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.

Duplicate artifact name causes Linux build upload conflict

High Severity

The two new Linux matrix entries (Linux x64 AppImage and Linux x64 deb) both have platform: linux and arch: x64, so the artifact upload name desktop-${{ matrix.platform }}-${{ matrix.arch }} resolves to desktop-linux-x64 for both jobs. With actions/upload-artifact@v7, uploading a second artifact with the same name in the same workflow run results in a 409 Conflict error. The artifact name template needs to incorporate matrix.target to differentiate the two Linux builds.

Additional Locations (1)
Fix in CursorFix in Web

if (nodeGypShim) {
buildEnv.PATH = [nodeGypShim.shimDir, buildEnv.PATH]
.filter(Boolean)
.join(process.platform === "win32" ? ";" : ":");

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.

Windows PATH key casing causes broken environment variable

Medium Severity

On Windows, spreading process.env into a plain object loses case-insensitivity — the path key is stored as Path, not PATH. Reading buildEnv.PATH returns undefined, so the assignment creates a newPATH key containing only nodeGypShim.shimDir, while Path (with the real system path) remains untouched. The resulting env object has both Path and PATH, leading to unpredictable behavior: the child process may lose the system path entirely, preventing bun and other tools from being found.

Fix in CursorFix in Web

@LouisDeconinck

Copy link
Copy Markdown

What is the status on this?

@juliusmarmingejuliusmarminge mentioned this pull request Jun 10, 2026
4 tasks
@juliusmarmingeChatGPT Codex Connector

Copy link
Copy Markdown
Member

Closing because the artifact-name collision remains unresolved, the release pipeline changed materially, and there has been no author follow-up.

This was closed as part of a large repo-wide maintenance sweep. If you think it's still relevant, please reopen.

bigpod98 pushed a commit to bigpod98/t3code that referenced this pull request Aug 6, 2026
The packaging metadata in this branch is complete, but nothing builds or ships
the packages: the release matrix builds AppImage only, and the collect and
upload steps never mention .deb or .rpm.
Rather than add a matrix entry per format, the existing Linux entry now builds
`AppImage,deb,rpm` in one electron-builder run. A second entry would collide on
the upload artifact name -- `desktop-${platform}-${arch}` is identical for two
entries differing only by target, which is what sank pingdotgg#1655 -- while
artifactName's ${ext} already keeps the output files apart. One runner, one
artifact name, no extra release wall-clock.
`resolveLinuxTargets` splits the comma-separated target, and the deb/rpm config
sections plus the headless launcher now key off the resolved list rather than an
exact string match, so a combined build configures both formats.
Both `action-gh-release` blocks (first release and subsequent releases) carry
their own file list; both needed the new patterns, otherwise the packages build
and never ship.
electron-builder shells out to rpmbuild for the rpm target. The Ubuntu runner
image ships it in the `rpm` package (4.18.2 on 24.04), so the added step is a
no-op there; it installs the package only when the binary is missing.
Also adds the per-arch dist script variants (matching dist:desktop:dmg/win),
docs for both formats, download-page cards, and tests over the target split.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@YougLin-dev@LouisDeconinck@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat(release): add deb packaging pipeline - #1655

Closed
YougLin-dev wants to merge 2 commits into
pingdotgg:mainfrom
YougLin-dev:feat/deb-release-pipeline
Closed

feat(release): add deb packaging pipeline#1655
YougLin-dev wants to merge 2 commits into
pingdotgg:mainfrom
YougLin-dev:feat/deb-release-pipeline

Conversation

@YougLin-dev

@YougLin-devYougLin-dev commented Apr 1, 2026

Copy link
Copy Markdown

What Changed

  • Added Linux .deb packaging to the desktop release flow.
  • Updated the GitHub release workflow to build, collect, and publish .deb artifacts alongside the existing desktop assets.
  • Added a dedicated local command for Debian packaging: bun run dist:desktop:deb.
  • Hardened the desktop artifact build script so staging installs no longer depend on a globally available node-gyp.
  • Added the Debian metadata required by electron-builder / fpm for .deb output.
  • Updated the marketing download surfaces to expose the new Linux .deb download option.
  • Updated release documentation to reflect the new release artifact set and Linux packaging behavior.

Why

  • We needed a first-class Debian package in addition to the existing AppImage output.
  • Local packaging was working, but CI/CD was not set up to produce and publish .deb assets.
  • The packaging flow was brittle because staging installs could fail when node-pty needed to rebuild without a resolvable node-gyp.
  • Debian packaging also requires metadata that was not previously present in the staged package config.
  • The download UI needed to reflect the new distribution option so users can actually discover and install it.

UI Changes

  • Added a new Linux download card for Debian / Ubuntu (.deb) on the /download page.
  • Updated the Linux homepage download CTA to fall back to .deb when an AppImage asset is not available.
  • No animation or interaction behavior changed.

Before:

  • Linux downloads exposed AppImage only.

After:

  • Linux downloads expose both AppImage and .deb.

Screenshots:

  • Attach before/after screenshots of the /download page showing the added .deb card.

Video:

  • Not applicable. There are no animation or interaction changes in this PR.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes (not applicable: no animation/interaction changes)

Note

Medium Risk
Changes the CI release matrix and desktop artifact build/staging process, which could break production release builds or dependency installation (notably native modules) across platforms. Limited runtime impact for users, but packaging/metadata changes for Linux releases need verification.

Overview
Adds first-class Linux .deb packaging to the desktop release workflow: CI now builds an additional Linux deb target, collects/publishes *.deb assets, and includes them in the GitHub Release upload set.

Extends local tooling and build staging to support .deb output by adding dist:desktop:deb, injecting Debian metadata (homepage, Linux maintainer) into the staged package.json, and hardening dependency installs via a generated node-gyp shim + cleaned env so staging no longer relies on a globally available node-gyp.

Updates marketing download surfaces to expose the new .deb option (new Linux download card on /download, and homepage Linux CTA falls back to .deb if no AppImage), and refreshes docs/release.md to document the new artifact set and that Linux auto-update remains AppImage-only.

Written by Cursor Bugbot for commit 8fbc65d. This will update automatically on new commits. Configure here.

@coderabbitai

coderabbitaiBot commented Apr 1, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 1c404c4f-9d6f-4f6e-b957-b8bf9c90d166

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ 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 and usage tips.

@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Apr 1, 2026

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

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

"release/*.dmg" \
"release/*.zip" \
"release/*.AppImage" \
"release/*.deb" \

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.

Duplicate artifact name causes Linux build upload conflict

High Severity

The two new Linux matrix entries (Linux x64 AppImage and Linux x64 deb) both have platform: linux and arch: x64, so the artifact upload name desktop-${{ matrix.platform }}-${{ matrix.arch }} resolves to desktop-linux-x64 for both jobs. With actions/upload-artifact@v7, uploading a second artifact with the same name in the same workflow run results in a 409 Conflict error. The artifact name template needs to incorporate matrix.target to differentiate the two Linux builds.

Additional Locations (1)
Fix in CursorFix in Web

if (nodeGypShim) {
buildEnv.PATH = [nodeGypShim.shimDir, buildEnv.PATH]
.filter(Boolean)
.join(process.platform === "win32" ? ";" : ":");

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.

Windows PATH key casing causes broken environment variable

Medium Severity

On Windows, spreading process.env into a plain object loses case-insensitivity — the path key is stored as Path, not PATH. Reading buildEnv.PATH returns undefined, so the assignment creates a newPATH key containing only nodeGypShim.shimDir, while Path (with the real system path) remains untouched. The resulting env object has both Path and PATH, leading to unpredictable behavior: the child process may lose the system path entirely, preventing bun and other tools from being found.

Fix in CursorFix in Web

@LouisDeconinck

Copy link
Copy Markdown

What is the status on this?

@juliusmarmingejuliusmarminge mentioned this pull request Jun 10, 2026
4 tasks
@juliusmarmingeChatGPT Codex Connector

Copy link
Copy Markdown
Member

Closing because the artifact-name collision remains unresolved, the release pipeline changed materially, and there has been no author follow-up.

This was closed as part of a large repo-wide maintenance sweep. If you think it's still relevant, please reopen.

bigpod98 pushed a commit to bigpod98/t3code that referenced this pull request Aug 6, 2026
The packaging metadata in this branch is complete, but nothing builds or ships
the packages: the release matrix builds AppImage only, and the collect and
upload steps never mention .deb or .rpm.
Rather than add a matrix entry per format, the existing Linux entry now builds
`AppImage,deb,rpm` in one electron-builder run. A second entry would collide on
the upload artifact name -- `desktop-${platform}-${arch}` is identical for two
entries differing only by target, which is what sank pingdotgg#1655 -- while
artifactName's ${ext} already keeps the output files apart. One runner, one
artifact name, no extra release wall-clock.
`resolveLinuxTargets` splits the comma-separated target, and the deb/rpm config
sections plus the headless launcher now key off the resolved list rather than an
exact string match, so a combined build configures both formats.
Both `action-gh-release` blocks (first release and subsequent releases) carry
their own file list; both needed the new patterns, otherwise the packages build
and never ship.
electron-builder shells out to rpmbuild for the rpm target. The Ubuntu runner
image ships it in the `rpm` package (4.18.2 on 24.04), so the added step is a
no-op there; it installs the package only when the binary is missing.
Also adds the per-arch dist script variants (matching dist:desktop:dmg/win),
docs for both formats, download-page cards, and tests over the target split.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@YougLin-dev@LouisDeconinck@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(release): add deb packaging pipeline - #1655

Closed
YougLin-dev wants to merge 2 commits into
pingdotgg:mainfrom
YougLin-dev:feat/deb-release-pipeline
Closed

feat(release): add deb packaging pipeline#1655
YougLin-dev wants to merge 2 commits into
pingdotgg:mainfrom
YougLin-dev:feat/deb-release-pipeline

Conversation

@YougLin-dev

@YougLin-devYougLin-dev commented Apr 1, 2026

Copy link
Copy Markdown

What Changed

  • Added Linux .deb packaging to the desktop release flow.
  • Updated the GitHub release workflow to build, collect, and publish .deb artifacts alongside the existing desktop assets.
  • Added a dedicated local command for Debian packaging: bun run dist:desktop:deb.
  • Hardened the desktop artifact build script so staging installs no longer depend on a globally available node-gyp.
  • Added the Debian metadata required by electron-builder / fpm for .deb output.
  • Updated the marketing download surfaces to expose the new Linux .deb download option.
  • Updated release documentation to reflect the new release artifact set and Linux packaging behavior.

Why

  • We needed a first-class Debian package in addition to the existing AppImage output.
  • Local packaging was working, but CI/CD was not set up to produce and publish .deb assets.
  • The packaging flow was brittle because staging installs could fail when node-pty needed to rebuild without a resolvable node-gyp.
  • Debian packaging also requires metadata that was not previously present in the staged package config.
  • The download UI needed to reflect the new distribution option so users can actually discover and install it.

UI Changes

  • Added a new Linux download card for Debian / Ubuntu (.deb) on the /download page.
  • Updated the Linux homepage download CTA to fall back to .deb when an AppImage asset is not available.
  • No animation or interaction behavior changed.

Before:

  • Linux downloads exposed AppImage only.

After:

  • Linux downloads expose both AppImage and .deb.

Screenshots:

  • Attach before/after screenshots of the /download page showing the added .deb card.

Video:

  • Not applicable. There are no animation or interaction changes in this PR.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes (not applicable: no animation/interaction changes)

Note

Medium Risk
Changes the CI release matrix and desktop artifact build/staging process, which could break production release builds or dependency installation (notably native modules) across platforms. Limited runtime impact for users, but packaging/metadata changes for Linux releases need verification.

Overview
Adds first-class Linux .deb packaging to the desktop release workflow: CI now builds an additional Linux deb target, collects/publishes *.deb assets, and includes them in the GitHub Release upload set.

Extends local tooling and build staging to support .deb output by adding dist:desktop:deb, injecting Debian metadata (homepage, Linux maintainer) into the staged package.json, and hardening dependency installs via a generated node-gyp shim + cleaned env so staging no longer relies on a globally available node-gyp.

Updates marketing download surfaces to expose the new .deb option (new Linux download card on /download, and homepage Linux CTA falls back to .deb if no AppImage), and refreshes docs/release.md to document the new artifact set and that Linux auto-update remains AppImage-only.

Written by Cursor Bugbot for commit 8fbc65d. This will update automatically on new commits. Configure here.

@coderabbitai

coderabbitaiBot commented Apr 1, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 1c404c4f-9d6f-4f6e-b957-b8bf9c90d166

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ 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 and usage tips.

@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Apr 1, 2026

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

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

"release/*.dmg" \
"release/*.zip" \
"release/*.AppImage" \
"release/*.deb" \

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.

Duplicate artifact name causes Linux build upload conflict

High Severity

The two new Linux matrix entries (Linux x64 AppImage and Linux x64 deb) both have platform: linux and arch: x64, so the artifact upload name desktop-${{ matrix.platform }}-${{ matrix.arch }} resolves to desktop-linux-x64 for both jobs. With actions/upload-artifact@v7, uploading a second artifact with the same name in the same workflow run results in a 409 Conflict error. The artifact name template needs to incorporate matrix.target to differentiate the two Linux builds.

Additional Locations (1)
Fix in CursorFix in Web

if (nodeGypShim) {
buildEnv.PATH = [nodeGypShim.shimDir, buildEnv.PATH]
.filter(Boolean)
.join(process.platform === "win32" ? ";" : ":");

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.

Windows PATH key casing causes broken environment variable

Medium Severity

On Windows, spreading process.env into a plain object loses case-insensitivity — the path key is stored as Path, not PATH. Reading buildEnv.PATH returns undefined, so the assignment creates a newPATH key containing only nodeGypShim.shimDir, while Path (with the real system path) remains untouched. The resulting env object has both Path and PATH, leading to unpredictable behavior: the child process may lose the system path entirely, preventing bun and other tools from being found.

Fix in CursorFix in Web

@LouisDeconinck

Copy link
Copy Markdown

What is the status on this?

@juliusmarmingejuliusmarminge mentioned this pull request Jun 10, 2026
4 tasks
@juliusmarmingeChatGPT Codex Connector

Copy link
Copy Markdown
Member

Closing because the artifact-name collision remains unresolved, the release pipeline changed materially, and there has been no author follow-up.

This was closed as part of a large repo-wide maintenance sweep. If you think it's still relevant, please reopen.

bigpod98 pushed a commit to bigpod98/t3code that referenced this pull request Aug 6, 2026
The packaging metadata in this branch is complete, but nothing builds or ships
the packages: the release matrix builds AppImage only, and the collect and
upload steps never mention .deb or .rpm.
Rather than add a matrix entry per format, the existing Linux entry now builds
`AppImage,deb,rpm` in one electron-builder run. A second entry would collide on
the upload artifact name -- `desktop-${platform}-${arch}` is identical for two
entries differing only by target, which is what sank pingdotgg#1655 -- while
artifactName's ${ext} already keeps the output files apart. One runner, one
artifact name, no extra release wall-clock.
`resolveLinuxTargets` splits the comma-separated target, and the deb/rpm config
sections plus the headless launcher now key off the resolved list rather than an
exact string match, so a combined build configures both formats.
Both `action-gh-release` blocks (first release and subsequent releases) carry
their own file list; both needed the new patterns, otherwise the packages build
and never ship.
electron-builder shells out to rpmbuild for the rpm target. The Ubuntu runner
image ships it in the `rpm` package (4.18.2 on 24.04), so the added step is a
no-op there; it installs the package only when the binary is missing.
Also adds the per-arch dist script variants (matching dist:desktop:dmg/win),
docs for both formats, download-page cards, and tests over the target split.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@YougLin-dev@LouisDeconinck@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat(release): add deb packaging pipeline - #1655

Closed
YougLin-dev wants to merge 2 commits into
pingdotgg:mainfrom
YougLin-dev:feat/deb-release-pipeline
Closed

feat(release): add deb packaging pipeline#1655
YougLin-dev wants to merge 2 commits into
pingdotgg:mainfrom
YougLin-dev:feat/deb-release-pipeline

Conversation

@YougLin-dev

@YougLin-devYougLin-dev commented Apr 1, 2026

Copy link
Copy Markdown

What Changed

  • Added Linux .deb packaging to the desktop release flow.
  • Updated the GitHub release workflow to build, collect, and publish .deb artifacts alongside the existing desktop assets.
  • Added a dedicated local command for Debian packaging: bun run dist:desktop:deb.
  • Hardened the desktop artifact build script so staging installs no longer depend on a globally available node-gyp.
  • Added the Debian metadata required by electron-builder / fpm for .deb output.
  • Updated the marketing download surfaces to expose the new Linux .deb download option.
  • Updated release documentation to reflect the new release artifact set and Linux packaging behavior.

Why

  • We needed a first-class Debian package in addition to the existing AppImage output.
  • Local packaging was working, but CI/CD was not set up to produce and publish .deb assets.
  • The packaging flow was brittle because staging installs could fail when node-pty needed to rebuild without a resolvable node-gyp.
  • Debian packaging also requires metadata that was not previously present in the staged package config.
  • The download UI needed to reflect the new distribution option so users can actually discover and install it.

UI Changes

  • Added a new Linux download card for Debian / Ubuntu (.deb) on the /download page.
  • Updated the Linux homepage download CTA to fall back to .deb when an AppImage asset is not available.
  • No animation or interaction behavior changed.

Before:

  • Linux downloads exposed AppImage only.

After:

  • Linux downloads expose both AppImage and .deb.

Screenshots:

  • Attach before/after screenshots of the /download page showing the added .deb card.

Video:

  • Not applicable. There are no animation or interaction changes in this PR.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes (not applicable: no animation/interaction changes)

Note

Medium Risk
Changes the CI release matrix and desktop artifact build/staging process, which could break production release builds or dependency installation (notably native modules) across platforms. Limited runtime impact for users, but packaging/metadata changes for Linux releases need verification.

Overview
Adds first-class Linux .deb packaging to the desktop release workflow: CI now builds an additional Linux deb target, collects/publishes *.deb assets, and includes them in the GitHub Release upload set.

Extends local tooling and build staging to support .deb output by adding dist:desktop:deb, injecting Debian metadata (homepage, Linux maintainer) into the staged package.json, and hardening dependency installs via a generated node-gyp shim + cleaned env so staging no longer relies on a globally available node-gyp.

Updates marketing download surfaces to expose the new .deb option (new Linux download card on /download, and homepage Linux CTA falls back to .deb if no AppImage), and refreshes docs/release.md to document the new artifact set and that Linux auto-update remains AppImage-only.

Written by Cursor Bugbot for commit 8fbc65d. This will update automatically on new commits. Configure here.

@coderabbitai

coderabbitaiBot commented Apr 1, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 1c404c4f-9d6f-4f6e-b957-b8bf9c90d166

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ 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 and usage tips.

@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Apr 1, 2026

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

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

"release/*.dmg" \
"release/*.zip" \
"release/*.AppImage" \
"release/*.deb" \

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.

Duplicate artifact name causes Linux build upload conflict

High Severity

The two new Linux matrix entries (Linux x64 AppImage and Linux x64 deb) both have platform: linux and arch: x64, so the artifact upload name desktop-${{ matrix.platform }}-${{ matrix.arch }} resolves to desktop-linux-x64 for both jobs. With actions/upload-artifact@v7, uploading a second artifact with the same name in the same workflow run results in a 409 Conflict error. The artifact name template needs to incorporate matrix.target to differentiate the two Linux builds.

Additional Locations (1)
Fix in CursorFix in Web

if (nodeGypShim) {
buildEnv.PATH = [nodeGypShim.shimDir, buildEnv.PATH]
.filter(Boolean)
.join(process.platform === "win32" ? ";" : ":");

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.

Windows PATH key casing causes broken environment variable

Medium Severity

On Windows, spreading process.env into a plain object loses case-insensitivity — the path key is stored as Path, not PATH. Reading buildEnv.PATH returns undefined, so the assignment creates a newPATH key containing only nodeGypShim.shimDir, while Path (with the real system path) remains untouched. The resulting env object has both Path and PATH, leading to unpredictable behavior: the child process may lose the system path entirely, preventing bun and other tools from being found.

Fix in CursorFix in Web

@LouisDeconinck

Copy link
Copy Markdown

What is the status on this?

@juliusmarmingejuliusmarminge mentioned this pull request Jun 10, 2026
4 tasks
@juliusmarmingeChatGPT Codex Connector

Copy link
Copy Markdown
Member

Closing because the artifact-name collision remains unresolved, the release pipeline changed materially, and there has been no author follow-up.

This was closed as part of a large repo-wide maintenance sweep. If you think it's still relevant, please reopen.

bigpod98 pushed a commit to bigpod98/t3code that referenced this pull request Aug 6, 2026
The packaging metadata in this branch is complete, but nothing builds or ships
the packages: the release matrix builds AppImage only, and the collect and
upload steps never mention .deb or .rpm.
Rather than add a matrix entry per format, the existing Linux entry now builds
`AppImage,deb,rpm` in one electron-builder run. A second entry would collide on
the upload artifact name -- `desktop-${platform}-${arch}` is identical for two
entries differing only by target, which is what sank pingdotgg#1655 -- while
artifactName's ${ext} already keeps the output files apart. One runner, one
artifact name, no extra release wall-clock.
`resolveLinuxTargets` splits the comma-separated target, and the deb/rpm config
sections plus the headless launcher now key off the resolved list rather than an
exact string match, so a combined build configures both formats.
Both `action-gh-release` blocks (first release and subsequent releases) carry
their own file list; both needed the new patterns, otherwise the packages build
and never ship.
electron-builder shells out to rpmbuild for the rpm target. The Ubuntu runner
image ships it in the `rpm` package (4.18.2 on 24.04), so the added step is a
no-op there; it installs the package only when the binary is missing.
Also adds the per-arch dist script variants (matching dist:desktop:dmg/win),
docs for both formats, download-page cards, and tests over the target split.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@YougLin-dev@LouisDeconinck@juliusmarminge
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat(release): add deb packaging pipeline - #1655

Closed
YougLin-dev wants to merge 2 commits into
pingdotgg:mainfrom
YougLin-dev:feat/deb-release-pipeline
Closed

feat(release): add deb packaging pipeline#1655
YougLin-dev wants to merge 2 commits into
pingdotgg:mainfrom
YougLin-dev:feat/deb-release-pipeline

Conversation

@YougLin-dev

@YougLin-devYougLin-dev commented Apr 1, 2026

Copy link
Copy Markdown

What Changed

  • Added Linux .deb packaging to the desktop release flow.
  • Updated the GitHub release workflow to build, collect, and publish .deb artifacts alongside the existing desktop assets.
  • Added a dedicated local command for Debian packaging: bun run dist:desktop:deb.
  • Hardened the desktop artifact build script so staging installs no longer depend on a globally available node-gyp.
  • Added the Debian metadata required by electron-builder / fpm for .deb output.
  • Updated the marketing download surfaces to expose the new Linux .deb download option.
  • Updated release documentation to reflect the new release artifact set and Linux packaging behavior.

Why

  • We needed a first-class Debian package in addition to the existing AppImage output.
  • Local packaging was working, but CI/CD was not set up to produce and publish .deb assets.
  • The packaging flow was brittle because staging installs could fail when node-pty needed to rebuild without a resolvable node-gyp.
  • Debian packaging also requires metadata that was not previously present in the staged package config.
  • The download UI needed to reflect the new distribution option so users can actually discover and install it.

UI Changes

  • Added a new Linux download card for Debian / Ubuntu (.deb) on the /download page.
  • Updated the Linux homepage download CTA to fall back to .deb when an AppImage asset is not available.
  • No animation or interaction behavior changed.

Before:

  • Linux downloads exposed AppImage only.

After:

  • Linux downloads expose both AppImage and .deb.

Screenshots:

  • Attach before/after screenshots of the /download page showing the added .deb card.

Video:

  • Not applicable. There are no animation or interaction changes in this PR.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • I included before/after screenshots for any UI changes
  • I included a video for animation/interaction changes (not applicable: no animation/interaction changes)

Note

Medium Risk
Changes the CI release matrix and desktop artifact build/staging process, which could break production release builds or dependency installation (notably native modules) across platforms. Limited runtime impact for users, but packaging/metadata changes for Linux releases need verification.

Overview
Adds first-class Linux .deb packaging to the desktop release workflow: CI now builds an additional Linux deb target, collects/publishes *.deb assets, and includes them in the GitHub Release upload set.

Extends local tooling and build staging to support .deb output by adding dist:desktop:deb, injecting Debian metadata (homepage, Linux maintainer) into the staged package.json, and hardening dependency installs via a generated node-gyp shim + cleaned env so staging no longer relies on a globally available node-gyp.

Updates marketing download surfaces to expose the new .deb option (new Linux download card on /download, and homepage Linux CTA falls back to .deb if no AppImage), and refreshes docs/release.md to document the new artifact set and that Linux auto-update remains AppImage-only.

Written by Cursor Bugbot for commit 8fbc65d. This will update automatically on new commits. Configure here.

@coderabbitai

coderabbitaiBot commented Apr 1, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 1c404c4f-9d6f-4f6e-b957-b8bf9c90d166

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ 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 and usage tips.

@github-actionsgithub-actionsBot added size:L 100-499 changed lines (additions + deletions). vouch:unvouched PR author is not yet trusted in the VOUCHED list. labels Apr 1, 2026

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

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

"release/*.dmg" \
"release/*.zip" \
"release/*.AppImage" \
"release/*.deb" \

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.

Duplicate artifact name causes Linux build upload conflict

High Severity

The two new Linux matrix entries (Linux x64 AppImage and Linux x64 deb) both have platform: linux and arch: x64, so the artifact upload name desktop-${{ matrix.platform }}-${{ matrix.arch }} resolves to desktop-linux-x64 for both jobs. With actions/upload-artifact@v7, uploading a second artifact with the same name in the same workflow run results in a 409 Conflict error. The artifact name template needs to incorporate matrix.target to differentiate the two Linux builds.

Additional Locations (1)
Fix in CursorFix in Web

if (nodeGypShim) {
buildEnv.PATH = [nodeGypShim.shimDir, buildEnv.PATH]
.filter(Boolean)
.join(process.platform === "win32" ? ";" : ":");

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.

Windows PATH key casing causes broken environment variable

Medium Severity

On Windows, spreading process.env into a plain object loses case-insensitivity — the path key is stored as Path, not PATH. Reading buildEnv.PATH returns undefined, so the assignment creates a newPATH key containing only nodeGypShim.shimDir, while Path (with the real system path) remains untouched. The resulting env object has both Path and PATH, leading to unpredictable behavior: the child process may lose the system path entirely, preventing bun and other tools from being found.

Fix in CursorFix in Web

@LouisDeconinck

Copy link
Copy Markdown

What is the status on this?

@juliusmarmingejuliusmarminge mentioned this pull request Jun 10, 2026
4 tasks
@juliusmarmingeChatGPT Codex Connector

Copy link
Copy Markdown
Member

Closing because the artifact-name collision remains unresolved, the release pipeline changed materially, and there has been no author follow-up.

This was closed as part of a large repo-wide maintenance sweep. If you think it's still relevant, please reopen.

bigpod98 pushed a commit to bigpod98/t3code that referenced this pull request Aug 6, 2026
The packaging metadata in this branch is complete, but nothing builds or ships
the packages: the release matrix builds AppImage only, and the collect and
upload steps never mention .deb or .rpm.
Rather than add a matrix entry per format, the existing Linux entry now builds
`AppImage,deb,rpm` in one electron-builder run. A second entry would collide on
the upload artifact name -- `desktop-${platform}-${arch}` is identical for two
entries differing only by target, which is what sank pingdotgg#1655 -- while
artifactName's ${ext} already keeps the output files apart. One runner, one
artifact name, no extra release wall-clock.
`resolveLinuxTargets` splits the comma-separated target, and the deb/rpm config
sections plus the headless launcher now key off the resolved list rather than an
exact string match, so a combined build configures both formats.
Both `action-gh-release` blocks (first release and subsequent releases) carry
their own file list; both needed the new patterns, otherwise the packages build
and never ship.
electron-builder shells out to rpmbuild for the rpm target. The Ubuntu runner
image ships it in the `rpm` package (4.18.2 on 24.04), so the added step is a
no-op there; it installs the package only when the binary is missing.
Also adds the per-arch dist script variants (matching dist:desktop:dmg/win),
docs for both formats, download-page cards, and tests over the target split.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L100-499 changed lines (additions + deletions).vouch:unvouchedPR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@YougLin-dev@LouisDeconinck@juliusmarminge