Skip to content

Commit 8ae03c7

Browse files
Add CI workflow to build Windows + macOS Studio installers
Native windows-latest / macos-14 runners build the .exe and .dmg (no cross-compiling / Wine needed) and attach them to the release for the pushed studio-v* tag. Also make the daemon staging step npm call work on Windows (shell: true), add a Windows app icon, and document the Windows download. Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent e6ed512 commit 8ae03c7

5 files changed

Lines changed: 73 additions & 4 deletions

File tree

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
name: Release CodeRouter Studio
2+
3+
# Builds the CodeRouter Studio desktop installers on native runners (so the
4+
# Windows .exe and macOS .dmg are produced without cross-compiling) and
5+
# attaches them to the GitHub release for the pushed tag.
6+
#
7+
# Trigger by pushing a tag like `studio-v0.1.1`, or run manually and pass the
8+
# target release tag.
9+
10+
on:
11+
push:
12+
tags:
13+
- 'studio-v*'
14+
workflow_dispatch:
15+
inputs:
16+
tag:
17+
description: 'Release tag to publish installers to (e.g. studio-v0.1.1)'
18+
required: true
19+
default: studio-v0.1.1
20+
21+
permissions:
22+
contents: write
23+
24+
jobs:
25+
build:
26+
strategy:
27+
fail-fast: false
28+
matrix:
29+
os: [windows-latest, macos-14]
30+
runs-on: ${{ matrix.os }}
31+
steps:
32+
- uses: actions/checkout@v4
33+
34+
- uses: pnpm/action-setup@v4
35+
with:
36+
version: 9.15.0
37+
38+
- uses: actions/setup-node@v4
39+
with:
40+
node-version: 24
41+
cache: pnpm
42+
43+
- name: Install dependencies
44+
run: pnpm install --no-frozen-lockfile
45+
46+
- name: Build installer
47+
run: pnpm --filter @coderouter/app package
48+
env:
49+
# Unsigned builds — skip macOS signing identity discovery so the
50+
# build doesn't fail looking for a Developer ID certificate.
51+
CSC_IDENTITY_AUTO_DISCOVERY: 'false'
52+
53+
- name: Publish to release
54+
uses: softprops/action-gh-release@v2
55+
with:
56+
tag_name: ${{ github.event.inputs.tag || github.ref_name }}
57+
fail_on_unmatched_files: false
58+
files: |
59+
packages/app/release/*.exe
60+
packages/app/release/*.dmg
61+
packages/app/release/*.blockmap
62+
env:
63+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

README.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,12 @@ Use it two ways: the **CLI** (`coderouter`) for the terminal, or **CodeRouter St
1414

1515
CodeRouter Studio is a native desktop app that wraps the same router in a full UI — your projects, chats, loops, usage, and plugins in one place. It runs a persistent local daemon so background work (like loops) keeps going after you close the window.
1616

17-
**Download:** grab the latest `CodeRouter-Studio-*.dmg` (macOS) from the [Releases page](https://github.com/Code-Router/CodeRouter/releases), drag it to Applications, and open it.
17+
**Download** the latest build from the [Releases page](https://github.com/Code-Router/CodeRouter/releases):
1818

19-
> The app isn't notarized yet, so on first launch macOS may warn that it's from an unidentified developer. Right‑click the app → **Open**, then confirm. The app is fully self‑contained — no separate Node or CLI install required.
19+
- **macOS (Apple Silicon):** the `.dmg` — open it and drag CodeRouter Studio to Applications.
20+
- **Windows:** the `.exe` installer — run it and CodeRouter Studio installs and launches.
21+
22+
> Builds aren't code‑signed yet. On macOS, right‑click the app → **Open** and confirm. On Windows, if SmartScreen appears, click **More info → Run anyway**. The app is fully self‑contained — no separate Node or CLI install required.
2023
2124
What's inside:
2225

packages/app/electron-builder.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,5 @@
1111
"icon": "build/icon.icns"
1212
},
1313
"linux": { "target": ["AppImage"], "category": "Development" },
14-
"win": { "target": ["nsis"] }
14+
"win": { "target": ["nsis"], "icon": "build/icon.png" }
1515
}

packages/app/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@coderouter/app",
3-
"version": "0.1.0",
3+
"version": "0.1.1",
44
"private": true,
55
"description": "CodeRouter Studio — Electron desktop app (Loops, Projects, Chats, Usage)",
66
"author": "Efe Acar",

packages/app/scripts/stage-daemon.mjs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,12 @@ writeFileSync(
6868
);
6969

7070
console.log('[stage-daemon] installing daemon runtime deps (ink, react, ws, ripgrep)…');
71+
// `shell: true` so this resolves npm.cmd on Windows as well as npm on
72+
// macOS/Linux — the staging step runs on every target platform in CI.
7173
execFileSync('npm', ['install', '--omit=dev', '--no-audit', '--no-fund', '--no-package-lock'], {
7274
cwd: out,
7375
stdio: 'inherit',
76+
shell: true,
7477
});
7578

7679
// 2. node-pty: copy the already-built package (with NAPI prebuilds) from the

0 commit comments

Comments
 (0)