Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
1a80fb6
:sparkles: feat: init desktop
SimonShiki Apr 8, 2026
d1e75d9
:wrench: chore: made desktop runnable
SimonShiki Apr 8, 2026
eaf43e3
:wrench: chore(desktop): implement dev server by ourselves
SimonShiki Apr 9, 2026
c13c75f
:wrench: chore: redo electron dev server
SimonShiki Apr 9, 2026
90fa069
:wrench: chore: add desktop gui hoc
SimonShiki Apr 9, 2026
43a694d
:construction: merge: update with feat/refined-gui-ts-support
SimonShiki Apr 9, 2026
08194f5
:sparkles: feat: re-add multiple windows
SimonShiki Apr 9, 2026
6742868
:sparkles: feat(desktop): add bundle workflow
SimonShiki Apr 10, 2026
575f8e6
:wrench: chore(desktop): reduce complexity
SimonShiki Apr 10, 2026
48e3eaf
:bug: fix(desktop): add back save before exit dialog
SimonShiki Apr 10, 2026
3e0e92c
:bug: fix(desktop): add macos menu and custom ua
SimonShiki Apr 10, 2026
8d9525d
:construction: merge: update with feat/refined-gui-ts-support
SimonShiki Apr 11, 2026
9f52621
:construction: chore: update with dev/3.2
SimonShiki Apr 15, 2026
76ee9d8
:wrench: chore: update with dev/3.2
SimonShiki Apr 16, 2026
f027ade
:wrench: chore: add hot reload support for desktop
SimonShiki Apr 16, 2026
b139c91
:bug: fix(render): include missing node polyfills
SimonShiki Apr 16, 2026
94e164c
:bug: fix(desktop): wrong host
SimonShiki Apr 16, 2026
aabbfc8
:wrench: chore: add desktop build workflow
SimonShiki Apr 16, 2026
7fcecb4
:wrench: chore(desktop): generate icons from svg
SimonShiki Apr 16, 2026
397a296
:bug: fix(desktop): bundle dist recursively
SimonShiki Apr 16, 2026
eafed97
:wrench: chore(desktop): change email [ci skip]
SimonShiki Apr 16, 2026
78dc489
:wrench: chore(desktop): remove unneeded dirname alias
SimonShiki Apr 16, 2026
0ab5b2f
:wrench: chore: remove left esbuild onlyBuiltDependencies
SimonShiki Apr 16, 2026
41ff9ea
:wrench: chore(desktop): rename dotenv file
SimonShiki Apr 18, 2026
7543bee
:fire: chore(desktop): remove unused make icons since we already writ…
SimonShiki Apr 18, 2026
cf5d530
:wrench: chore(desktop): remove rebundant type inferrence
SimonShiki Apr 18, 2026
9b8eb67
:wrench: chore(desktop): hide privacy for now
SimonShiki Apr 18, 2026
783bbef
:package: chore(desktop): fix ghost dependency
SimonShiki Apr 18, 2026
b3d2065
:memo: docs(desktop): add readme
SimonShiki Apr 18, 2026
c846aef
:construction_worker: chore: build desktop when prereleased
SimonShiki Apr 18, 2026
a02ed48
:fire: chore(desktop): remove all import.meta.* alias
SimonShiki Apr 18, 2026
8d4c0d9
:fire: chore(desktop): remove unused assets
SimonShiki Apr 19, 2026
4809c67
:construction: merge: update with dev/3.2
SimonShiki Apr 19, 2026
409875b
:wrench: chore(desktop): generate cc3 icon from svg file
SimonShiki Apr 20, 2026
52a719e
:fire: chore(desktop): remove all privacy usage
SimonShiki Apr 20, 2026
71e413b
:wrench: chore(desktop): use soil version cc3 icon
SimonShiki Apr 21, 2026
bdd5880
:wrench: chore: import react tabs from gui
SimonShiki Apr 21, 2026
841a9d2
:bento: chore(desktop): add ccx icon
SimonShiki Apr 21, 2026
2f7dcc2
:wrench: chore(desktop): redirect babel-loader cwd
SimonShiki Apr 23, 2026
bd52bc1
:wrench: chore: add missing gitignore & node polyfills plugin
SimonShiki Apr 24, 2026
8c3f98f
:wrench: chore(desktop): add missing dependencies
SimonShiki Apr 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 64 additions & 0 deletions .github/workflows/desktop.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
name: Build Desktop App

on:
workflow_dispatch:
release:
types: [published, prereleased]

jobs:
build:
name: Build on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]

steps:
- name: Checkout Code
uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: 22

- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 9

- name: Install Dependencies
run: pnpm install --frozen-lockfile

- name: Build and Bundle
run: |
pnpm --filter clipcc-desktop run fetch-library
pnpm --filter clipcc-desktop run bundle:dist
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: Upload to Release
uses: softprops/action-gh-release@v2
if: github.event_name == 'release'
with:
files: |
app/desktop/dist/*.exe
app/desktop/dist/*.zip
app/desktop/dist/*.dmg
app/desktop/dist/*.AppImage
app/desktop/dist/*.deb
app/desktop/dist/*.rpm

- name: Upload to Aurora Release
uses: softprops/action-gh-release@v2
if: github.event_name == 'workflow_dispatch'
with:
tag_name: aurora
files: |
app/desktop/dist/*.exe
app/desktop/dist/*.zip
app/desktop/dist/*.dmg
app/desktop/dist/*.AppImage
app/desktop/dist/*.deb
app/desktop/dist/*.rpm
15 changes: 15 additions & 0 deletions app/desktop/.env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# electron-builder signing placeholders for distribution builds (`--mode=dist`)
# Fill these in CI/local secret store as needed.

# Windows/macOS code signing certificate
CSC_LINK=
CSC_KEY_PASSWORD=

# Optional Windows-specific override certificate (when different from CSC_*)
WIN_CSC_LINK=
WIN_CSC_KEY_PASSWORD=

# Optional macOS notarization (recommended App Store Connect API key method)
APPLE_API_KEY=
APPLE_API_KEY_ID=
APPLE_API_ISSUER=
30 changes: 30 additions & 0 deletions app/desktop/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# Mac OS
.DS_Store

# Windows
thumbs.db

# NPM
/node_modules
npm-*

# Testing
/.nyc_output
/coverage
.eslintcache

# Build
/build
/dist
/.opt-in
/*.provisionprofile

# don't store the assets downloaded with the `fetch` script
/static/assets/

# generated translation files
/translations
/locale

# Environment
.env
21 changes: 21 additions & 0 deletions app/desktop/LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
MIT License

Copyright (c) 2026 Clipteam

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
61 changes: 61 additions & 0 deletions app/desktop/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
# clipcc-desktop
ClipCC as a standalone desktop application.

## Installation

### From GitHub

See [Releases](https://github.com/Clipteam/clipcc/releases).
We always release the latest version on GitHub, please download it from there if you want to be up-to-date.

### From Package Managers

### WinGet (Windows users)

> The WinGet package is maintained by the community and may not be up-to-date.

On Windows, you can use winget to install ClipCC.

```powershell
winget install ClipTeam.ClipCC
```
### AUR (Arch Linux users)

> The WinGet package is maintained by the community and may not be up-to-date.

For Arch Linux users, you can install the AUR package [clipcc](https://aur.archlinux.org/packages/clipcc) or [clipcc-beta-bin](https://aur.archlinux.org/packages/clipcc-beta-bin):
```bash
yay -S clipcc
```
Or
```bash
yay -S clipcc-beta-bin
```
_Note that these two packages conflict with each other._

## Development

> Since desktop is placed in the monorepo, you need to set up the monorepo first. Please refer to the [contributing guide](/CONTRIBUTING.md) for instructions.
> All commands below are run in the root directory.

You need to fetch library assets from server for the first time and need to update them:
```bash
pnpm desktop fetch-library
```
If you need to start the development server, run:
```bash
pnpm desktop start
```
It will use webpack-dev-server to serve the renderer process and use regular webpack to build and electron to serve the main process. The renderer process will automatically reload when you make changes, and restart the electron process when you make changes to the main or preload part.

To build the application for development purposes, run:
```bash
pnpm desktop bundle:dev # or pnpm desktop bundle:dir
```
The build artifacts will be placed in `dist/win32-unpacked`.
For production build, run:
```bash
pnpm desktop bundle:dist
```

You may need a code signing certificate and modify `.env` to build the application for production. Please refer to the [code signing guide](https://www.electron.build/code-signing) for more details.
6 changes: 6 additions & 0 deletions app/desktop/buildResources/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
/ClipCC.iconset
/tmp
/app.icns
/app.ico
/icon/
/appx/*.png
24 changes: 24 additions & 0 deletions app/desktop/buildResources/entitlements.mac.plist
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.cs.allow-dyld-environment-variables</key>
<true/>
<key>com.apple.security.cs.allow-jit</key>
<true/>
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
<true/>
<key>com.apple.security.device.audio-input</key>
<true/>
<key>com.apple.security.device.camera</key>
<true/>
<key>com.apple.security.device.microphone</key>
<true/>
<key>com.apple.security.files.user-selected.read-only</key>
<true/>
<key>com.apple.security.files.user-selected.read-write</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>
</dict>
</plist>
10 changes: 10 additions & 0 deletions app/desktop/buildResources/entitlements.mas.inherit.plist
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.inherit</key>
<true/>
</dict>
</plist>
26 changes: 26 additions & 0 deletions app/desktop/buildResources/entitlements.mas.plist
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.security.app-sandbox</key>
<true/>
<key>com.apple.security.cs.allow-dyld-environment-variables</key>
<true/>
<key>com.apple.security.cs.allow-jit</key>
<true/>
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
<true/>
<key>com.apple.security.device.audio-input</key>
<true/>
<key>com.apple.security.device.camera</key>
<true/>
<key>com.apple.security.device.microphone</key>
<true/>
<key>com.apple.security.files.user-selected.read-only</key>
<true/>
<key>com.apple.security.files.user-selected.read-write</key>
<true/>
<key>com.apple.security.network.client</key>
<true/>
</dict>
</plist>
40 changes: 40 additions & 0 deletions app/desktop/buildResources/install.nsh
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
!macro customInstall
#WriteRegStr HKCR "clipcc" "" "URL:clipcc"
#WriteRegStr HKCR "clipcc" "URL Protocol" ""
#WriteRegStr HKCR "clipcc\shell\open\command" "" '"$INSTDIR\ClipCC 3.exe"'

WriteRegStr HKCR ".sb2" "" "clipcc.sb2"
WriteRegStr HKCR ".sb2" "Content Type" "application/x-zip-compressed"
WriteRegStr HKCR ".sb2" "PerceivedType" "compressed"
WriteRegStr HKCR ".sb2\OpenWithProgIds" "clipcc.sb2" ""

WriteRegStr HKCR ".sb3" "" "clipcc.sb3"
WriteRegStr HKCR ".sb3" "Content Type" "application/x-zip-compressed"
WriteRegStr HKCR ".sb3" "PerceivedType" "compressed"
WriteRegStr HKCR ".sb3\OpenWithProgIds" "clipcc.sb3" ""

WriteRegStr HKCR ".cc3" "" "clipcc.cc3"
WriteRegStr HKCR ".cc3" "Content Type" "application/x-zip-compressed"
WriteRegStr HKCR ".cc3" "PerceivedType" "compressed"
WriteRegStr HKCR ".cc3\OpenWithProgIds" "clipcc.cc3" ""

WriteRegStr HKCR ".ccx" "" "clipcc.ccx"
WriteRegStr HKCR ".ccx" "Content Type" "application/x-zip-compressed"
WriteRegStr HKCR ".ccx" "PerceivedType" "compressed"
WriteRegStr HKCR ".cc3\OpenWithProgIds" "clipcc.ccx" ""

WriteRegStr HKCR "clipcc.sb2" "" "Scratch 2 File"
WriteRegStr HKCR "clipcc.sb2\DefaultIcon" "" '"$INSTDIR\resources\icon\cc3.ico"'
WriteRegStr HKCR "clipcc.sb2\shell\open\command" "" '"$INSTDIR\ClipCC 3.exe" "%1"'

WriteRegStr HKCR "clipcc.sb3" "" "Scratch 3 File"
WriteRegStr HKCR "clipcc.sb3\DefaultIcon" "" '"$INSTDIR\resources\icon\cc3.ico"'
WriteRegStr HKCR "clipcc.sb3\shell\open\command" "" '"$INSTDIR\ClipCC 3.exe" "%1"'

WriteRegStr HKCR "clipcc.cc3" "" "ClipCC 3 File"
WriteRegStr HKCR "clipcc.cc3\DefaultIcon" "" '"$INSTDIR\resources\icon\cc3.ico"'
WriteRegStr HKCR "clipcc.cc3\shell\open\command" "" '"$INSTDIR\ClipCC 3.exe" "%1"'

WriteRegStr HKCR "clipcc.ccx" "" "ClipCC 3 Extension"
WriteRegStr HKCR "clipcc.ccx\DefaultIcon" "" '"$INSTDIR\resources\icon\ccx.ico"'
!macroend
64 changes: 64 additions & 0 deletions app/desktop/electron-builder.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
appId: com.codingclip.clipcc3
productName: ClipCC
electronVersion: 41.2.0
artifactName: clipcc-${version}-${os}-${arch}.${ext}
copyright: Copyright © 2019-2026 Clip Team.
compression: maximum
publish: null

directories:
buildResources: buildResources
output: dist

files:
- dist/main/**/*
- dist/renderer/**/*
- package.json

extraResources:
- from: buildResources/icon
to: icon

mac:
category: public.app-category.education
icon: buildResources/app.icns
entitlements: buildResources/entitlements.mac.plist
entitlementsInherit: buildResources/entitlements.mas.inherit.plist
hardenedRuntime: true
target:
- target: dmg
extendInfo:
NSCameraUsageDescription: >-
This app requires camera access when using the video sensing blocks.
NSMicrophoneUsageDescription: >-
This app requires microphone access when recording sounds or detecting loudness.

dmg:
title: ClipCC ${version}

win:
icon: buildResources/app.ico
target:
- target: nsis
arch:
- x64
- ia32
- target: zip
arch:
- x64

nsis:
oneClick: false
allowElevation: true
allowToChangeInstallationDirectory: true
createDesktopShortcut: true
createStartMenuShortcut: true
license: ../../LICENSE
include: buildResources/install.nsh

linux:
category: Education
target:
- target: AppImage
- target: deb
- target: rpm
Loading
Loading