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
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -55,3 +55,5 @@ examples/VPS_SETUP.md
.commandcode/settings.json
.commandcode/taste/taste.md
ecc-pre-bypass.md
blog-draft/crewcode-multi-agent-desktop-ace.md
blog-draft/preview/hero.svg
71 changes: 71 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,11 @@ reconciliation, startup, or session switching. Preserve global delivery for
newly appended live errors and active-scope delivery for live agent-exit
warnings. See `docs/notifications.md`.

Thinking-log headers use the shared outlined thought-bubble icon; keep the
streaming shimmer and separate disclosure chevron behavior intact.
Turn Work Log headers use the shared outlined work-log icon alongside the
disclosure chevron; individual rows retain their tool-specific icons.

Git and GitHub notification-bar events are live and user-triggered only. Publish
observed successful commit, push, pull, fetch, sync, merge, repository-publish,
and PR mutation results; never notify from polling, catalogue refresh, startup,
Expand All @@ -78,6 +83,20 @@ once per minute so PRs created or changed by other users update the Browser and
open-count badge. Keep that poll single-flight, preserve selection when possible,
and never turn polled transitions into notification-bar events.

Custom chat backgrounds and their derived palettes remain device-local appearance
data. Accept only bounded PNG, JPG, WebP, or GIF uploads; never put the image or
palette in transcripts, workspace files, Brain continuity state, or an SSH host.
Fresh chats may always render the image; regular solo chats require an explicit
preference and content-sized translucent agent bubbles; the sticky loader remains
transparent over the wallpaper while its compact loading visual uses a mode-aware
frosted capsule without the decorative text glow. Fresh-chat welcome content,
thinking blocks, and work logs require mode-aware frosted surfaces with bounded
responsive widths; thinking and work-log blocks remain content-sized.
Image-matched colors must be locally derived, contrast-safe, opt-out, and must not
overwrite the selected named theme.
Honor reduced motion and keep removal reversible. See
`docs/fresh-chat-backgrounds.md`.

Git tabs retain meaningful unfinished UI state across inactive-tab unmounts in
bounded process-session memory keyed by exact outer tab/worktree identity. Keep
commit/amend drafts, PR creation fields/step, PR Browser location, review summary,
Expand All @@ -102,6 +121,13 @@ use asynchronous filesystem/child-process APIs; never put sync I/O or
`spawnSync` in an automatic refresh path. See
`docs/terminal-stream-performance.md`.

The composer input context menu provides Cut, Copy, and Paste through the typed
CrewCode clipboard client on desktop and web. Preserve the captured selection,
remove selected text only after a successful clipboard write, refuse stale
asynchronous edits when the draft has changed, surface clipboard denial in the
menu, and keep the theme-token menu inside the viewport. See
`docs/getting-started.md`.

## What is CrewCode?

CrewCode is a desktop ACE (Agent Coding Environment) GUI built with Electron + React + TypeScript. It lets developers run a *crew* of AI coding agents (Claude Code, Codex, OpenCode, etc.) in parallel across local git worktrees, each in its own workspace with a chat thread, embedded terminal panes, and a code/markdown editor — all in one frameless native-feeling window.
Expand All @@ -123,8 +149,18 @@ shell job control. Keep Git fetch/push on the separate interactive path for cred
helpers, and never infer release success until the version commit, tag, and push are
all observed. See `docs/releasing.md`.

Automatic provider-usage probes must treat an observed CLI crash differently from an
ordinary unavailable response. Cool down the crashing interactive fallback so window
focus refreshes cannot repeatedly relaunch it and generate a core-dump storm; retain
the non-interactive probe and report usage as unavailable until a later safe retry.

> `npm run dev` uses `env -u ELECTRON_RUN_AS_NODE` to prevent Electron's Node.js mode from interfering.

Displayed CrewCode versions must come from the shared runtime build-info
contract. Keep the app-menu header, About card, and Settings Updates aligned with
Electron's `app.getVersion()` or the connected Brain/server build version; never
hardcode a renderer version label. See `docs/about-crewcode.md`.

## Architecture

This is a standard **electron-vite** three-process project:
Expand Down Expand Up @@ -229,6 +265,11 @@ Orca targets macOS, Linux, and Windows. Keep all platform-dependent behavior beh

All changes must consider the SSH use case. Don't assume local-only execution. See `docs/remote-ssh-workspaces.md` for the user-facing behavior contract (ssh:// roots, agent-first auth, TOFU host pinning, remote LSP/polling constraints).

CrewCoder is spawned on the workspace host for both local and SSH roots. Keep ACP
text-file capabilities available, but do not label an SSH CrewCoder session as a
virtual filesystem: its process, provider-native tools, and workspace are co-located
on the VPS. A virtual-custody flag disables native transports such as Codex app-server.

## GitHub CLI Usage

Be mindful of the user's `gh` CLI API rate limit — batch requests where possible and avoid unnecessary calls. All code, commands, and scripts must be compatible with macOS, Linux, and Windows.
Expand Down Expand Up @@ -304,6 +345,13 @@ while Electron Background Brain owns it.

Remote-access credentials are authority boundaries. Pairing tokens must remain short-lived, memory-only, and single-use. Persist only device-session digests in owner-only atomic stores; enforce expiry and revocation. Browser HTTP/WebSocket origins must match exactly or be explicitly configured—never reflect arbitrary `Origin`/forwarded headers. Keep authentication limiters bounded, and do not hardcode CJ's `crewcode.logixhub.icu` deployment as a default Hub URL.

Hub phone/browser sign-in persists for 30 days through a secure HttpOnly SameSite
cookie whose secret is stored only as a revocable Hub-side digest. Keep this browser
session independent from short-lived machine tickets and from Brain process lifetime.
Electron Background Brain and foreground/headless `crewcode brain` must reuse the same
default owner-only machine credential; switching modes never creates a second machine
or requires phone approval. A custom Brain data directory remains a separate identity.

Hub-connected web Settings lists every machine enrolled to the authenticated owner and
keeps reversible disablement distinct from permanent revocation. Disable must persist
the authority suspension, reject heartbeats/tickets/new Brain relays, close existing
Expand Down Expand Up @@ -344,6 +392,20 @@ The composer PromptPicker has separate Prompts and Skills tabs backed by the sha

On phones, Code Editor keeps the code canvas primary and opens its file tree as a dismissible right overlay. Git Sidebar must remain the same stateful surface on desktop and mobile, becoming an off-canvas panel with backdrop/close controls instead of being hidden or squeezing chat/editor content. Changes by turn is a full-screen mobile review: its catalogue stacks above the diff when open, while a targeted changed-file route keeps the catalogue closed. Keep all JS/CSS decisions aligned at `≤768px`; see `docs/mobile-responsive-pages.md`.

The Code Editor file tree is lazy and must expose dependency, build-output, cache,
and workspace-local Python environment folders on demand for local and SSH roots.
Keep `.git` and `.DS_Store` hidden from direct browsing. Do not widen bounded
workspace search or fallback scans to recursively index generated/dependency trees.
Open saved editor files must reconcile on Code Editor mount so writes made while
the surface was unmounted are observed. Keep filesystem events as the local fast
path and only one asynchronous active-file check in flight for missed events/SSH.
Never overwrite a dirty buffer: compare disk with its original baseline and mark
a conflict only when both diverged. File-tree context menus must remain anchored
to their row while flipping/clamping fully inside the viewport. Keep their
surface, text, interaction, separator, and destructive colors on shared theme
tokens; do not introduce fixed palette colors.
See `docs/code-editor.md`.

Git Workspace phone layout keeps the shared `useGitSidebar` state/actions, a compact two-column overview, changed files stacked above a bounded diff, and the remaining Git tools in a bounded scroll panel. Use the canonical `≤768px` breakpoint, ≥36px actionable controls, and 16px text inputs; do not restore fixed desktop-width columns or unbounded stacked panels.

The final work-log changed-file chips and Turn Changes drawer must use the same turn-change aggregation. A chip targets its exact turn/file in the drawer with the agent-summary/list sidebar closed; do not route it through the ordinary editor file-open action or rebuild a second, lossy file list.
Expand Down Expand Up @@ -432,3 +494,12 @@ Plugin validation commands:
npx vitest run src/main/plugin-contract.test.ts
npm run typecheck
```

Codex usage reporting must resolve managed npm installations, prefer the
explicit `rateLimitsByLimitId.codex` app-server bucket when available, and
represent unavailable/fetching data explicitly in the Workspace Dock rather
than displaying a misleading `0%`. A dev process launched from within a managed
CrewCoder Codex turn must not pass that parent turn's private `CODEX_HOME`,
thread identity, or managed-launch metadata into the standalone usage probe.
Legacy CrewCoder sessions with an unprefixed `gpt-*` model use the Codex usage
bucket; current namespaced `provider:model` selections remain authoritative.
8 changes: 4 additions & 4 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
# Contributing to CrewCode

Thanks for your interest in CrewCode. Contributions are welcome, but please read this first CrewCode is maintained by a solo developer, and these guidelines exist to keep that sustainable.
Thanks for your interest in CrewCode. Contributions are welcome, but please read this first, CrewCode is maintained by a solo developer, and these guidelines exist to keep that sustainable.

## Before you write code: open an issue first

**Do not open a large pull request without discussing it first.**

For anything beyond a small fix, open an issue describing what you want to change and why, and wait for a maintainer thumbs-up before building it. This protects your time it's far better to hear "not a direction I want to take" before you've written 1,000 lines than after.
For anything beyond a small fix, open an issue describing what you want to change and why, and wait for a maintainer thumbs-up before building it. This protects your time, it's far better to hear "not a direction I want to take" before you've written 1,000 lines than after.

PRs that don't follow this may be closed without a full review, simply because the change wasn't agreed on up front. That's not personal it's how a one-person project stays maintainable.
PRs that don't follow this may be closed without a full review, simply because the change wasn't agreed on up front. That's not personal , it's how a one-person project stays maintainable.

## What gets merged

Expand Down Expand Up @@ -36,7 +36,7 @@ Be conservative about adding new dependencies. Every new package is a maintenanc

## Security

CrewCode has filesystem, shell, git, and SSH access it is security-sensitive. Every PR is reviewed line by line, and changes touching process execution, file access, or dependencies get extra scrutiny.
CrewCode has filesystem, shell, git, and SSH access, it is security-sensitive. Every PR is reviewed line by line, and changes touching process execution, file access, or dependencies get extra scrutiny.

Do **not** report security vulnerabilities in public issues or pull requests. See [SECURITY.md](./SECURITY.md) for how to report them privately.

Expand Down
18 changes: 9 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
[![X](https://img.shields.io/badge/X-@OnPointTools-000000.svg)](https://x.com/OnPointTools)
[![YouTube](https://img.shields.io/badge/YouTube-@CjWisdom-FF0000.svg)](https://www.youtube.com/@CjWisdom)

**[Want to continue where you left off from any browser? Jump to the setup →](#continue-your-work-from-anywhere)**
**[Want to continue where you left off, from any browser? Jump to the setup →](#continue-your-work-from-anywhere)**

</div>

Expand Down Expand Up @@ -86,7 +86,7 @@ updated" produces threads you can open, read, and continue yourself.

This is distinct from Crew Surface. Crew lanes are ephemeral, live in one tab, and
exist for the duration of a crew run. Delegated threads are ordinary `Session`s with
transcripts, archiving, and drawer rows they outlive the turn that made them.
transcripts, archiving, and drawer rows, they outlive the turn that made them.

### Control Center for supervision

Expand Down Expand Up @@ -131,7 +131,7 @@ with the coding agent in the active chat.
- Run local speech with NVIDIA Parakeet TDT 0.6B v2 for transcription and Kokoro-82M with the `am_michael` voice for speech
- Choose Automatic, GPU, or CPU local inference; idle models unload while the lightweight voice sidecar stays available
- Keep hosted provider keys in Electron's main process; permanent keys never enter renderer state
- Use the separate composer microphone for speech-to-text onlyit inserts text at the caret for review.
- Use the separate composer microphone for speech-to-text only, it inserts text at the caret for review.

Realtime voice is off by default. Hosted providers require their own API keys
and billing; local voice requires a Python 3.11 environment and the documented
Expand All @@ -153,7 +153,7 @@ for setup, architecture, provider availability, and security details.

### Workbench/Canvas mode

Run multiple chats and terminals at once on the same worktree.
- Run multiple chats and terminals at once on the same worktree.

### Code Editor

Expand Down Expand Up @@ -186,12 +186,12 @@ Plugin agent providers support `mock`, `exec`, and `http` runtimes, so you can c

## Continue your work from anywhere

Leave your PC running at home and pick up exactly where you left off from a browser
Leave your PC running at home and pick up exactly where you left off from a browser,
or run CrewCode headless on a VPS, NAS, or always-on server so your agents are always
reachable.

- **Desktop & web continuity (Background Brain):** enable **Settings → Desktop & Web** on an enrolled machine and CrewCode keeps a detached Brain running even after the Electron window closes. Desktop and browser share the same machine-authoritative workspaces, chat sessions, transcripts, terminals, and agents provider resume state carries over, so you continue the same conversation instead of starting from scratch.
- **Self-hosted Hub:** one always-on `crewcode hub` gives you a single passkey-secured dashboard of all your enrolled machines. Brains connect outbound-only, so your dev machines need no open inbound ports. The relay is end-to-end encrypted the Hub never sees your code, prompts, transcripts, or terminal output, and files never leave the machine they live on.
- **Desktop & web continuity (Background Brain):** enable **Settings → Desktop & Web** on an enrolled machine and CrewCode keeps a detached Brain running even after the Electron window closes. Desktop and browser share the same machine-authoritative workspaces, chat sessions, transcripts, terminals, and agents, provider resume state carries over, so you continue the same conversation instead of starting from scratch.
- **Self-hosted Hub:** one always-on `crewcode hub` gives you a single passkey-secured dashboard of all your enrolled machines. Brains connect outbound-only, so your dev machines need no open inbound ports. The relay is end-to-end encrypted, the Hub never sees your code, prompts, transcripts, or terminal output, and files never leave the machine they live on.
- **Always available:** run `crewcode brain` on a VPS or home server with explicit workspace roots and your workspaces are reachable from any device, anytime.
- **Phone access:** the Hub's mobile dashboard lists your online machines and recent threads, with a QR-assisted setup over Tailscale HTTPS.
- **Secure by default:** remote authority is off until you grant explicit workspace roots and scopes; pairing codes and connection tickets are short-lived and single-use; sign-in is passkey-based; provider API keys never leave the Brain's machine.
Expand Down Expand Up @@ -298,7 +298,7 @@ npm run typecheck

## Contributing

CrewCode is open to contributions issues, bug reports, and pull requests are all welcome. If you're planning a larger change, open an issue first so we can talk through the approach before you build it.
CrewCode is open to contributions, issues, bug reports, and pull requests are all welcome. If you're planning a larger change, open an issue first so we can talk through the approach before you build it.

## License

Expand All @@ -310,6 +310,6 @@ In short: you are free to use, modify, and redistribute CrewCode, including in c

Some bundled components are under different licenses and are **not** covered by Apache-2.0. See [NOTICE](./NOTICE) for the full list.

Most notably, the file-tree icon set in `src/renderer/src/assets/bearded-icons/` is [Bearded Icons](https://github.com/BeardedBear/bearded-icons) by BeardedBear, licensed under **GPL-3.0**. These assets are used unmodified and are aggregated withnot incorporated into CrewCode's Apache-licensed source. If you fork CrewCode and need a fully permissive stack, replace that directory with a permissively licensed icon set.
Most notably, the file-tree icon set in `src/renderer/src/assets/bearded-icons/` is [Bearded Icons](https://github.com/BeardedBear/bearded-icons) by BeardedBear, licensed under **GPL-3.0**. These assets are used unmodified and are aggregated with, not incorporated into, CrewCode's Apache-licensed source. If you fork CrewCode and need a fully permissive stack, replace that directory with a permissively licensed icon set.

Copyright © 2026 OnPoint Tools.
2 changes: 2 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ internal references).
| [keybindings.md](./keybindings.md) | Every shortcut, defaults per group, and the editable `~/.crewcode/keys.json` override file |
| [tweaks-panel.md](./tweaks-panel.md) | The floating Layout panel: density and workspace dock presentation controls |
| [system-monitor.md](./system-monitor.md) | CPU/memory pill and panel: per-workspace process usage, jump-to and kill controls |
| [about-crewcode.md](./about-crewcode.md) | About card and automatically sourced app/build version |

### Chat and agents

Expand All @@ -23,6 +24,7 @@ internal references).
| [using-crews.md](./using-crews.md) | Crews: parallel lanes, supervisors, and the select → verify → reconcile → apply Merge lanes workflow |
| [reasoning-effort.md](./reasoning-effort.md) | Provider-native reasoning effort levels in the composer and crew lanes |
| [realtime-voice.md](./realtime-voice.md) | Voice orb providers, coding-agent routing, natural spoken replies, credentials, and local roadmap |
| [fresh-chat-backgrounds.md](./fresh-chat-backgrounds.md) | Device-local chat wallpapers, regular-chat coverage, and image-derived app colors |
| [prompt-skill-studio.md](./prompt-skill-studio.md) | Prompt Builder Studio and local `.crewcode` prompt/skill folders _(needs a user-guide rewrite — currently changelog-style)_ |

### Workspaces
Expand Down
16 changes: 16 additions & 0 deletions docs/about-crewcode.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# About CrewCode

Open the CrewCode brand menu and select **About CrewCode** to see a compact app
identity card. It shows the running CrewCode version and build commit.

The app menu header, About card, and **Settings → Updates** all read the same
runtime build-info contract. Desktop builds use Electron's packaged app version;
browser clients read the version of the CrewCode server or Brain they are
connected to. The Hub relay classifies that metadata read under its existing
`workspace:read` scope. No version label is maintained separately in renderer
code.

The version advances through the normal release scripts, which update
`package.json`. Electron packages expose that value through `app.getVersion()`,
and headless entries receive the same package version at build time. An installed
update therefore reports its new version after CrewCode restarts into that build.
Loading
Loading