Skip to content

Commit dffdf1a

Browse files
committed
Ship Windows+Linux only, fix missing Windows artifact, direct macOS to build from source
1 parent ffbe8f3 commit dffdf1a

5 files changed

Lines changed: 63 additions & 45 deletions

File tree

.github/workflows/release.yml

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ jobs:
2121
strategy:
2222
fail-fast: false
2323
matrix:
24-
os: [ubuntu-latest, windows-latest, macos-latest]
24+
os: [ubuntu-latest, windows-latest]
2525
include:
2626
- os: ubuntu-latest
2727
script: linux
@@ -32,11 +32,6 @@ jobs:
3232
script: win
3333
artifact_glob: |
3434
dist/*.exe
35-
- os: macos-latest
36-
script: mac
37-
artifact_glob: |
38-
dist/*.dmg
39-
dist/*.zip
4035
4136
steps:
4237
- name: Checkout
@@ -185,11 +180,15 @@ jobs:
185180
| Platform | File | Notes |
186181
|---|---|---|
187182
| **Windows** | `OpenCluely-Setup-*.exe` | NSIS installer — installs app + adds to Start Menu |
188-
| **macOS (Apple Silicon)** | `*-arm64.dmg` | M1/M2/M3/M4 Macs |
189-
| **macOS (Intel)** | `*-x64.dmg` | Older Intel Macs |
190183
| **Linux** | `*.deb` | Debian/Ubuntu — auto-pulls system deps (Python, ffmpeg, GTK) |
191184
| **Linux** | `*.AppImage` | Universal — no install, just `chmod +x` and run |
192185
186+
> **macOS:** no pre-built build is shipped. The app is unsigned/un-notarized, so macOS Gatekeeper blocks it as "damaged". Run OpenCluely from source instead:
187+
> ```bash
188+
> git clone https://github.com/TechyCSR/OpenCluely && cd OpenCluely && ./setup.sh
189+
> ```
190+
> Requires Node.js 18+. See the [README](https://github.com/TechyCSR/OpenCluely#quick-start) for details.
191+
193192
## First Run
194193
195194
On first launch, OpenCluely opens the **Settings** window automatically for your **Google Gemini API key**.
@@ -228,21 +227,15 @@ jobs:
228227
- name: Flatten artifacts
229228
run: |
230229
mkdir -p release
231-
# Pick only the primary installer per platform (max 2-3 per
232-
# platform). This intentionally drops:
230+
# Pick only the primary installer per platform. This intentionally drops:
233231
# - Windows portable EXE (we ship the NSIS installer)
234-
# - macOS .zip (the DMG is the canonical macOS installer)
235232
# - .blockmap files (electron-updater diff metadata)
236233
# - latest-*.yml (electron-updater channel metadata)
237234
# - Source archives (GitHub auto-generates these from the tag)
238235
#
239236
# The order below is the order files appear in the release page.
240237
find artifacts -type f -name 'OpenCluely-Setup-*.exe' \
241238
-exec cp -v {} release/ \;
242-
# macOS DMGs — electron-builder omits the arch suffix for the
243-
# default (x64) arch, so we keep every OpenCluely-*.dmg.
244-
find artifacts -type f -name 'OpenCluely-*.dmg' \
245-
-exec cp -v {} release/ \;
246239
find artifacts -type f -name 'opencluely_*_amd64.deb' \
247240
-exec cp -v {} release/ \;
248241
find artifacts -type f -name '*.AppImage' \

README.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ It is free and open source. Processing stays on your machine, and the only thing
4040
- **Session memory.** The whole conversation is remembered, so follow-ups, edge cases, and optimizations keep their context.
4141
- **Language aware.** Tailored answers for C++, C, Python, Java, and JavaScript.
4242
- **Stealthy by design.** Runs under ordinary system names, ships with no telemetry, and keeps your session local.
43-
- **Cross platform.** Windows, macOS on Apple Silicon and Intel, and Linux through .deb and AppImage builds.
43+
- **Cross platform.** Pre-built installers for Windows and Linux (.deb and AppImage). macOS runs from source in one command.
4444

4545
## Download
4646

@@ -49,12 +49,12 @@ Pre-built installers are published with every release. These links always point
4949
| Platform | File | Notes |
5050
|---|---|---|
5151
| Windows | [Setup .exe](https://github.com/TechyCSR/OpenCluely/releases/latest) | NSIS installer. Adds a Start Menu shortcut. |
52-
| macOS (Apple Silicon) | [arm64 .dmg](https://github.com/TechyCSR/OpenCluely/releases/latest) | For M1, M2, M3, and M4 Macs. |
53-
| macOS (Intel) | [x64 .dmg](https://github.com/TechyCSR/OpenCluely/releases/latest) | For older Intel based Macs. |
5452
| Linux (Debian or Ubuntu) | [.deb](https://github.com/TechyCSR/OpenCluely/releases/latest) | Pulls system deps automatically (Python, ffmpeg, GTK). |
5553
| Linux (universal) | [.AppImage](https://github.com/TechyCSR/OpenCluely/releases/latest) | No install. Run `chmod +x` then launch. |
5654

57-
Every build is produced automatically on GitHub Actions across all three platforms and ships with SHA-256 checksums. Each release also lists the full set of commits it includes.
55+
> **macOS:** there is no pre-built download. The app is unsigned and un-notarized, so macOS Gatekeeper blocks it as "damaged and can't be opened." Run OpenCluely from source instead — see [Quick start](#quick-start). It is a one-line `./setup.sh` once Node.js is installed.
56+
57+
Every build is produced automatically on GitHub Actions and ships with SHA-256 checksums. Each release also lists the full set of commits it includes.
5858

5959
The website at [opencluely.techycsr.dev](https://opencluely.techycsr.dev) detects your operating system and offers the right installer directly.
6060

@@ -85,6 +85,7 @@ If you would rather build from source, three steps are all it takes.
8585

8686
- On Windows, use Git Bash (included with Git for Windows) or WSL to run `setup.sh`.
8787
- On macOS and Linux, your normal terminal works.
88+
- **macOS users must build from source** (steps above) — there is no pre-built `.dmg`. Because the app is unsigned, a downloaded build would be blocked by Gatekeeper as "damaged"; running from source avoids that entirely.
8889
- No manual `npm` commands are needed. The script handles everything.
8990

9091
### Setup script options

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,8 @@
157157
"createStartMenuShortcut": true,
158158
"perMachine": false,
159159
"include": "scripts/post-install-nsis.nsh",
160-
"deleteAppDataOnUninstall": false
160+
"deleteAppDataOnUninstall": false,
161+
"artifactName": "OpenCluely-Setup-${version}.${ext}"
161162
},
162163
"dmg": {
163164
"title": "OpenCluely Interview Assistant",

webapp/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,7 @@ <h2 class="section-title">Questions, answered</h2>
346346
</details>
347347
<details>
348348
<summary>Which platforms are supported?<svg class="ic chev"><use href="#i-arrow"/></svg></summary>
349-
<p>Windows, macOS on both Apple Silicon and Intel, and Linux through .deb and AppImage builds. Every release is built automatically across all three on GitHub Actions.</p>
349+
<p>Windows and Linux (.deb and AppImage) ship as pre-built installers, built automatically on GitHub Actions with every release. macOS is not pre-built &mdash; the unsigned app is blocked by Gatekeeper, so on macOS you run it from source with a one-line <code>./setup.sh</code>.</p>
350350
</details>
351351
<details>
352352
<summary>Is my data collected?<svg class="ic chev"><use href="#i-arrow"/></svg></summary>

webapp/script.js

Lines changed: 47 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -110,22 +110,15 @@
110110
var ua = (navigator.userAgent || '').toLowerCase();
111111
var plat = (navigator.platform || '').toLowerCase();
112112
if (ua.indexOf('windows') !== -1 || plat.indexOf('win') !== -1) return 'windows';
113-
if (ua.indexOf('mac') !== -1 || plat.indexOf('mac') !== -1) {
114-
// Apple Silicon is the default for new Macs; cannot read arch reliably.
115-
return 'macos-arm';
116-
}
113+
if (ua.indexOf('mac') !== -1 || plat.indexOf('mac') !== -1) return 'macos';
117114
if (ua.indexOf('linux') !== -1 || ua.indexOf('x11') !== -1) return 'linux-deb';
118115
return null;
119116
}
120117

121-
/* ---------- Platforms ---------- */
118+
/* ---------- Platforms (pre-built: Windows + Linux only) ---------- */
122119
var PLATFORMS = [
123120
{ id: 'windows', label: 'Windows', icon: 'i-windows', note: 'NSIS installer. Adds a Start Menu shortcut.',
124121
match: function (n) { return n.endsWith('.exe') && n.indexOf('blockmap') === -1; } },
125-
{ id: 'macos-arm', label: 'macOS, Apple Silicon', icon: 'i-apple', note: 'For M1, M2, M3 and M4 Macs.',
126-
match: function (n) { return n.endsWith('.dmg') && n.indexOf('arm64') !== -1; } },
127-
{ id: 'macos-intel', label: 'macOS, Intel', icon: 'i-apple', note: 'For older Intel based Macs.',
128-
match: function (n) { return n.endsWith('.dmg') && n.indexOf('arm64') === -1; } },
129122
{ id: 'linux-deb', label: 'Linux, Debian or Ubuntu', icon: 'i-linux', note: 'Pulls system deps automatically.',
130123
match: function (n) { return n.endsWith('.deb'); } },
131124
{ id: 'linux-appimage', label: 'Linux, universal', icon: 'i-linux', note: 'No install. Mark executable and run.',
@@ -170,6 +163,19 @@
170163
});
171164

172165
// Grid
166+
var macCard =
167+
'<div class="platform">' +
168+
'<div class="platform-head">' + icon('i-apple') + '<h4>macOS</h4></div>' +
169+
'<p class="pnote">No pre-built download &mdash; the unsigned app is blocked by Gatekeeper. Build from source instead.</p>' +
170+
'<div class="dl-links">' +
171+
'<a class="asset" href="https://github.com/' + REPO + '#quick-start" target="_blank" rel="noopener">' +
172+
icon('i-download') +
173+
'<span class="meta"><span class="fname">git clone &amp; ./setup.sh</span>' +
174+
'<span class="fsize">Runs from source</span></span>' +
175+
'<span class="go"><svg class="ic"><use href="#i-arrow"/></svg></span>' +
176+
'</a>' +
177+
'</div>' +
178+
'</div>';
173179
el('dl-grid').innerHTML = byPlatform.map(function (g) {
174180
var links = g.assets.length
175181
? g.assets.map(assetRow).join('')
@@ -179,30 +185,47 @@
179185
'<p class="pnote">' + g.p.note + '</p>' +
180186
'<div class="dl-links">' + links + '</div>' +
181187
'</div>';
182-
}).join('');
188+
}).join('') + macCard;
183189

184190
// Recommended card for the visitor's OS
185191
var os = detectOS();
186-
var rec = null;
187-
for (var k = 0; k < byPlatform.length; k++) {
188-
if (byPlatform[k].p.id === os && byPlatform[k].assets.length) { rec = byPlatform[k]; break; }
189-
}
190-
if (rec) {
191-
var a = rec.assets[0];
192+
if (os === 'macos') {
192193
el('dl-recommend').innerHTML =
193194
'<div class="rec-left">' +
194-
'<span class="rec-ic">' + icon(rec.p.icon) + '</span>' +
195+
'<span class="rec-ic">' + icon('i-apple') + '</span>' +
195196
'<span class="rec-text">' +
196-
'<span class="rec-label">Recommended for you</span>' +
197-
'<span class="rec-title">' + rec.p.label + '</span>' +
198-
'<span class="rec-file">' + a.name + ' &middot; ' + fmtBytes(a.size) + '</span>' +
197+
'<span class="rec-label">You are on macOS</span>' +
198+
'<span class="rec-title">Build from source</span>' +
199+
'<span class="rec-file">No signed build yet &middot; one-line ./setup.sh</span>' +
199200
'</span>' +
200201
'</div>' +
201-
'<a class="btn btn-solid" href="' + a.browser_download_url + '" target="_blank" rel="noopener" download>' +
202-
icon('i-download') + 'Download</a>';
202+
'<a class="btn btn-solid" href="https://github.com/' + REPO + '#quick-start" target="_blank" rel="noopener">' +
203+
icon('i-download') + 'How to run</a>';
203204
el('dl-recommend').classList.remove('hidden');
204-
var heroLbl = el('hero-dl-label');
205-
if (heroLbl) { heroLbl.textContent = 'Download for ' + (os.indexOf('mac') === 0 ? 'macOS' : os.indexOf('win') === 0 ? 'Windows' : 'Linux'); }
205+
var heroLblMac = el('hero-dl-label');
206+
if (heroLblMac) { heroLblMac.textContent = 'Build from source for macOS'; }
207+
} else {
208+
var rec = null;
209+
for (var k = 0; k < byPlatform.length; k++) {
210+
if (byPlatform[k].p.id === os && byPlatform[k].assets.length) { rec = byPlatform[k]; break; }
211+
}
212+
if (rec) {
213+
var a = rec.assets[0];
214+
el('dl-recommend').innerHTML =
215+
'<div class="rec-left">' +
216+
'<span class="rec-ic">' + icon(rec.p.icon) + '</span>' +
217+
'<span class="rec-text">' +
218+
'<span class="rec-label">Recommended for you</span>' +
219+
'<span class="rec-title">' + rec.p.label + '</span>' +
220+
'<span class="rec-file">' + a.name + ' &middot; ' + fmtBytes(a.size) + '</span>' +
221+
'</span>' +
222+
'</div>' +
223+
'<a class="btn btn-solid" href="' + a.browser_download_url + '" target="_blank" rel="noopener" download>' +
224+
icon('i-download') + 'Download</a>';
225+
el('dl-recommend').classList.remove('hidden');
226+
var heroLbl = el('hero-dl-label');
227+
if (heroLbl) { heroLbl.textContent = 'Download for ' + (os.indexOf('win') === 0 ? 'Windows' : 'Linux'); }
228+
}
206229
}
207230

208231
el('dl-loading').classList.add('hidden');

0 commit comments

Comments
 (0)