codemp

code multiplexer

a real-time collaborative

editor plugin ecosystem

Collaborative to the core

We want to streamline and simplify remote software development.

Document editing has been collaborative for years now, so why is code lagging behind?

We offer a real remote collaborative experience, with all the expressiveness your editor of choice can provide.

Great software is made by great teams. It's important to allow them to perform from whatever distance.

Collaboration doesn't mean just synchronization.

Don't compromise on your editor

Visual Studio Code IntelliJ Platform
NeoVim Sublime Text

With codemp you no longer need to conform to your colleague's choice of editor to cooperate.

Simply install the plugin in your IDE of choice, and work together with others on any compatible system!

We natively support a growing number of text editors and IDEs, and offer developers tooling to easily integrate new ones.

Extensible by design

codemp is Open Source Software: it strives to be a full ecosystem for collaborative remote development.

We ship a native Rust library, as well as a growing list of ready-to-use bindings in many other languages.

Can't find a plugin for your editor? Integrating codemp with your IDE is easy.

Rust JavaScript Java Python Lua
use codemp::api::controller::{AsyncReceiver, AsyncSender}; // needed for send/recv trait methods // connect first, api.code.mp is managed by hexed.technology let client = codemp::Client::connect(codemp::api::Config { username: "mail@example.net".into(), password: "dont-use-this-password".into(), ..Default::default() }).await?; // create and join a workspace client.create_workspace("some-workspace").await?; let workspace = client.attach_workspace("some-workspace").await?; // create a new buffer in this workspace and attach to it workspace.create_buffer("/my/file.txt").await?; let buffer = workspace.attach_buffer("/my/file.txt").await?; // write `hello!` at the beginning of this buffer buffer.send(codemp::api::TextChange { start_idx: 0, end_idx: 0, content: "hello!".to_string(), })?; // wait for cursor movements loop { let event = workspace.cursor().recv().await?; println!("user {} moved on buffer {}", event.user, event.sel.buffer); }
import * as codemp from codemp; // connect first, api.code.mp is managed by hexed.technology let client = await codemp.connect({ username: "mail@example.net", password: "dont-use-this-password" }); // create and join a workspace await client.createWorkspace("some-workspace"); let workspace = await client.attachWorkspace("some-workspace"); // create a new buffer in this workspace and attach to it await workspace.createBuffer("/my/file.txt"); let buffer = await workspace.attachBuffer("/my/file.txt"); // write `hello!` at the beginning of this buffer await buffer.send({ start_idx: 0, end_idx: 0, content: "hello!", }); // wait for cursor movements while (true) { let event = await workspace.cursor().recv(); console.log(`user ${event.user} moved on buffer ${event.buffer}`); }
import mp.code.*; // connect first, api.code.mp is managed by hexed.technology Client client = Client.connect(new data.Config( "mail@example.net", "dont-use-this-password" )); // create and join a workspace client.createWorkspace("some-workspace"); Workspace workspace = client.attachWorkspace("some-workspace"); // create a new buffer in this workspace and attach to it workspace.createBuffer("/my/file.txt"); BufferController buffer = workspace.attachBuffer("/my/file.txt"); // write `hello!` at the beginning of this buffer buffer.send(new data.TextChange( 0, 0, "hello!", java.util.OptionalLong.empty() // optional, used for error detection )); // wait for cursor movements while (true) { data.Cursor event = workspace.cursor().recv(); System.out.printf("user %s moved on buffer %s\n", event.user, event.buffer); }
import codemp # connect first, api.code.mp is managed by hexed.technology client = codemp.connect(codemp.Config( username = "mail@example.net", password = "dont-use-this-password" )).wait() # create and join a workspace client.create_workspace("some-workspace").wait() workspace = client.attach_workspace("some-workspace").wait() # create a new buffer in this workspace and attach to it workspace.create_buffer("/my/file.txt").wait() buffer = workspace.attach_buffer("/my/file.txt").wait() # write `hello!` at the beginning of this buffer buffer.send(codemp.TextChange( start_idx = 0, end_idx = 0, content = "hello!" )).wait() # wait for cursor movements while true: event = workspace.cursor().recv().wait() print(f"user {event.user} moved on buffer {event.buffer}")
CODEMP = require(codemp) -- connect first, api.code.mp is managed by hexed.technology local client = CODEMP.connect({ username = "mail@example.net", password = "dont-use-this-password" }):await() -- create and join a workspace client:create_workspace("my-workspace"):await() local workspace = client:attach_workspace("my-workspace"):await() -- create a new buffer in this workspace and attach to it workspace:create_buffer("/my/file.txt"):await() local buffer = workspace:attach_buffer("/my/file.txt"):await() -- write `hello!` at the beginning of this buffer buffer:send({ start_idx = 0, end_idx = 0, content = "hello!" }):await() -- wait for cursor movements while true do local event = workspace.cursor:recv():await() print("user " .. event.user .. " moved on buffer " .. event.buffer) end