Repository files navigation

C2 app icon

C2

The document-first coding agent.
Compose structured prompts, weave in reusable skills, and run your coding CLIs through one local interface.

Website · Get started · Documentation · Architecture · Plugin standard · Plugin protocol

C2 document editor with the skill picker open

Important

C2 is pre-release software. The core product works, but there are no signed binary releases yet. Build it from source and expect APIs, storage, and packaging details to change before 1.0.

Why C2

Most coding-agent clients begin with a chat box. C2 begins with a document. You can shape a long brief with headings and lists, insert skills and files exactly where they belong, inspect the whole turn, and only then send it to the agent you choose.

  • Document-first prompts. Compose in a BlockNote editor instead of squeezing a specification into a single-line input.
  • Eleven coding CLIs, one protocol. Drive Claude Code, Codex, Grok, Cursor, OpenCode 1 or 2, Pi, Kimi, ZCode/GLM, Amp, and Droid through the Agent Client Protocol.
  • Skills and complete plugins. Insert reusable skills inline, or install GitHub packages that can include skills, subagents, MCP servers, and project scaffolds.
  • Local, inspectable continuity. Sessions and project memory live in the shared Rust core; derived memories retain their sources and can be pinned or forgotten.
  • Git-aware execution. Use per-session worktrees, automatic checkpoints, diffs, revert, and explicit commit/push flows.
  • Three surfaces. C2 ships an Electrobun desktop app, a ratatui TUI, and a paired remote web client. All three compose the same Rust Core through the same plugin runtime; Electrobun is the desktop shell and relays one command/event protocol to its bundled Rust host.

How it fits together

Claude Code · Codex · Grok · Cursor · OpenCode 1 · OpenCode 2 · Pi · Kimi · GLM · Amp · Droid
│
ACP over stdio
│
Rust product core
│
Plugin composition layer
┌─────────┼─────────┐
│ │ │
Desktop TUI Remote
Electrobun + React ratatui Axum + WebSocket

C2's internals form a runtime-module graph inspired by cordis: storage, agent execution, git, memory, scenes, and other subsystems declare what they require and provide. Separately installed extensions use the small JSON-RPC plugin protocol and only the explicitly exported Extension API; the internal Rust trait and Core commands are not the public plugin contract. Package, lifecycle, scope, security, and host behavior follow the C2 Plugin Standard.

Build from source

Prerequisites

  • Rust 1.82 or newer
  • Zig 0.15.2 exactly, required by the embedded Ghostty terminal engine
  • Bun
  • Git
  • Your platform's native build tools (Xcode command-line tools on macOS)
  • At least one supported provider CLI if you want to run a real agent turn

On macOS, install the pinned Zig version with Homebrew:

brew install zig@0.15
brew link --force zig@0.15

Then clone the repository and run the desktop app:

git clone https://github.com/IchenDEV/codeTwo.git
cd codeTwo
./script/dev/run.sh

C2 detects provider CLIs on your PATH. Provider-specific setup and the exact adapter commands are documented in Providers.

Nightly package

Every push to main, plus the daily 02:17 Asia/Singapore schedule, builds and verifies an Apple Silicon DMG in the Nightly macOS package workflow. Download C2-nightly-macos-arm64-<commit> from that run's artifacts. Nightly packages are ad-hoc signed but not Apple-notarized, so they are for testing rather than general distribution.

Development, nightly, and release builds can be installed together. Their macOS identities and default data directories are isolated:

ChannelApplicationBundle identifierApplication Support directory
DevelopmentC2-dev.appdev.codetwo.app.devdev.codetwo.app.dev
NightlyC2 Nightly.appdev.codetwo.app.nightlydev.codetwo.app.nightly
ReleaseC2.appdev.codetwo.appdev.codetwo.app

Only release builds embed the Sparkle update helper. Development and nightly builds stay on their explicit build channel and cannot replace a release through the in-app updater.

Versioned release

Run the Release macOS workflow, enter a semantic version such as 0.1.0, provide a canonical change id whose Artifact is ready-to-release, and choose whether it is a prerelease. The workflow builds and verifies the versioned Apple Silicon DMG before it creates the matching v<version> tag and publishes a GitHub Release with the DMG, SHA-256 checksum, and authorized change id. Existing tags are never overwritten.

Release packages are currently ad-hoc signed and not Apple-notarized. They are suitable for testing through GitHub Releases, but a public production distribution still requires Developer ID signing and notarization.

Other surfaces

From the repository root:

# Build the TUI, server, and their sibling Bun Tool Broker
./script/build/hosts.sh release
# Terminal interface
./target/release/codetwo-tui
# Paired remote web client
./target/release/codetwo-server
# Self-contained turn demo using a stub ACP agent (requires Node)
cargo run -p codetwo-core --example live_demo

The remote server prints a one-time pairing URL and token. Keep it on a trusted LAN or Tailscale tailnet; C2 does not provide a hosted relay.

Repository map

PathPurpose
crates/kernelReactive plugin runtime and command registry
crates/corePlugin-independent product domain: ACP, sessions, providers, policy, and persistence
crates/pluginsCore adapters, built-in runtime graph, extension bundles, protocol, and marketplace
crates/tuiratatui frontend
crates/serverHeadless server, pairing, WebSocket protocol, and remote client
apps/desktopElectrobun + React + BlockNote desktop app
packages/tool-brokerProvider-neutral special-tool catalog and immutable routing plans
websiteVitePress documentation and GitHub Pages site
docsDocumentation map, current contracts, designs, research, and SDLC records
scriptDevelopment, build, and repository-verification entry points

Development

Run Rust checks from the repository root:

cargo check --workspace --all-targets
cargo test --workspace
./script/build/hosts.sh debug

Run desktop checks from apps/desktop:

bun install --frozen-lockfile
bun run lint
bun test
bun run build

Build the documentation site from website:

bun install --frozen-lockfile
bun run docs:build

The desktop UI follows the repository's design system. Product surfaces use the shared components under apps/desktop/src/components/ui; avoid introducing one-off interaction primitives or visual tokens.

Contributing

Bug reports, documentation fixes, and focused pull requests are welcome. For a large change, open an issue first so the product boundary and protocol impact can be discussed before implementation.

Please keep changes scoped, add tests for behavior changes, and run the relevant checks above. A pull request that changes user-visible desktop UI should include light, dark, and narrow viewport evidence where applicable.

Material changes follow the repository's AI-native development lifecycle. Link the canonical change Artifact in the pull request. Implementation starts only after its Intent/Spec is accepted and the Artifact reaches executing; do not create a parallel lifecycle, specs, or plans registry.

Security and privacy

C2 runs provider CLIs as local child processes and communicates with them over stdio. C2 does not change the provider's own network, authentication, data-retention, or tool policies; review those separately before giving a provider access to sensitive code.

Remote access is bearer-token based and intended for a trusted LAN or Tailscale network. Do not expose codetwo-server directly to the public internet. Please report a suspected vulnerability privately to the repository owner rather than opening a public exploit report.

License

Licensed under the Apache License 2.0.

About

Document-first coding-agent app: one Rust core driving a Tauri desktop app + a ratatui TUI over ACP (Claude Code / Codex / Grok / Cursor / OpenCode).

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

C2 app icon

C2

The document-first coding agent.
Compose structured prompts, weave in reusable skills, and run your coding CLIs through one local interface.

Website · Get started · Documentation · Architecture · Plugin standard · Plugin protocol

C2 document editor with the skill picker open

Important

C2 is pre-release software. The core product works, but there are no signed binary releases yet. Build it from source and expect APIs, storage, and packaging details to change before 1.0.

Why C2

Most coding-agent clients begin with a chat box. C2 begins with a document. You can shape a long brief with headings and lists, insert skills and files exactly where they belong, inspect the whole turn, and only then send it to the agent you choose.

  • Document-first prompts. Compose in a BlockNote editor instead of squeezing a specification into a single-line input.
  • Eleven coding CLIs, one protocol. Drive Claude Code, Codex, Grok, Cursor, OpenCode 1 or 2, Pi, Kimi, ZCode/GLM, Amp, and Droid through the Agent Client Protocol.
  • Skills and complete plugins. Insert reusable skills inline, or install GitHub packages that can include skills, subagents, MCP servers, and project scaffolds.
  • Local, inspectable continuity. Sessions and project memory live in the shared Rust core; derived memories retain their sources and can be pinned or forgotten.
  • Git-aware execution. Use per-session worktrees, automatic checkpoints, diffs, revert, and explicit commit/push flows.
  • Three surfaces. C2 ships an Electrobun desktop app, a ratatui TUI, and a paired remote web client. All three compose the same Rust Core through the same plugin runtime; Electrobun is the desktop shell and relays one command/event protocol to its bundled Rust host.

How it fits together

Claude Code · Codex · Grok · Cursor · OpenCode 1 · OpenCode 2 · Pi · Kimi · GLM · Amp · Droid
│
ACP over stdio
│
Rust product core
│
Plugin composition layer
┌─────────┼─────────┐
│ │ │
Desktop TUI Remote
Electrobun + React ratatui Axum + WebSocket

C2's internals form a runtime-module graph inspired by cordis: storage, agent execution, git, memory, scenes, and other subsystems declare what they require and provide. Separately installed extensions use the small JSON-RPC plugin protocol and only the explicitly exported Extension API; the internal Rust trait and Core commands are not the public plugin contract. Package, lifecycle, scope, security, and host behavior follow the C2 Plugin Standard.

Build from source

Prerequisites

  • Rust 1.82 or newer
  • Zig 0.15.2 exactly, required by the embedded Ghostty terminal engine
  • Bun
  • Git
  • Your platform's native build tools (Xcode command-line tools on macOS)
  • At least one supported provider CLI if you want to run a real agent turn

On macOS, install the pinned Zig version with Homebrew:

brew install zig@0.15
brew link --force zig@0.15

Then clone the repository and run the desktop app:

git clone https://github.com/IchenDEV/codeTwo.git
cd codeTwo
./script/dev/run.sh

C2 detects provider CLIs on your PATH. Provider-specific setup and the exact adapter commands are documented in Providers.

Nightly package

Every push to main, plus the daily 02:17 Asia/Singapore schedule, builds and verifies an Apple Silicon DMG in the Nightly macOS package workflow. Download C2-nightly-macos-arm64-<commit> from that run's artifacts. Nightly packages are ad-hoc signed but not Apple-notarized, so they are for testing rather than general distribution.

Development, nightly, and release builds can be installed together. Their macOS identities and default data directories are isolated:

ChannelApplicationBundle identifierApplication Support directory
DevelopmentC2-dev.appdev.codetwo.app.devdev.codetwo.app.dev
NightlyC2 Nightly.appdev.codetwo.app.nightlydev.codetwo.app.nightly
ReleaseC2.appdev.codetwo.appdev.codetwo.app

Only release builds embed the Sparkle update helper. Development and nightly builds stay on their explicit build channel and cannot replace a release through the in-app updater.

Versioned release

Run the Release macOS workflow, enter a semantic version such as 0.1.0, provide a canonical change id whose Artifact is ready-to-release, and choose whether it is a prerelease. The workflow builds and verifies the versioned Apple Silicon DMG before it creates the matching v<version> tag and publishes a GitHub Release with the DMG, SHA-256 checksum, and authorized change id. Existing tags are never overwritten.

Release packages are currently ad-hoc signed and not Apple-notarized. They are suitable for testing through GitHub Releases, but a public production distribution still requires Developer ID signing and notarization.

Other surfaces

From the repository root:

# Build the TUI, server, and their sibling Bun Tool Broker
./script/build/hosts.sh release
# Terminal interface
./target/release/codetwo-tui
# Paired remote web client
./target/release/codetwo-server
# Self-contained turn demo using a stub ACP agent (requires Node)
cargo run -p codetwo-core --example live_demo

The remote server prints a one-time pairing URL and token. Keep it on a trusted LAN or Tailscale tailnet; C2 does not provide a hosted relay.

Repository map

PathPurpose
crates/kernelReactive plugin runtime and command registry
crates/corePlugin-independent product domain: ACP, sessions, providers, policy, and persistence
crates/pluginsCore adapters, built-in runtime graph, extension bundles, protocol, and marketplace
crates/tuiratatui frontend
crates/serverHeadless server, pairing, WebSocket protocol, and remote client
apps/desktopElectrobun + React + BlockNote desktop app
packages/tool-brokerProvider-neutral special-tool catalog and immutable routing plans
websiteVitePress documentation and GitHub Pages site
docsDocumentation map, current contracts, designs, research, and SDLC records
scriptDevelopment, build, and repository-verification entry points

Development

Run Rust checks from the repository root:

cargo check --workspace --all-targets
cargo test --workspace
./script/build/hosts.sh debug

Run desktop checks from apps/desktop:

bun install --frozen-lockfile
bun run lint
bun test
bun run build

Build the documentation site from website:

bun install --frozen-lockfile
bun run docs:build

The desktop UI follows the repository's design system. Product surfaces use the shared components under apps/desktop/src/components/ui; avoid introducing one-off interaction primitives or visual tokens.

Contributing

Bug reports, documentation fixes, and focused pull requests are welcome. For a large change, open an issue first so the product boundary and protocol impact can be discussed before implementation.

Please keep changes scoped, add tests for behavior changes, and run the relevant checks above. A pull request that changes user-visible desktop UI should include light, dark, and narrow viewport evidence where applicable.

Material changes follow the repository's AI-native development lifecycle. Link the canonical change Artifact in the pull request. Implementation starts only after its Intent/Spec is accepted and the Artifact reaches executing; do not create a parallel lifecycle, specs, or plans registry.

Security and privacy

C2 runs provider CLIs as local child processes and communicates with them over stdio. C2 does not change the provider's own network, authentication, data-retention, or tool policies; review those separately before giving a provider access to sensitive code.

Remote access is bearer-token based and intended for a trusted LAN or Tailscale network. Do not expose codetwo-server directly to the public internet. Please report a suspected vulnerability privately to the repository owner rather than opening a public exploit report.

License

Licensed under the Apache License 2.0.

About

Document-first coding-agent app: one Rust core driving a Tauri desktop app + a ratatui TUI over ACP (Claude Code / Codex / Grok / Cursor / OpenCode).

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

C2 app icon

C2

The document-first coding agent.
Compose structured prompts, weave in reusable skills, and run your coding CLIs through one local interface.

Website · Get started · Documentation · Architecture · Plugin standard · Plugin protocol

C2 document editor with the skill picker open

Important

C2 is pre-release software. The core product works, but there are no signed binary releases yet. Build it from source and expect APIs, storage, and packaging details to change before 1.0.

Why C2

Most coding-agent clients begin with a chat box. C2 begins with a document. You can shape a long brief with headings and lists, insert skills and files exactly where they belong, inspect the whole turn, and only then send it to the agent you choose.

  • Document-first prompts. Compose in a BlockNote editor instead of squeezing a specification into a single-line input.
  • Eleven coding CLIs, one protocol. Drive Claude Code, Codex, Grok, Cursor, OpenCode 1 or 2, Pi, Kimi, ZCode/GLM, Amp, and Droid through the Agent Client Protocol.
  • Skills and complete plugins. Insert reusable skills inline, or install GitHub packages that can include skills, subagents, MCP servers, and project scaffolds.
  • Local, inspectable continuity. Sessions and project memory live in the shared Rust core; derived memories retain their sources and can be pinned or forgotten.
  • Git-aware execution. Use per-session worktrees, automatic checkpoints, diffs, revert, and explicit commit/push flows.
  • Three surfaces. C2 ships an Electrobun desktop app, a ratatui TUI, and a paired remote web client. All three compose the same Rust Core through the same plugin runtime; Electrobun is the desktop shell and relays one command/event protocol to its bundled Rust host.

How it fits together

Claude Code · Codex · Grok · Cursor · OpenCode 1 · OpenCode 2 · Pi · Kimi · GLM · Amp · Droid
│
ACP over stdio
│
Rust product core
│
Plugin composition layer
┌─────────┼─────────┐
│ │ │
Desktop TUI Remote
Electrobun + React ratatui Axum + WebSocket

C2's internals form a runtime-module graph inspired by cordis: storage, agent execution, git, memory, scenes, and other subsystems declare what they require and provide. Separately installed extensions use the small JSON-RPC plugin protocol and only the explicitly exported Extension API; the internal Rust trait and Core commands are not the public plugin contract. Package, lifecycle, scope, security, and host behavior follow the C2 Plugin Standard.

Build from source

Prerequisites

  • Rust 1.82 or newer
  • Zig 0.15.2 exactly, required by the embedded Ghostty terminal engine
  • Bun
  • Git
  • Your platform's native build tools (Xcode command-line tools on macOS)
  • At least one supported provider CLI if you want to run a real agent turn

On macOS, install the pinned Zig version with Homebrew:

brew install zig@0.15
brew link --force zig@0.15

Then clone the repository and run the desktop app:

git clone https://github.com/IchenDEV/codeTwo.git
cd codeTwo
./script/dev/run.sh

C2 detects provider CLIs on your PATH. Provider-specific setup and the exact adapter commands are documented in Providers.

Nightly package

Every push to main, plus the daily 02:17 Asia/Singapore schedule, builds and verifies an Apple Silicon DMG in the Nightly macOS package workflow. Download C2-nightly-macos-arm64-<commit> from that run's artifacts. Nightly packages are ad-hoc signed but not Apple-notarized, so they are for testing rather than general distribution.

Development, nightly, and release builds can be installed together. Their macOS identities and default data directories are isolated:

ChannelApplicationBundle identifierApplication Support directory
DevelopmentC2-dev.appdev.codetwo.app.devdev.codetwo.app.dev
NightlyC2 Nightly.appdev.codetwo.app.nightlydev.codetwo.app.nightly
ReleaseC2.appdev.codetwo.appdev.codetwo.app

Only release builds embed the Sparkle update helper. Development and nightly builds stay on their explicit build channel and cannot replace a release through the in-app updater.

Versioned release

Run the Release macOS workflow, enter a semantic version such as 0.1.0, provide a canonical change id whose Artifact is ready-to-release, and choose whether it is a prerelease. The workflow builds and verifies the versioned Apple Silicon DMG before it creates the matching v<version> tag and publishes a GitHub Release with the DMG, SHA-256 checksum, and authorized change id. Existing tags are never overwritten.

Release packages are currently ad-hoc signed and not Apple-notarized. They are suitable for testing through GitHub Releases, but a public production distribution still requires Developer ID signing and notarization.

Other surfaces

From the repository root:

# Build the TUI, server, and their sibling Bun Tool Broker
./script/build/hosts.sh release
# Terminal interface
./target/release/codetwo-tui
# Paired remote web client
./target/release/codetwo-server
# Self-contained turn demo using a stub ACP agent (requires Node)
cargo run -p codetwo-core --example live_demo

The remote server prints a one-time pairing URL and token. Keep it on a trusted LAN or Tailscale tailnet; C2 does not provide a hosted relay.

Repository map

PathPurpose
crates/kernelReactive plugin runtime and command registry
crates/corePlugin-independent product domain: ACP, sessions, providers, policy, and persistence
crates/pluginsCore adapters, built-in runtime graph, extension bundles, protocol, and marketplace
crates/tuiratatui frontend
crates/serverHeadless server, pairing, WebSocket protocol, and remote client
apps/desktopElectrobun + React + BlockNote desktop app
packages/tool-brokerProvider-neutral special-tool catalog and immutable routing plans
websiteVitePress documentation and GitHub Pages site
docsDocumentation map, current contracts, designs, research, and SDLC records
scriptDevelopment, build, and repository-verification entry points

Development

Run Rust checks from the repository root:

cargo check --workspace --all-targets
cargo test --workspace
./script/build/hosts.sh debug

Run desktop checks from apps/desktop:

bun install --frozen-lockfile
bun run lint
bun test
bun run build

Build the documentation site from website:

bun install --frozen-lockfile
bun run docs:build

The desktop UI follows the repository's design system. Product surfaces use the shared components under apps/desktop/src/components/ui; avoid introducing one-off interaction primitives or visual tokens.

Contributing

Bug reports, documentation fixes, and focused pull requests are welcome. For a large change, open an issue first so the product boundary and protocol impact can be discussed before implementation.

Please keep changes scoped, add tests for behavior changes, and run the relevant checks above. A pull request that changes user-visible desktop UI should include light, dark, and narrow viewport evidence where applicable.

Material changes follow the repository's AI-native development lifecycle. Link the canonical change Artifact in the pull request. Implementation starts only after its Intent/Spec is accepted and the Artifact reaches executing; do not create a parallel lifecycle, specs, or plans registry.

Security and privacy

C2 runs provider CLIs as local child processes and communicates with them over stdio. C2 does not change the provider's own network, authentication, data-retention, or tool policies; review those separately before giving a provider access to sensitive code.

Remote access is bearer-token based and intended for a trusted LAN or Tailscale network. Do not expose codetwo-server directly to the public internet. Please report a suspected vulnerability privately to the repository owner rather than opening a public exploit report.

License

Licensed under the Apache License 2.0.

About

Document-first coding-agent app: one Rust core driving a Tauri desktop app + a ratatui TUI over ACP (Claude Code / Codex / Grok / Cursor / OpenCode).

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

C2 app icon

C2

The document-first coding agent.
Compose structured prompts, weave in reusable skills, and run your coding CLIs through one local interface.

Website · Get started · Documentation · Architecture · Plugin standard · Plugin protocol

C2 document editor with the skill picker open

Important

C2 is pre-release software. The core product works, but there are no signed binary releases yet. Build it from source and expect APIs, storage, and packaging details to change before 1.0.

Why C2

Most coding-agent clients begin with a chat box. C2 begins with a document. You can shape a long brief with headings and lists, insert skills and files exactly where they belong, inspect the whole turn, and only then send it to the agent you choose.

  • Document-first prompts. Compose in a BlockNote editor instead of squeezing a specification into a single-line input.
  • Eleven coding CLIs, one protocol. Drive Claude Code, Codex, Grok, Cursor, OpenCode 1 or 2, Pi, Kimi, ZCode/GLM, Amp, and Droid through the Agent Client Protocol.
  • Skills and complete plugins. Insert reusable skills inline, or install GitHub packages that can include skills, subagents, MCP servers, and project scaffolds.
  • Local, inspectable continuity. Sessions and project memory live in the shared Rust core; derived memories retain their sources and can be pinned or forgotten.
  • Git-aware execution. Use per-session worktrees, automatic checkpoints, diffs, revert, and explicit commit/push flows.
  • Three surfaces. C2 ships an Electrobun desktop app, a ratatui TUI, and a paired remote web client. All three compose the same Rust Core through the same plugin runtime; Electrobun is the desktop shell and relays one command/event protocol to its bundled Rust host.

How it fits together

Claude Code · Codex · Grok · Cursor · OpenCode 1 · OpenCode 2 · Pi · Kimi · GLM · Amp · Droid
│
ACP over stdio
│
Rust product core
│
Plugin composition layer
┌─────────┼─────────┐
│ │ │
Desktop TUI Remote
Electrobun + React ratatui Axum + WebSocket

C2's internals form a runtime-module graph inspired by cordis: storage, agent execution, git, memory, scenes, and other subsystems declare what they require and provide. Separately installed extensions use the small JSON-RPC plugin protocol and only the explicitly exported Extension API; the internal Rust trait and Core commands are not the public plugin contract. Package, lifecycle, scope, security, and host behavior follow the C2 Plugin Standard.

Build from source

Prerequisites

  • Rust 1.82 or newer
  • Zig 0.15.2 exactly, required by the embedded Ghostty terminal engine
  • Bun
  • Git
  • Your platform's native build tools (Xcode command-line tools on macOS)
  • At least one supported provider CLI if you want to run a real agent turn

On macOS, install the pinned Zig version with Homebrew:

brew install zig@0.15
brew link --force zig@0.15

Then clone the repository and run the desktop app:

git clone https://github.com/IchenDEV/codeTwo.git
cd codeTwo
./script/dev/run.sh

C2 detects provider CLIs on your PATH. Provider-specific setup and the exact adapter commands are documented in Providers.

Nightly package

Every push to main, plus the daily 02:17 Asia/Singapore schedule, builds and verifies an Apple Silicon DMG in the Nightly macOS package workflow. Download C2-nightly-macos-arm64-<commit> from that run's artifacts. Nightly packages are ad-hoc signed but not Apple-notarized, so they are for testing rather than general distribution.

Development, nightly, and release builds can be installed together. Their macOS identities and default data directories are isolated:

ChannelApplicationBundle identifierApplication Support directory
DevelopmentC2-dev.appdev.codetwo.app.devdev.codetwo.app.dev
NightlyC2 Nightly.appdev.codetwo.app.nightlydev.codetwo.app.nightly
ReleaseC2.appdev.codetwo.appdev.codetwo.app

Only release builds embed the Sparkle update helper. Development and nightly builds stay on their explicit build channel and cannot replace a release through the in-app updater.

Versioned release

Run the Release macOS workflow, enter a semantic version such as 0.1.0, provide a canonical change id whose Artifact is ready-to-release, and choose whether it is a prerelease. The workflow builds and verifies the versioned Apple Silicon DMG before it creates the matching v<version> tag and publishes a GitHub Release with the DMG, SHA-256 checksum, and authorized change id. Existing tags are never overwritten.

Release packages are currently ad-hoc signed and not Apple-notarized. They are suitable for testing through GitHub Releases, but a public production distribution still requires Developer ID signing and notarization.

Other surfaces

From the repository root:

# Build the TUI, server, and their sibling Bun Tool Broker
./script/build/hosts.sh release
# Terminal interface
./target/release/codetwo-tui
# Paired remote web client
./target/release/codetwo-server
# Self-contained turn demo using a stub ACP agent (requires Node)
cargo run -p codetwo-core --example live_demo

The remote server prints a one-time pairing URL and token. Keep it on a trusted LAN or Tailscale tailnet; C2 does not provide a hosted relay.

Repository map

PathPurpose
crates/kernelReactive plugin runtime and command registry
crates/corePlugin-independent product domain: ACP, sessions, providers, policy, and persistence
crates/pluginsCore adapters, built-in runtime graph, extension bundles, protocol, and marketplace
crates/tuiratatui frontend
crates/serverHeadless server, pairing, WebSocket protocol, and remote client
apps/desktopElectrobun + React + BlockNote desktop app
packages/tool-brokerProvider-neutral special-tool catalog and immutable routing plans
websiteVitePress documentation and GitHub Pages site
docsDocumentation map, current contracts, designs, research, and SDLC records
scriptDevelopment, build, and repository-verification entry points

Development

Run Rust checks from the repository root:

cargo check --workspace --all-targets
cargo test --workspace
./script/build/hosts.sh debug

Run desktop checks from apps/desktop:

bun install --frozen-lockfile
bun run lint
bun test
bun run build

Build the documentation site from website:

bun install --frozen-lockfile
bun run docs:build

The desktop UI follows the repository's design system. Product surfaces use the shared components under apps/desktop/src/components/ui; avoid introducing one-off interaction primitives or visual tokens.

Contributing

Bug reports, documentation fixes, and focused pull requests are welcome. For a large change, open an issue first so the product boundary and protocol impact can be discussed before implementation.

Please keep changes scoped, add tests for behavior changes, and run the relevant checks above. A pull request that changes user-visible desktop UI should include light, dark, and narrow viewport evidence where applicable.

Material changes follow the repository's AI-native development lifecycle. Link the canonical change Artifact in the pull request. Implementation starts only after its Intent/Spec is accepted and the Artifact reaches executing; do not create a parallel lifecycle, specs, or plans registry.

Security and privacy

C2 runs provider CLIs as local child processes and communicates with them over stdio. C2 does not change the provider's own network, authentication, data-retention, or tool policies; review those separately before giving a provider access to sensitive code.

Remote access is bearer-token based and intended for a trusted LAN or Tailscale network. Do not expose codetwo-server directly to the public internet. Please report a suspected vulnerability privately to the repository owner rather than opening a public exploit report.

License

Licensed under the Apache License 2.0.

About

Document-first coding-agent app: one Rust core driving a Tauri desktop app + a ratatui TUI over ACP (Claude Code / Codex / Grok / Cursor / OpenCode).

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

C2 app icon

C2

The document-first coding agent.
Compose structured prompts, weave in reusable skills, and run your coding CLIs through one local interface.

Website · Get started · Documentation · Architecture · Plugin standard · Plugin protocol

C2 document editor with the skill picker open

Important

C2 is pre-release software. The core product works, but there are no signed binary releases yet. Build it from source and expect APIs, storage, and packaging details to change before 1.0.

Why C2

Most coding-agent clients begin with a chat box. C2 begins with a document. You can shape a long brief with headings and lists, insert skills and files exactly where they belong, inspect the whole turn, and only then send it to the agent you choose.

  • Document-first prompts. Compose in a BlockNote editor instead of squeezing a specification into a single-line input.
  • Eleven coding CLIs, one protocol. Drive Claude Code, Codex, Grok, Cursor, OpenCode 1 or 2, Pi, Kimi, ZCode/GLM, Amp, and Droid through the Agent Client Protocol.
  • Skills and complete plugins. Insert reusable skills inline, or install GitHub packages that can include skills, subagents, MCP servers, and project scaffolds.
  • Local, inspectable continuity. Sessions and project memory live in the shared Rust core; derived memories retain their sources and can be pinned or forgotten.
  • Git-aware execution. Use per-session worktrees, automatic checkpoints, diffs, revert, and explicit commit/push flows.
  • Three surfaces. C2 ships an Electrobun desktop app, a ratatui TUI, and a paired remote web client. All three compose the same Rust Core through the same plugin runtime; Electrobun is the desktop shell and relays one command/event protocol to its bundled Rust host.

How it fits together

Claude Code · Codex · Grok · Cursor · OpenCode 1 · OpenCode 2 · Pi · Kimi · GLM · Amp · Droid
│
ACP over stdio
│
Rust product core
│
Plugin composition layer
┌─────────┼─────────┐
│ │ │
Desktop TUI Remote
Electrobun + React ratatui Axum + WebSocket

C2's internals form a runtime-module graph inspired by cordis: storage, agent execution, git, memory, scenes, and other subsystems declare what they require and provide. Separately installed extensions use the small JSON-RPC plugin protocol and only the explicitly exported Extension API; the internal Rust trait and Core commands are not the public plugin contract. Package, lifecycle, scope, security, and host behavior follow the C2 Plugin Standard.

Build from source

Prerequisites

  • Rust 1.82 or newer
  • Zig 0.15.2 exactly, required by the embedded Ghostty terminal engine
  • Bun
  • Git
  • Your platform's native build tools (Xcode command-line tools on macOS)
  • At least one supported provider CLI if you want to run a real agent turn

On macOS, install the pinned Zig version with Homebrew:

brew install zig@0.15
brew link --force zig@0.15

Then clone the repository and run the desktop app:

git clone https://github.com/IchenDEV/codeTwo.git
cd codeTwo
./script/dev/run.sh

C2 detects provider CLIs on your PATH. Provider-specific setup and the exact adapter commands are documented in Providers.

Nightly package

Every push to main, plus the daily 02:17 Asia/Singapore schedule, builds and verifies an Apple Silicon DMG in the Nightly macOS package workflow. Download C2-nightly-macos-arm64-<commit> from that run's artifacts. Nightly packages are ad-hoc signed but not Apple-notarized, so they are for testing rather than general distribution.

Development, nightly, and release builds can be installed together. Their macOS identities and default data directories are isolated:

ChannelApplicationBundle identifierApplication Support directory
DevelopmentC2-dev.appdev.codetwo.app.devdev.codetwo.app.dev
NightlyC2 Nightly.appdev.codetwo.app.nightlydev.codetwo.app.nightly
ReleaseC2.appdev.codetwo.appdev.codetwo.app

Only release builds embed the Sparkle update helper. Development and nightly builds stay on their explicit build channel and cannot replace a release through the in-app updater.

Versioned release

Run the Release macOS workflow, enter a semantic version such as 0.1.0, provide a canonical change id whose Artifact is ready-to-release, and choose whether it is a prerelease. The workflow builds and verifies the versioned Apple Silicon DMG before it creates the matching v<version> tag and publishes a GitHub Release with the DMG, SHA-256 checksum, and authorized change id. Existing tags are never overwritten.

Release packages are currently ad-hoc signed and not Apple-notarized. They are suitable for testing through GitHub Releases, but a public production distribution still requires Developer ID signing and notarization.

Other surfaces

From the repository root:

# Build the TUI, server, and their sibling Bun Tool Broker
./script/build/hosts.sh release
# Terminal interface
./target/release/codetwo-tui
# Paired remote web client
./target/release/codetwo-server
# Self-contained turn demo using a stub ACP agent (requires Node)
cargo run -p codetwo-core --example live_demo

The remote server prints a one-time pairing URL and token. Keep it on a trusted LAN or Tailscale tailnet; C2 does not provide a hosted relay.

Repository map

PathPurpose
crates/kernelReactive plugin runtime and command registry
crates/corePlugin-independent product domain: ACP, sessions, providers, policy, and persistence
crates/pluginsCore adapters, built-in runtime graph, extension bundles, protocol, and marketplace
crates/tuiratatui frontend
crates/serverHeadless server, pairing, WebSocket protocol, and remote client
apps/desktopElectrobun + React + BlockNote desktop app
packages/tool-brokerProvider-neutral special-tool catalog and immutable routing plans
websiteVitePress documentation and GitHub Pages site
docsDocumentation map, current contracts, designs, research, and SDLC records
scriptDevelopment, build, and repository-verification entry points

Development

Run Rust checks from the repository root:

cargo check --workspace --all-targets
cargo test --workspace
./script/build/hosts.sh debug

Run desktop checks from apps/desktop:

bun install --frozen-lockfile
bun run lint
bun test
bun run build

Build the documentation site from website:

bun install --frozen-lockfile
bun run docs:build

The desktop UI follows the repository's design system. Product surfaces use the shared components under apps/desktop/src/components/ui; avoid introducing one-off interaction primitives or visual tokens.

Contributing

Bug reports, documentation fixes, and focused pull requests are welcome. For a large change, open an issue first so the product boundary and protocol impact can be discussed before implementation.

Please keep changes scoped, add tests for behavior changes, and run the relevant checks above. A pull request that changes user-visible desktop UI should include light, dark, and narrow viewport evidence where applicable.

Material changes follow the repository's AI-native development lifecycle. Link the canonical change Artifact in the pull request. Implementation starts only after its Intent/Spec is accepted and the Artifact reaches executing; do not create a parallel lifecycle, specs, or plans registry.

Security and privacy

C2 runs provider CLIs as local child processes and communicates with them over stdio. C2 does not change the provider's own network, authentication, data-retention, or tool policies; review those separately before giving a provider access to sensitive code.

Remote access is bearer-token based and intended for a trusted LAN or Tailscale network. Do not expose codetwo-server directly to the public internet. Please report a suspected vulnerability privately to the repository owner rather than opening a public exploit report.

License

Licensed under the Apache License 2.0.

About

Document-first coding-agent app: one Rust core driving a Tauri desktop app + a ratatui TUI over ACP (Claude Code / Codex / Grok / Cursor / OpenCode).

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

C2 app icon

C2

The document-first coding agent.
Compose structured prompts, weave in reusable skills, and run your coding CLIs through one local interface.

Website · Get started · Documentation · Architecture · Plugin standard · Plugin protocol

C2 document editor with the skill picker open

Important

C2 is pre-release software. The core product works, but there are no signed binary releases yet. Build it from source and expect APIs, storage, and packaging details to change before 1.0.

Why C2

Most coding-agent clients begin with a chat box. C2 begins with a document. You can shape a long brief with headings and lists, insert skills and files exactly where they belong, inspect the whole turn, and only then send it to the agent you choose.

  • Document-first prompts. Compose in a BlockNote editor instead of squeezing a specification into a single-line input.
  • Eleven coding CLIs, one protocol. Drive Claude Code, Codex, Grok, Cursor, OpenCode 1 or 2, Pi, Kimi, ZCode/GLM, Amp, and Droid through the Agent Client Protocol.
  • Skills and complete plugins. Insert reusable skills inline, or install GitHub packages that can include skills, subagents, MCP servers, and project scaffolds.
  • Local, inspectable continuity. Sessions and project memory live in the shared Rust core; derived memories retain their sources and can be pinned or forgotten.
  • Git-aware execution. Use per-session worktrees, automatic checkpoints, diffs, revert, and explicit commit/push flows.
  • Three surfaces. C2 ships an Electrobun desktop app, a ratatui TUI, and a paired remote web client. All three compose the same Rust Core through the same plugin runtime; Electrobun is the desktop shell and relays one command/event protocol to its bundled Rust host.

How it fits together

Claude Code · Codex · Grok · Cursor · OpenCode 1 · OpenCode 2 · Pi · Kimi · GLM · Amp · Droid
│
ACP over stdio
│
Rust product core
│
Plugin composition layer
┌─────────┼─────────┐
│ │ │
Desktop TUI Remote
Electrobun + React ratatui Axum + WebSocket

C2's internals form a runtime-module graph inspired by cordis: storage, agent execution, git, memory, scenes, and other subsystems declare what they require and provide. Separately installed extensions use the small JSON-RPC plugin protocol and only the explicitly exported Extension API; the internal Rust trait and Core commands are not the public plugin contract. Package, lifecycle, scope, security, and host behavior follow the C2 Plugin Standard.

Build from source

Prerequisites

  • Rust 1.82 or newer
  • Zig 0.15.2 exactly, required by the embedded Ghostty terminal engine
  • Bun
  • Git
  • Your platform's native build tools (Xcode command-line tools on macOS)
  • At least one supported provider CLI if you want to run a real agent turn

On macOS, install the pinned Zig version with Homebrew:

brew install zig@0.15
brew link --force zig@0.15

Then clone the repository and run the desktop app:

git clone https://github.com/IchenDEV/codeTwo.git
cd codeTwo
./script/dev/run.sh

C2 detects provider CLIs on your PATH. Provider-specific setup and the exact adapter commands are documented in Providers.

Nightly package

Every push to main, plus the daily 02:17 Asia/Singapore schedule, builds and verifies an Apple Silicon DMG in the Nightly macOS package workflow. Download C2-nightly-macos-arm64-<commit> from that run's artifacts. Nightly packages are ad-hoc signed but not Apple-notarized, so they are for testing rather than general distribution.

Development, nightly, and release builds can be installed together. Their macOS identities and default data directories are isolated:

ChannelApplicationBundle identifierApplication Support directory
DevelopmentC2-dev.appdev.codetwo.app.devdev.codetwo.app.dev
NightlyC2 Nightly.appdev.codetwo.app.nightlydev.codetwo.app.nightly
ReleaseC2.appdev.codetwo.appdev.codetwo.app

Only release builds embed the Sparkle update helper. Development and nightly builds stay on their explicit build channel and cannot replace a release through the in-app updater.

Versioned release

Run the Release macOS workflow, enter a semantic version such as 0.1.0, provide a canonical change id whose Artifact is ready-to-release, and choose whether it is a prerelease. The workflow builds and verifies the versioned Apple Silicon DMG before it creates the matching v<version> tag and publishes a GitHub Release with the DMG, SHA-256 checksum, and authorized change id. Existing tags are never overwritten.

Release packages are currently ad-hoc signed and not Apple-notarized. They are suitable for testing through GitHub Releases, but a public production distribution still requires Developer ID signing and notarization.

Other surfaces

From the repository root:

# Build the TUI, server, and their sibling Bun Tool Broker
./script/build/hosts.sh release
# Terminal interface
./target/release/codetwo-tui
# Paired remote web client
./target/release/codetwo-server
# Self-contained turn demo using a stub ACP agent (requires Node)
cargo run -p codetwo-core --example live_demo

The remote server prints a one-time pairing URL and token. Keep it on a trusted LAN or Tailscale tailnet; C2 does not provide a hosted relay.

Repository map

PathPurpose
crates/kernelReactive plugin runtime and command registry
crates/corePlugin-independent product domain: ACP, sessions, providers, policy, and persistence
crates/pluginsCore adapters, built-in runtime graph, extension bundles, protocol, and marketplace
crates/tuiratatui frontend
crates/serverHeadless server, pairing, WebSocket protocol, and remote client
apps/desktopElectrobun + React + BlockNote desktop app
packages/tool-brokerProvider-neutral special-tool catalog and immutable routing plans
websiteVitePress documentation and GitHub Pages site
docsDocumentation map, current contracts, designs, research, and SDLC records
scriptDevelopment, build, and repository-verification entry points

Development

Run Rust checks from the repository root:

cargo check --workspace --all-targets
cargo test --workspace
./script/build/hosts.sh debug

Run desktop checks from apps/desktop:

bun install --frozen-lockfile
bun run lint
bun test
bun run build

Build the documentation site from website:

bun install --frozen-lockfile
bun run docs:build

The desktop UI follows the repository's design system. Product surfaces use the shared components under apps/desktop/src/components/ui; avoid introducing one-off interaction primitives or visual tokens.

Contributing

Bug reports, documentation fixes, and focused pull requests are welcome. For a large change, open an issue first so the product boundary and protocol impact can be discussed before implementation.

Please keep changes scoped, add tests for behavior changes, and run the relevant checks above. A pull request that changes user-visible desktop UI should include light, dark, and narrow viewport evidence where applicable.

Material changes follow the repository's AI-native development lifecycle. Link the canonical change Artifact in the pull request. Implementation starts only after its Intent/Spec is accepted and the Artifact reaches executing; do not create a parallel lifecycle, specs, or plans registry.

Security and privacy

C2 runs provider CLIs as local child processes and communicates with them over stdio. C2 does not change the provider's own network, authentication, data-retention, or tool policies; review those separately before giving a provider access to sensitive code.

Remote access is bearer-token based and intended for a trusted LAN or Tailscale network. Do not expose codetwo-server directly to the public internet. Please report a suspected vulnerability privately to the repository owner rather than opening a public exploit report.

License

Licensed under the Apache License 2.0.

About

Document-first coding-agent app: one Rust core driving a Tauri desktop app + a ratatui TUI over ACP (Claude Code / Codex / Grok / Cursor / OpenCode).

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

C2 app icon

C2

The document-first coding agent.
Compose structured prompts, weave in reusable skills, and run your coding CLIs through one local interface.

Website · Get started · Documentation · Architecture · Plugin standard · Plugin protocol

C2 document editor with the skill picker open

Important

C2 is pre-release software. The core product works, but there are no signed binary releases yet. Build it from source and expect APIs, storage, and packaging details to change before 1.0.

Why C2

Most coding-agent clients begin with a chat box. C2 begins with a document. You can shape a long brief with headings and lists, insert skills and files exactly where they belong, inspect the whole turn, and only then send it to the agent you choose.

  • Document-first prompts. Compose in a BlockNote editor instead of squeezing a specification into a single-line input.
  • Eleven coding CLIs, one protocol. Drive Claude Code, Codex, Grok, Cursor, OpenCode 1 or 2, Pi, Kimi, ZCode/GLM, Amp, and Droid through the Agent Client Protocol.
  • Skills and complete plugins. Insert reusable skills inline, or install GitHub packages that can include skills, subagents, MCP servers, and project scaffolds.
  • Local, inspectable continuity. Sessions and project memory live in the shared Rust core; derived memories retain their sources and can be pinned or forgotten.
  • Git-aware execution. Use per-session worktrees, automatic checkpoints, diffs, revert, and explicit commit/push flows.
  • Three surfaces. C2 ships an Electrobun desktop app, a ratatui TUI, and a paired remote web client. All three compose the same Rust Core through the same plugin runtime; Electrobun is the desktop shell and relays one command/event protocol to its bundled Rust host.

How it fits together

Claude Code · Codex · Grok · Cursor · OpenCode 1 · OpenCode 2 · Pi · Kimi · GLM · Amp · Droid
│
ACP over stdio
│
Rust product core
│
Plugin composition layer
┌─────────┼─────────┐
│ │ │
Desktop TUI Remote
Electrobun + React ratatui Axum + WebSocket

C2's internals form a runtime-module graph inspired by cordis: storage, agent execution, git, memory, scenes, and other subsystems declare what they require and provide. Separately installed extensions use the small JSON-RPC plugin protocol and only the explicitly exported Extension API; the internal Rust trait and Core commands are not the public plugin contract. Package, lifecycle, scope, security, and host behavior follow the C2 Plugin Standard.

Build from source

Prerequisites

  • Rust 1.82 or newer
  • Zig 0.15.2 exactly, required by the embedded Ghostty terminal engine
  • Bun
  • Git
  • Your platform's native build tools (Xcode command-line tools on macOS)
  • At least one supported provider CLI if you want to run a real agent turn

On macOS, install the pinned Zig version with Homebrew:

brew install zig@0.15
brew link --force zig@0.15

Then clone the repository and run the desktop app:

git clone https://github.com/IchenDEV/codeTwo.git
cd codeTwo
./script/dev/run.sh

C2 detects provider CLIs on your PATH. Provider-specific setup and the exact adapter commands are documented in Providers.

Nightly package

Every push to main, plus the daily 02:17 Asia/Singapore schedule, builds and verifies an Apple Silicon DMG in the Nightly macOS package workflow. Download C2-nightly-macos-arm64-<commit> from that run's artifacts. Nightly packages are ad-hoc signed but not Apple-notarized, so they are for testing rather than general distribution.

Development, nightly, and release builds can be installed together. Their macOS identities and default data directories are isolated:

ChannelApplicationBundle identifierApplication Support directory
DevelopmentC2-dev.appdev.codetwo.app.devdev.codetwo.app.dev
NightlyC2 Nightly.appdev.codetwo.app.nightlydev.codetwo.app.nightly
ReleaseC2.appdev.codetwo.appdev.codetwo.app

Only release builds embed the Sparkle update helper. Development and nightly builds stay on their explicit build channel and cannot replace a release through the in-app updater.

Versioned release

Run the Release macOS workflow, enter a semantic version such as 0.1.0, provide a canonical change id whose Artifact is ready-to-release, and choose whether it is a prerelease. The workflow builds and verifies the versioned Apple Silicon DMG before it creates the matching v<version> tag and publishes a GitHub Release with the DMG, SHA-256 checksum, and authorized change id. Existing tags are never overwritten.

Release packages are currently ad-hoc signed and not Apple-notarized. They are suitable for testing through GitHub Releases, but a public production distribution still requires Developer ID signing and notarization.

Other surfaces

From the repository root:

# Build the TUI, server, and their sibling Bun Tool Broker
./script/build/hosts.sh release
# Terminal interface
./target/release/codetwo-tui
# Paired remote web client
./target/release/codetwo-server
# Self-contained turn demo using a stub ACP agent (requires Node)
cargo run -p codetwo-core --example live_demo

The remote server prints a one-time pairing URL and token. Keep it on a trusted LAN or Tailscale tailnet; C2 does not provide a hosted relay.

Repository map

PathPurpose
crates/kernelReactive plugin runtime and command registry
crates/corePlugin-independent product domain: ACP, sessions, providers, policy, and persistence
crates/pluginsCore adapters, built-in runtime graph, extension bundles, protocol, and marketplace
crates/tuiratatui frontend
crates/serverHeadless server, pairing, WebSocket protocol, and remote client
apps/desktopElectrobun + React + BlockNote desktop app
packages/tool-brokerProvider-neutral special-tool catalog and immutable routing plans
websiteVitePress documentation and GitHub Pages site
docsDocumentation map, current contracts, designs, research, and SDLC records
scriptDevelopment, build, and repository-verification entry points

Development

Run Rust checks from the repository root:

cargo check --workspace --all-targets
cargo test --workspace
./script/build/hosts.sh debug

Run desktop checks from apps/desktop:

bun install --frozen-lockfile
bun run lint
bun test
bun run build

Build the documentation site from website:

bun install --frozen-lockfile
bun run docs:build

The desktop UI follows the repository's design system. Product surfaces use the shared components under apps/desktop/src/components/ui; avoid introducing one-off interaction primitives or visual tokens.

Contributing

Bug reports, documentation fixes, and focused pull requests are welcome. For a large change, open an issue first so the product boundary and protocol impact can be discussed before implementation.

Please keep changes scoped, add tests for behavior changes, and run the relevant checks above. A pull request that changes user-visible desktop UI should include light, dark, and narrow viewport evidence where applicable.

Material changes follow the repository's AI-native development lifecycle. Link the canonical change Artifact in the pull request. Implementation starts only after its Intent/Spec is accepted and the Artifact reaches executing; do not create a parallel lifecycle, specs, or plans registry.

Security and privacy

C2 runs provider CLIs as local child processes and communicates with them over stdio. C2 does not change the provider's own network, authentication, data-retention, or tool policies; review those separately before giving a provider access to sensitive code.

Remote access is bearer-token based and intended for a trusted LAN or Tailscale network. Do not expose codetwo-server directly to the public internet. Please report a suspected vulnerability privately to the repository owner rather than opening a public exploit report.

License

Licensed under the Apache License 2.0.

About

Document-first coding-agent app: one Rust core driving a Tauri desktop app + a ratatui TUI over ACP (Claude Code / Codex / Grok / Cursor / OpenCode).

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

C2 app icon

C2

The document-first coding agent.
Compose structured prompts, weave in reusable skills, and run your coding CLIs through one local interface.

Website · Get started · Documentation · Architecture · Plugin standard · Plugin protocol

C2 document editor with the skill picker open

Important

C2 is pre-release software. The core product works, but there are no signed binary releases yet. Build it from source and expect APIs, storage, and packaging details to change before 1.0.

Why C2

Most coding-agent clients begin with a chat box. C2 begins with a document. You can shape a long brief with headings and lists, insert skills and files exactly where they belong, inspect the whole turn, and only then send it to the agent you choose.

  • Document-first prompts. Compose in a BlockNote editor instead of squeezing a specification into a single-line input.
  • Eleven coding CLIs, one protocol. Drive Claude Code, Codex, Grok, Cursor, OpenCode 1 or 2, Pi, Kimi, ZCode/GLM, Amp, and Droid through the Agent Client Protocol.
  • Skills and complete plugins. Insert reusable skills inline, or install GitHub packages that can include skills, subagents, MCP servers, and project scaffolds.
  • Local, inspectable continuity. Sessions and project memory live in the shared Rust core; derived memories retain their sources and can be pinned or forgotten.
  • Git-aware execution. Use per-session worktrees, automatic checkpoints, diffs, revert, and explicit commit/push flows.
  • Three surfaces. C2 ships an Electrobun desktop app, a ratatui TUI, and a paired remote web client. All three compose the same Rust Core through the same plugin runtime; Electrobun is the desktop shell and relays one command/event protocol to its bundled Rust host.

How it fits together

Claude Code · Codex · Grok · Cursor · OpenCode 1 · OpenCode 2 · Pi · Kimi · GLM · Amp · Droid
│
ACP over stdio
│
Rust product core
│
Plugin composition layer
┌─────────┼─────────┐
│ │ │
Desktop TUI Remote
Electrobun + React ratatui Axum + WebSocket

C2's internals form a runtime-module graph inspired by cordis: storage, agent execution, git, memory, scenes, and other subsystems declare what they require and provide. Separately installed extensions use the small JSON-RPC plugin protocol and only the explicitly exported Extension API; the internal Rust trait and Core commands are not the public plugin contract. Package, lifecycle, scope, security, and host behavior follow the C2 Plugin Standard.

Build from source

Prerequisites

  • Rust 1.82 or newer
  • Zig 0.15.2 exactly, required by the embedded Ghostty terminal engine
  • Bun
  • Git
  • Your platform's native build tools (Xcode command-line tools on macOS)
  • At least one supported provider CLI if you want to run a real agent turn

On macOS, install the pinned Zig version with Homebrew:

brew install zig@0.15
brew link --force zig@0.15

Then clone the repository and run the desktop app:

git clone https://github.com/IchenDEV/codeTwo.git
cd codeTwo
./script/dev/run.sh

C2 detects provider CLIs on your PATH. Provider-specific setup and the exact adapter commands are documented in Providers.

Nightly package

Every push to main, plus the daily 02:17 Asia/Singapore schedule, builds and verifies an Apple Silicon DMG in the Nightly macOS package workflow. Download C2-nightly-macos-arm64-<commit> from that run's artifacts. Nightly packages are ad-hoc signed but not Apple-notarized, so they are for testing rather than general distribution.

Development, nightly, and release builds can be installed together. Their macOS identities and default data directories are isolated:

ChannelApplicationBundle identifierApplication Support directory
DevelopmentC2-dev.appdev.codetwo.app.devdev.codetwo.app.dev
NightlyC2 Nightly.appdev.codetwo.app.nightlydev.codetwo.app.nightly
ReleaseC2.appdev.codetwo.appdev.codetwo.app

Only release builds embed the Sparkle update helper. Development and nightly builds stay on their explicit build channel and cannot replace a release through the in-app updater.

Versioned release

Run the Release macOS workflow, enter a semantic version such as 0.1.0, provide a canonical change id whose Artifact is ready-to-release, and choose whether it is a prerelease. The workflow builds and verifies the versioned Apple Silicon DMG before it creates the matching v<version> tag and publishes a GitHub Release with the DMG, SHA-256 checksum, and authorized change id. Existing tags are never overwritten.

Release packages are currently ad-hoc signed and not Apple-notarized. They are suitable for testing through GitHub Releases, but a public production distribution still requires Developer ID signing and notarization.

Other surfaces

From the repository root:

# Build the TUI, server, and their sibling Bun Tool Broker
./script/build/hosts.sh release
# Terminal interface
./target/release/codetwo-tui
# Paired remote web client
./target/release/codetwo-server
# Self-contained turn demo using a stub ACP agent (requires Node)
cargo run -p codetwo-core --example live_demo

The remote server prints a one-time pairing URL and token. Keep it on a trusted LAN or Tailscale tailnet; C2 does not provide a hosted relay.

Repository map

PathPurpose
crates/kernelReactive plugin runtime and command registry
crates/corePlugin-independent product domain: ACP, sessions, providers, policy, and persistence
crates/pluginsCore adapters, built-in runtime graph, extension bundles, protocol, and marketplace
crates/tuiratatui frontend
crates/serverHeadless server, pairing, WebSocket protocol, and remote client
apps/desktopElectrobun + React + BlockNote desktop app
packages/tool-brokerProvider-neutral special-tool catalog and immutable routing plans
websiteVitePress documentation and GitHub Pages site
docsDocumentation map, current contracts, designs, research, and SDLC records
scriptDevelopment, build, and repository-verification entry points

Development

Run Rust checks from the repository root:

cargo check --workspace --all-targets
cargo test --workspace
./script/build/hosts.sh debug

Run desktop checks from apps/desktop:

bun install --frozen-lockfile
bun run lint
bun test
bun run build

Build the documentation site from website:

bun install --frozen-lockfile
bun run docs:build

The desktop UI follows the repository's design system. Product surfaces use the shared components under apps/desktop/src/components/ui; avoid introducing one-off interaction primitives or visual tokens.

Contributing

Bug reports, documentation fixes, and focused pull requests are welcome. For a large change, open an issue first so the product boundary and protocol impact can be discussed before implementation.

Please keep changes scoped, add tests for behavior changes, and run the relevant checks above. A pull request that changes user-visible desktop UI should include light, dark, and narrow viewport evidence where applicable.

Material changes follow the repository's AI-native development lifecycle. Link the canonical change Artifact in the pull request. Implementation starts only after its Intent/Spec is accepted and the Artifact reaches executing; do not create a parallel lifecycle, specs, or plans registry.

Security and privacy

C2 runs provider CLIs as local child processes and communicates with them over stdio. C2 does not change the provider's own network, authentication, data-retention, or tool policies; review those separately before giving a provider access to sensitive code.

Remote access is bearer-token based and intended for a trusted LAN or Tailscale network. Do not expose codetwo-server directly to the public internet. Please report a suspected vulnerability privately to the repository owner rather than opening a public exploit report.

License

Licensed under the Apache License 2.0.

About

Document-first coding-agent app: one Rust core driving a Tauri desktop app + a ratatui TUI over ACP (Claude Code / Codex / Grok / Cursor / OpenCode).

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages