CLI tool
NanmiCoder/cc-haha avatar
NanmiCoder/cc-haha

Claude Code Haha: a desktop workspace for Claude Code and AI coding workflows

cc-haha is a cross-platform desktop workspace for Claude Code and AI coding workflows, with multi-agent sessions, branch worktree support, diff review, permissions, model switching, Computer Use, skill marketplace, and remote team-friendly messaging integrations.

14,714 stars8,583 forksTypeScriptMIT

At a glance

What is it?
Claude Code Haha (NanmiCoder/cc-haha) wraps Claude Code in a cross-platform desktop app with multi-session workspaces, worktree launches, diff review, GUI permission approval and provider switching. It is MIT licensed, and the last push was on 2026-08-22.
Who is it for?
Adopt it if you already run Claude Code on a real codebase and want branch worktrees, diff review and permission prompts in one window instead of a terminal scrollback. Skip it if you work mostly over SSH, or if you need a documented offline install path, because the README points only at GitHub Releases downloads.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 5 days ago.
What is it written in?
Mainly TypeScript, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 25, 2026, and from our analysis. They are not legal advice.

Editorial analysis

What Claude Code Haha is for, and who it fits

Claude Code Haha is a desktop application, not a CLI wrapper you run in a shell. The README describes it as a "desktop Claude Code workspace" for macOS, Windows and Linux, and the feature list is long: multi-session workspaces, global search, branch and Worktree launch, diff review, a built-in browser preview, GUI permission approval, model switching across Claude, ChatGPT, Grok, presets or local endpoints, image generation, visual MCP and SubAgent managers, an Agent Teams workbench, dynamic Workflow orchestration, model trace, Computer Use, a skill marketplace, colour themes, desktop pets, H5 remote access, IM integration and scheduled tasks.

The intended user is someone who already runs Claude Code on a repository and finds the terminal thin for review work. The three things the README pushes hardest are visibility of a running task (tool calls and stage-by-stage progress), a full-width syntax-highlighted diff, and verifying the edited page in the built-in browser. That is a review loop, not an authoring loop. If your workflow is one prompt, one commit, one push, the app adds a window you do not need.

The project is maintained in the author's spare time, according to the sponsorship section of the README. That is a fair description of the release cadence: v0.5.3 on 2026-08-04, v0.5.4 on 2026-08-14, v0.5.5 on 2026-08-22. Regular, but not a company-backed schedule, and the README says custom features and integrations are "open for discussion" rather than staffed.

How the workspace is put together

The repository layout separates a desktop shell from a runtime. The top level contains desktop/, native/, runtime/, adapters/, src/, scripts/, stubs/ and tests/, alongside a preload.ts at the root. That shape matches a desktop app with a native layer and a Node or Bun runtime behind it, with adapters sitting between the app and whatever it talks to.

The package.json identifies the project as claude-code-local, version 999.0.0-local, private, type module, with [email protected] as the package manager. It exposes a single bin entry, claude-haha, pointing at ./bin/claude-haha, and two scripts that both run it: claude-haha and start. There is a bun.lock and a package-lock.json, so both Bun and npm lockfiles are present in the tree.

The provider story is environment-variable driven. .env.example is organised by provider and shows the same variable set repeated for each: ANTHROPIC_AUTH_TOKEN, ANTHROPIC_BASE_URL, ANTHROPIC_MODEL, ANTHROPIC_DEFAULT_SONNET_MODEL, ANTHROPIC_DEFAULT_HAIKU_MODEL, ANTHROPIC_DEFAULT_OPUS_MODEL and API_TIMEOUT_MS. MiniMax is shown as a direct Anthropic-compatible endpoint, with separate base URLs for overseas and domestic users. OpenAI and DeepSeek are shown going through a LiteLLM proxy on port 4000. OpenRouter is shown as another direct Anthropic-compatible endpoint. So "any model" in practice means any model reachable through the Anthropic message shape, either directly or behind a translation layer you run yourself.

What the README does not document is the internal protocol between the desktop shell and the runtime, or how sessions are stored and indexed. The scripts directory names a local-index benchmark (perf:local-index, with a 10k-session variant), which implies a local session index exists, but the README does not describe its format or its size limits.

Installing the desktop app and running a first session

The README gives a three-step install. There is no package-manager install path documented for the app itself; you download an installer from GitHub Releases.

Step one is the download. The README says to get the macOS, Windows or Linux desktop installer from Releases, and links the desktop installation guide at docs/en/start/install.md for details.

Step two happens on first launch: configure your model provider, API key and default model in Settings. If you prefer environment variables, .env.example shows the shape. This is the MiniMax direct-endpoint block, with the commented lines as they appear in the file:

bash
ANTHROPIC_AUTH_TOKEN=your_minimax_api_key_here
ANTHROPIC_BASE_URL=https://api.minimax.io/anthropic
ANTHROPIC_MODEL=MiniMax-M3
ANTHROPIC_DEFAULT_SONNET_MODEL=MiniMax-M3
ANTHROPIC_DEFAULT_HAIKU_MODEL=MiniMax-M2.7-highspeed
ANTHROPIC_DEFAULT_OPUS_MODEL=MiniMax-M3
API_TIMEOUT_MS=3000000

For OpenAI or DeepSeek the file routes through LiteLLM instead. It gives the command to start the proxy before pointing the app at localhost:

bash
litellm --config litellm_config.yaml --port 4000

The matching variables then set ANTHROPIC_BASE_URL to http://localhost:4000 and ANTHROPIC_MODEL to gpt-4o or deepseek-chat, with the three default-model slots set to the same value. Note that litellm_config.yaml is referenced by the comment but is not one of the top-level files listed in the repository, so you supply that config yourself.

Step three is platform friction the README admits to. Public macOS releases require signing and notarization, and draft or unsigned temporary builds may still need one-time manual approval. Unsigned Windows installers may trigger SmartScreen, where the README says to click "More info" then "Run anyway". After that, the first real use is opening a project, picking a branch or worktree at launch, and watching tool calls and diffs in the session view.

If you want to run the repository itself rather than the packaged app, package.json defines the entry point as ./bin/claude-haha under Bun:

bash
bun run claude-haha

Where the desktop wrapper gets in the way

The clearest limitation is distribution. Everything installs from GitHub Releases, and the README documents signing and notarization gaps rather than a reproducible build. On macOS, an unsigned draft build needs manual approval. On Windows, SmartScreen intercepts an unsigned installer. In an environment where users cannot approve their own installers, that is a blocker the project does not solve.

The second is provider access. "Any model" is true only through the Anthropic-compatible interface. OpenAI and DeepSeek are shown behind a LiteLLM proxy you start and configure yourself, on port 4000, with a config file the repository does not ship. That is a second service to run, monitor and keep patched, and it sits between your editor and every request.

Third, the surface area is large. Multi-agent sessions, Agent Teams, dynamic Workflow orchestration, Computer Use, skill marketplace, H5 remote access, IM integration and scheduled tasks all live in one app. Each is a place where behaviour can change between a v0.5.3 and a v0.5.5 release, and the README does not document a rollback path or a migration story for session data across versions. The issue-triage-after-v0.5.5.md file at the repository root suggests triage work was still open after that release.

Finally, this is not the right tool for remote or headless work. A desktop app with a GUI permission dialog and a built-in browser assumes a graphical session. If your Claude Code usage is SSH into a box, or CI, the wrapper adds nothing.

How it differs from running the CLI or using a terminal multiplexer

The obvious alternative is Claude Code itself in a terminal, optionally with tmux or a similar multiplexer for parallel sessions. The difference is where state lives. In a terminal, a running agent is a scrollback buffer, a permission prompt is a y/n, and a diff is whatever your pager shows. Claude Code Haha moves those into persistent UI: sessions stay in a workspace list, permission approval becomes a GUI dialog, and the diff gets a full-width syntax-highlighted view.

That trade is real in both directions. You gain a review surface and lose the composability of the shell. Piping agent output into another tool, running the whole thing in a container, or scripting a session is straightforward in a terminal and not something the README describes for the app.

A second comparison point is the provider-relay approach. The README's sponsorship section lists API relay services (XuanShu API, FennoAI, Qiniu Cloud AI, Atlas Cloud), and Atlas Cloud is described as built into the cc-haha provider list, selectable in settings with just an API key. That is a different model from the LiteLLM route: instead of running your own translation proxy, you point the app at a hosted gateway. The trade is operational simplicity against sending your code context through a third party. The README does not discuss what those relays log.

Licence, upgrade cost and what the release notes do not say

The project is MIT licensed, and the repository carries a THIRD_PARTY_LICENSES.md file, which is what you want to see when a desktop app bundles native components. MIT is permissive: you can use, modify and redistribute it, including commercially, provided the copyright notice and licence text travel with it. That is a description of the licence, not legal advice, and the bundled third-party components carry their own terms, which is presumably why that file exists.

Upgrade cost is the more practical question. Releases land roughly every ten days to three weeks based on v0.5.3, v0.5.4 and v0.5.5, and the version in package.json is 999.0.0-local, which reads as a development placeholder rather than a shipped version number. There is a release-notes/ directory in the tree, so notes exist, but the README does not describe an in-app update mechanism, a downgrade path, or what happens to existing sessions when the schema changes.

One more thing worth knowing before you adopt: the README's most prominent content after the feature list is sponsorship, with affiliate links and referral terms. That is not a defect, but it means the project's incentive structure leans toward provider integrations. Treat the built-in provider list as convenience, not as a recommendation, and check the terms of whichever gateway you select.

Editorial conclusion

Adopt it if you already run Claude Code on a real codebase and want branch worktrees, diff review and permission prompts in one window instead of a terminal scrollback. Skip it if you work mostly over SSH, or if you need a documented offline install path, because the README points only at GitHub Releases downloads. Before committing, verify the macOS signing and notarization status of the exact release you download, and confirm which provider keys your team is allowed to put in the Settings screen.

Frequently asked questions

What is Claude Code Haha (NanmiCoder/cc-haha)?

It is a cross-platform desktop workspace for Claude Code and AI coding workflows, published by NanmiCoder under the MIT licence. The README lists multi-session workspaces, branch and Worktree launch, diff review, GUI permission approval, model switching, Computer Use and a skill marketplace among its features.

How do I install Claude Code Haha on macOS, Windows or Linux?

Download the desktop installer for your platform from GitHub Releases, then configure your model provider, API key and default model in Settings on first launch. The README notes that public macOS releases require signing and notarization, and that unsigned Windows installers may show SmartScreen, where you click "More info" then "Run anyway".

Can I use a model other than Claude with Claude Code Haha?

The README says any model, including ChatGPT, Grok, presets or local endpoints. In practice .env.example shows two routes: direct Anthropic-compatible endpoints such as MiniMax and OpenRouter, or OpenAI and DeepSeek behind a LiteLLM proxy started on port 4000 with litellm_config.yaml.

Official sources

  1. Official README
  2. Project repository
  3. Release notes
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/nanmicoder-cc-haha.svg)](https://hysenlabs.com/projects/nanmicoder-cc-haha)