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.
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.
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.technologylet 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 workspaceclient.create_workspace("some-workspace").await?;let workspace = client.attach_workspace("some-workspace").await?;// create a new buffer in this workspace and attach to itworkspace.create_buffer("/my/file.txt").await?;let buffer = workspace.attach_buffer("/my/file.txt").await?;// write `hello!` at the beginning of this bufferbuffer.send(codemp::api::TextChange {start_idx: 0, end_idx: 0,content: "hello!".to_string(),})?;// wait for cursor movementsloop {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.technologylet client = await codemp.connect({username: "mail@example.net",password: "dont-use-this-password"});// create and join a workspaceawait client.createWorkspace("some-workspace");let workspace = await client.attachWorkspace("some-workspace");// create a new buffer in this workspace and attach to itawait workspace.createBuffer("/my/file.txt");let buffer = await workspace.attachBuffer("/my/file.txt");// write `hello!` at the beginning of this bufferawait buffer.send({start_idx: 0, end_idx: 0,content: "hello!",});// wait for cursor movementswhile (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.technologyClient client = Client.connect(new data.Config("mail@example.net","dont-use-this-password"));// create and join a workspaceclient.createWorkspace("some-workspace");Workspace workspace = client.attachWorkspace("some-workspace");// create a new buffer in this workspace and attach to itworkspace.createBuffer("/my/file.txt");BufferController buffer = workspace.attachBuffer("/my/file.txt");// write `hello!` at the beginning of this bufferbuffer.send(new data.TextChange(0, 0, "hello!",java.util.OptionalLong.empty() // optional, used for error detection));// wait for cursor movementswhile (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.technologyclient = codemp.connect(codemp.Config(username = "mail@example.net",password = "dont-use-this-password")).wait()# create and join a workspaceclient.create_workspace("some-workspace").wait()workspace = client.attach_workspace("some-workspace").wait()# create a new buffer in this workspace and attach to itworkspace.create_buffer("/my/file.txt").wait()buffer = workspace.attach_buffer("/my/file.txt").wait()# write `hello!` at the beginning of this bufferbuffer.send(codemp.TextChange(start_idx = 0, end_idx = 0,content = "hello!")).wait()# wait for cursor movementswhile 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.technologylocal client = CODEMP.connect({username = "mail@example.net",password = "dont-use-this-password"}):await()-- create and join a workspaceclient:create_workspace("my-workspace"):await()local workspace = client:attach_workspace("my-workspace"):await()-- create a new buffer in this workspace and attach to itworkspace:create_buffer("/my/file.txt"):await()local buffer = workspace:attach_buffer("/my/file.txt"):await()-- write `hello!` at the beginning of this bufferbuffer:send({start_idx = 0, end_idx = 0,content = "hello!"}):await()-- wait for cursor movementswhile true dolocal event = workspace.cursor:recv():await()print("user " .. event.user .. " moved on buffer " .. event.buffer)end