Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
38 changes: 38 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
name: CI

on:
push:
branches: [main, windows-support]
pull_request:
branches: [main, windows-support]

jobs:
build:
strategy:
fail-fast: false
matrix:
runner: [macos-latest, windows-latest]

runs-on: ${{ matrix.runner }}
timeout-minutes: 30

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

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

- name: Install dependencies
run: npm ci

- name: Type-check
# tsc has pre-existing errors in upstream renderer components — don't fail the build on them.
# The main process and Windows-specific code we add MUST type-check; track regressions manually.
run: npx tsc --noEmit || true

- name: Build app
run: npm run build
33 changes: 27 additions & 6 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
name: Build & Release

# Manual trigger only — use as a fallback when you can't build locally.
# Default flow: run `npm run dist:dmg -- --publish always` from your Mac.
# Manual trigger — use when you can't build locally, or to produce signed/notarized
# artifacts on hosted runners. Builds macOS arm64+x64 DMGs and Windows x64 NSIS+portable.
on:
workflow_dispatch:
inputs:
tag:
description: 'Git tag to build (e.g. v0.1.13). Must already exist.'
description: 'Git tag to build (e.g. v0.2.0-win.0). Must already exist.'
required: true

jobs:
Expand All @@ -17,11 +17,16 @@ jobs:
include:
- runner: macos-latest
arch: arm64
target: '--mac'
- runner: macos-13
arch: x64
target: '--mac'
- runner: windows-latest
arch: x64
target: '--win'

runs-on: ${{ matrix.runner }}
timeout-minutes: 30
timeout-minutes: 45

steps:
- name: Checkout
Expand All @@ -41,22 +46,38 @@ jobs:
- name: Build app
run: npm run build

# macOS: sign + notarize via Apple credentials
- name: Build, sign & notarize (${{ matrix.arch }})
if: runner.os == 'macOS'
env:
CSC_LINK: ${{ secrets.MAC_CERTIFICATE }}
CSC_KEY_PASSWORD: ${{ secrets.MAC_CERTIFICATE_PASSWORD }}
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: npx electron-builder --mac --arch ${{ matrix.arch }} --publish always
run: npx electron-builder ${{ matrix.target }} --arch ${{ matrix.arch }} --publish always

# Windows: optional code signing via WIN_CSC_LINK / WIN_CSC_KEY_PASSWORD secrets.
# If those aren't set, electron-builder produces an unsigned installer (SmartScreen
# will warn on first run; documented in docs/WINDOWS.md).
- name: Build & publish (Windows ${{ matrix.arch }})
if: runner.os == 'Windows'
env:
CSC_LINK: ${{ secrets.WIN_CSC_LINK }}
CSC_KEY_PASSWORD: ${{ secrets.WIN_CSC_KEY_PASSWORD }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: npx electron-builder ${{ matrix.target }} --x64 --publish always

- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: release-${{ matrix.arch }}
name: release-${{ matrix.runner }}-${{ matrix.arch }}
path: |
release/*.dmg
release/*.zip
release/*.exe
release/*.yml
release/*.blockmap
retention-days: 30
if-no-files-found: ignore
39 changes: 31 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
# Clui - The better UI for Claude Code

> [!NOTE]
> This is a forked project from [Lucas Couto](https://github.com/lcoutodemos)'s [Clui CC](https://github.com/lcoutodemos/clui-cc) with some of my additions!
> [!NOTE]
> **Windows fork** of [Youssef2430/clui](https://github.com/Youssef2430/clui), which is itself a fork of [Lucas Couto](https://github.com/lcoutodemos)'s [Clui CC](https://github.com/lcoutodemos/clui-cc).
> Native Windows support is in active development on the `windows-support` branch — see [docs/WINDOWS.md](docs/WINDOWS.md) for the current parity matrix and known issues.

It's a lightweight, transparent desktop overlay for [Claude Code](https://docs.anthropic.com/en/docs/claude-code) on macOS. Clui wraps the Claude Code CLI in a floating pill interface with multi-tab sessions, a permission approval UI, voice input, and a skills marketplace.
It's a lightweight, transparent desktop overlay for [Claude Code](https://docs.anthropic.com/en/docs/claude-code). Clui wraps the Claude Code CLI in a floating pill interface with multi-tab sessions, a permission approval UI, voice input, and a skills marketplace. Originally macOS-only; this fork adds Windows 11 native support.

![Hero](resources/hero.jpeg)

## Features

- **Floating overlay** - transparent, click-through window that stays on top. Toggle with `⌥ + Space` (fallback: `Cmd+Shift+K`).
- **Floating overlay** - transparent, click-through window that stays on top. Toggle with `⌥ + Space` on macOS / `Ctrl + Alt + C` on Windows (fallback: `Cmd/Ctrl + Shift + K`).
- **Multi-tab sessions** - each tab spawns its own `claude -p` process with independent session state.
- **Permission approval UI** - intercepts tool calls via PreToolUse HTTP hooks so you can review and approve/deny from the UI.
- **Conversation history** - browse and resume past Claude Code sessions.
Expand Down Expand Up @@ -37,7 +38,7 @@ Visit **[clui.app](https://clui.app)** to install via Homebrew or download the `
brew install --cask Youssef2430/clui/clui
```

### DMG Download
### DMG Download (macOS)

Download the latest `.dmg` from [Releases](https://github.com/Youssef2430/clui/releases):

Expand All @@ -50,9 +51,26 @@ Download the latest `.dmg` from [Releases](https://github.com/Youssef2430/clui/r
> ```
> You only need to do this once.

### Windows

Once the Windows fork is published to a GitHub Release, install via:

```powershell
# winget (preferred)
winget install <YOUR_GITHUB_HANDLE>.Clui

# scoop (if you've added the bucket)
scoop bucket add clui https://github.com/<YOUR_GITHUB_HANDLE>/scoop-bucket
scoop install clui/clui

# Direct download — grab Clui-Setup-x.x.x.exe from Releases.
```

> **First launch:** Windows SmartScreen will warn the installer is unsigned. Click **More info → Run anyway**. SmartScreen reputation accumulates after enough downloads — the warning will disappear over time. See [`docs/WINDOWS.md`](docs/WINDOWS.md) for details.

## Prerequisites

- **macOS 13+** (Ventura or later)
- **macOS 13+** (Ventura or later) **or Windows 10 1809+ / Windows 11**
- **Claude Code CLI** - install with `npm install -g @anthropic-ai/claude-code` and authenticate by running `claude`

> **No API keys or `.env` file required.** Clui uses your existing Claude Code CLI authentication (Pro/Team/Enterprise subscription).
Expand Down Expand Up @@ -86,7 +104,12 @@ Renderer changes update instantly. Main-process changes require restarting `npm
| `npm run build` | Production build (no packaging) |
| `npm run dist` | Package as macOS `.app` into `release/` |
| `npm run dist:dmg` | Build DMG + ZIP for both architectures |
| `npm run doctor` | Run environment diagnostic |
| `npm run dist:win` | Build Windows NSIS installer + portable .exe |
| `npm run dist:win:nsis` | Build Windows NSIS installer only |
| `npm run dist:win:portable` | Build Windows portable .exe only |
| `npm run build-icons` | Regenerate `resources/icon.ico` + `tray.ico` from PNG sources |
| `npm run setup` | (Windows) check prerequisites |
| `npm run doctor` | Run environment diagnostic (auto-dispatches by platform) |

</details>

Expand All @@ -102,8 +125,8 @@ npm run doctor

## Known Limitations

- **macOS only** - transparent overlay, tray icon, and node-pty are macOS-specific.
- **Requires Claude Code CLI** - Clui is a UI layer, not a standalone AI client.
- **Windows fork is in active development** — see [`docs/WINDOWS.md`](docs/WINDOWS.md) for the parity matrix. As of v0.2.0-win.0, screenshot capture and per-app terminal picker are macOS-only; everything else works on both.

## Q&A
> Why didn't you just contribute to the original project ?
Expand Down
38 changes: 38 additions & 0 deletions distribution/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# Distribution manifests

These manifests publish the Windows fork to package managers. They are NOT auto-applied — you must edit and submit them manually.

## winget (`distribution/winget/`)

Three files (`Clui.installer.yaml`, `Clui.locale.en-US.yaml`, `Clui.yaml`) form a v1.6 multi-file manifest.

**Bootstrap workflow:**

1. Replace every `<YOUR_GITHUB_HANDLE>` with your GitHub username.
2. Build a signed (or unsigned) NSIS installer locally: `npm run dist:win:nsis`.
3. Upload the `.exe` to a GitHub Release.
4. Compute SHA256: `Get-FileHash .\release\Clui-Setup-0.2.0-win.0.exe`.
5. Patch `InstallerUrl` and `InstallerSha256` in `Clui.installer.yaml`.
6. Validate: `winget validate distribution/winget`.
7. Submit: `wingetcreate submit distribution/winget`. (Requires GitHub auth via `wingetcreate`.)

**Per-release update:**

Once accepted, future releases use the `wingetcreate update` command, which re-derives the installer URL/hash from your latest GitHub Release. Wire that into the release CI in Phase 7.

## scoop (`distribution/scoop/`)

Single `clui.json` manifest. Easiest distribution path: host your own bucket.

**Bootstrap workflow:**

1. Create a separate repo `scoop-bucket` under your handle.
2. Copy `distribution/scoop/clui.json` into the root of that repo.
3. Replace `<YOUR_GITHUB_HANDLE>` and the SHA256 placeholder.
4. Users install with:
```powershell
scoop bucket add clui https://github.com/<YOUR_GITHUB_HANDLE>/scoop-bucket
scoop install clui/clui
```

The `checkver` + `autoupdate` blocks let you run `scoop update clui` (in your bucket repo) to bump the version + recompute the hash automatically when a new release lands. Submit to the official `extras` bucket once stable.
30 changes: 30 additions & 0 deletions distribution/scoop/clui.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
{
"$schema": "https://raw.githubusercontent.com/ScoopInstaller/Scoop/master/schema.json",
"version": "0.2.0",
"description": "Transparent floating overlay UI for Claude Code on Windows.",
"homepage": "https://github.com/<YOUR_GITHUB_HANDLE>/clui",
"license": "MIT",
"architecture": {
"64bit": {
"url": "https://github.com/<YOUR_GITHUB_HANDLE>/clui/releases/download/v0.2.0-win.0/Clui-0.2.0-win.0-portable.exe#/clui.exe",
"hash": "0000000000000000000000000000000000000000000000000000000000000000"
}
},
"shortcuts": [["clui.exe", "Clui"]],
"checkver": {
"github": "https://github.com/<YOUR_GITHUB_HANDLE>/clui",
"regex": "v([\\d.]+)-win\\.\\d+"
},
"autoupdate": {
"architecture": {
"64bit": {
"url": "https://github.com/<YOUR_GITHUB_HANDLE>/clui/releases/download/v$version-win.0/Clui-$version-win.0-portable.exe#/clui.exe"
}
}
},
"notes": [
"Clui runs as a tray-resident background app.",
"Toggle the overlay with Ctrl + Alt + C.",
"Right-click the tray icon to quit."
]
}
22 changes: 22 additions & 0 deletions distribution/winget/Clui.installer.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# winget installer manifest — fill in placeholders, then `wingetcreate submit` to PR
# upstream into microsoft/winget-pkgs.
#
# Required fixups before submitting:
# 1. Replace <YOUR_GITHUB_HANDLE> with your GitHub username (this is the publisher slug).
# 2. Update PackageVersion + InstallerUrl + InstallerSha256 each release; `wingetcreate update`
# automates this from the Release URL.
#
# Schema reference: https://learn.microsoft.com/windows/package-manager/package/manifest

PackageIdentifier: <YOUR_GITHUB_HANDLE>.Clui
PackageVersion: 0.2.0
MinimumOSVersion: 10.0.17763.0 # Win10 1809+ (ConPTY availability)
InstallerLocale: en-US
InstallerType: nullsoft # NSIS
Scope: user # NSIS perMachine: false
Installers:
- Architecture: x64
InstallerUrl: https://github.com/<YOUR_GITHUB_HANDLE>/clui/releases/download/v0.2.0-win.0/Clui-Setup-0.2.0-win.0.exe
InstallerSha256: 0000000000000000000000000000000000000000000000000000000000000000
ManifestType: installer
ManifestVersion: 1.6.0
25 changes: 25 additions & 0 deletions distribution/winget/Clui.locale.en-US.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
PackageIdentifier: <YOUR_GITHUB_HANDLE>.Clui
PackageVersion: 0.2.0
PackageLocale: en-US
Publisher: <YOUR_GITHUB_HANDLE>
PublisherUrl: https://github.com/<YOUR_GITHUB_HANDLE>
PublisherSupportUrl: https://github.com/<YOUR_GITHUB_HANDLE>/clui/issues
PackageName: Clui
PackageUrl: https://github.com/<YOUR_GITHUB_HANDLE>/clui
License: MIT
LicenseUrl: https://github.com/<YOUR_GITHUB_HANDLE>/clui/blob/main/LICENSE
ShortDescription: Transparent floating overlay UI for Claude Code on Windows.
Description: |
Clui wraps the Claude Code CLI in a floating pill interface with multi-tab sessions,
permission approval UI, voice input, conversation history, and a skills marketplace.
This is the Windows fork — toggle the overlay with Ctrl + Alt + C.
Tags:
- claude
- claude-code
- ai
- cli
- terminal
- overlay
- productivity
ManifestType: defaultLocale
ManifestVersion: 1.6.0
5 changes: 5 additions & 0 deletions distribution/winget/Clui.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
PackageIdentifier: <YOUR_GITHUB_HANDLE>.Clui
PackageVersion: 0.2.0
DefaultLocale: en-US
ManifestType: version
ManifestVersion: 1.6.0
Loading
Loading