From 1cc748e11a06af2922f474ac338a0cb98b11af67 Mon Sep 17 00:00:00 2001 From: Thomas Spura Date: Mon, 12 Oct 2026 17:52:56 +0200 Subject: [PATCH 1/6] feat(linux): add rpm to electron-builder targets --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index ac9f1217..6bc7d1a1 100644 --- a/package.json +++ b/package.json @@ -174,7 +174,8 @@ "linux": { "target": [ "AppImage", - "deb" + "deb", + "rpm" ], "category": "Development", "desktop": { From 4aa1444f670252701a84d14581142d1c1469b324 Mon Sep 17 00:00:00 2001 From: Thomas Spura Date: Mon, 12 Oct 2026 17:53:03 +0200 Subject: [PATCH 2/6] ci(linux): install rpm tooling for release builds --- .github/workflows/release.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6223d562..e4664443 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -36,6 +36,9 @@ jobs: - run: npm ci + - name: Install rpm tooling for electron-builder + run: sudo apt-get update && sudo apt-get install -y rpm + - name: Build and publish env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} From 0aa909e02ed2a1a6955bbca50582f6923219c04b Mon Sep 17 00:00:00 2001 From: Thomas Spura Date: Mon, 12 Oct 2026 17:53:36 +0200 Subject: [PATCH 3/6] feat(install): support rpm via dnf/zypper with build-only mode --- install.sh | 57 ++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 47 insertions(+), 10 deletions(-) diff --git a/install.sh b/install.sh index 917b9628..dd7d8474 100755 --- a/install.sh +++ b/install.sh @@ -39,21 +39,58 @@ case "$OS" in ;; Linux) + NO_INSTALL=0 + if [ "${1:-}" = "--no-install" ]; then + NO_INSTALL=1 + fi + echo "Building release for Linux..." - rm -f "$SCRIPT_DIR"/release/*.deb - npm run build + rm -f "$SCRIPT_DIR"/release/*.deb "$SCRIPT_DIR"/release/*.rpm + npm run build:frontend && npm run build:remote && npm run compile && npm run build:mcp - DEB_FILE=$(find "$SCRIPT_DIR/release" -name '*.deb' -type f | head -1) + if command -v dnf >/dev/null 2>&1 || command -v zypper >/dev/null 2>&1; then + npx electron-builder --linux rpm --publish never - if [ -z "$DEB_FILE" ]; then - echo "Error: no .deb found in release/" - exit 1 - fi + RPM_FILE=$(find "$SCRIPT_DIR/release" -name '*.rpm' -type f | head -1) + + if [ -z "$RPM_FILE" ]; then + echo "Error: no .rpm found in release/" + exit 1 + fi + + if [ "$NO_INSTALL" = "1" ]; then + echo "Built $RPM_FILE (not installed)." + exit 0 + fi - echo "Installing $DEB_FILE..." - sudo dpkg -i "$DEB_FILE" + echo "Installing $RPM_FILE..." + if command -v dnf >/dev/null 2>&1; then + sudo dnf install "$RPM_FILE" + else + sudo zypper install "$RPM_FILE" + fi - echo "Installed successfully via dpkg" + echo "Installed successfully" + else + npx electron-builder --linux AppImage deb --publish never + + DEB_FILE=$(find "$SCRIPT_DIR/release" -name '*.deb' -type f | head -1) + + if [ -z "$DEB_FILE" ]; then + echo "Error: no .deb found in release/" + exit 1 + fi + + if [ "$NO_INSTALL" = "1" ]; then + echo "Built $DEB_FILE (not installed)." + exit 0 + fi + + echo "Installing $DEB_FILE..." + sudo dpkg -i "$DEB_FILE" + + echo "Installed successfully via dpkg" + fi ;; *) From 896707912b32e3e0555daea179aa16113a7c214d Mon Sep 17 00:00:00 2001 From: Thomas Spura Date: Mon, 12 Oct 2026 17:53:44 +0200 Subject: [PATCH 4/6] docs(linux): document rpm download and install --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 693aaf1f..21b1157b 100644 --- a/README.md +++ b/README.md @@ -91,7 +91,7 @@ When you're happy with the result, merge the branch back to main from the sideba - **Canvas per task** — a Markdown file from the worktree rendered live as the agent writes it; edit it in place, or select a passage and send it to the agent with your question - **Browser preview in the canvas** — run a local app in the task shell, open **+ → Browser**, and pick elements to reference in your prompt ([usage and limits](docs/browser-preview.md)) - **PR CI status watcher** — desktop notification when GitHub checks settle -- **Super Productivity integration** — the task you focus is tracked in Super Productivity (a matching task is created there on first focus, in the Super Productivity project you link in project settings), titles stay in sync, and merging or closing a task marks it done there. A task Super Productivity is already tracking that isn't a Parallel Code task is never replaced — a banner offers to switch instead. Connect in Settings with the token from Super Productivity's Local REST API (Settings → Misc; the API must stay turned on). With Super Productivity's bundled **Parallel Code** plugin enabled, **Start in Parallel Code** on a task opens a pre-filled New Task form here; that link needs the macOS app or the `.deb` (an AppImage only handles it if it was integrated into your desktop). +- **Super Productivity integration** — the task you focus is tracked in Super Productivity (a matching task is created there on first focus, in the Super Productivity project you link in project settings), titles stay in sync, and merging or closing a task marks it done there. A task Super Productivity is already tracking that isn't a Parallel Code task is never replaced — a banner offers to switch instead. Connect in Settings with the token from Super Productivity's Local REST API (Settings → Misc; the API must stay turned on). With Super Productivity's bundled **Parallel Code** plugin enabled, **Start in Parallel Code** on a task opens a pre-filled New Task form here; that link needs the macOS app or the `.deb`/`.rpm` (an AppImage only handles it if it was integrated into your desktop). - Shell terminals per task, scoped to the worktree - **Direct mode** for working on the main branch without isolation, plus support for **folders without a git repo** - **Existing worktree import** — bring already-created worktrees into Parallel Code @@ -120,7 +120,7 @@ When you're happy with the result, merge the branch back to main from the sideba 1. **Download** the latest release for your platform from the [releases page](https://github.com/johannesjo/parallel-code/releases/latest): - **macOS** — `.dmg` (universal) - - **Linux** — `.AppImage` or `.deb` + - **Linux** — `.AppImage`, `.deb` (Debian/Ubuntu: `sudo dpkg -i file.deb`) or `.rpm` (Fedora: `sudo dnf install file.rpm`; openSUSE: `sudo zypper install file.rpm`) 2. **Install at least one AI coding CLI:** [Claude Code](https://docs.anthropic.com/en/docs/claude-code), [Codex CLI](https://github.com/openai/codex), [Gemini CLI](https://github.com/google-gemini/gemini-cli), [Antigravity CLI](https://antigravity.google/), or [Copilot CLI](https://docs.github.com/en/copilot/concepts/agents/about-copilot-cli) From 1a882efce1cd4929ca6246f2cbbdc4b138a4621a Mon Sep 17 00:00:00 2001 From: Thomas Spura Date: Mon, 12 Oct 2026 18:14:45 +0200 Subject: [PATCH 5/6] feat(linux): use gzip compression for rpm to lower build memory --- package.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/package.json b/package.json index 6bc7d1a1..b8c8c635 100644 --- a/package.json +++ b/package.json @@ -185,6 +185,9 @@ } } }, + "rpm": { + "compression": "gzip" + }, "mac": { "target": [ "dmg", From d57a786817c062574db6150b6fddd329db8d801e Mon Sep 17 00:00:00 2001 From: Thomas Spura Date: Mon, 12 Oct 2026 18:14:57 +0200 Subject: [PATCH 6/6] fix(linux): set desktopName and syncDesktopName for window association --- package.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/package.json b/package.json index b8c8c635..40a79631 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,7 @@ "name": "parallel-code", "version": "4.0.0", "description": "", + "desktopName": "parallel-code.desktop", "author": { "name": "Johannes Millan", "email": "contact@super-productivity.com" @@ -178,6 +179,7 @@ "rpm" ], "category": "Development", + "syncDesktopName": true, "desktop": { "entry": { "StartupWMClass": "parallel-code",