io.github.saicharanrajoju/letswork
Real-time collaborative coding via MCP β two developers, one codebase
Ask AI about io.github.saicharanrajoju/letswork
Powered by Claude Β· Grounded in docs
I know everything about io.github.saicharanrajoju/letswork. Ask me about installation, configuration, usage, or troubleshooting.
0/500
Reviews
Documentation
LetsWork
Real-time collaborative coding via Claude Code β two developers, one codebase, each using their own Claude subscription.
One developer hosts the session. The other joins from anywhere. Both get a live Claude Code window connected to the same project β with file locking and an approval system to prevent conflicts.
How It Works
- Host runs
letswork startinside their project folder - A secure HTTPS tunnel is created automatically via Cloudflare
- A one-time URL + guest token is generated and printed
- Host shares the join command with the guest
- Guest runs
letswork join <url> --token <token>on their machine - Both developers now have Claude Code connected to the same codebase
Requirements
| Requirement | macOS | Windows (WSL) |
|---|---|---|
| Python 3.10+ | brew install python | Comes with Ubuntu WSL |
| cloudflared | brew install cloudflared | See WSL section below |
| Claude Code | npm install -g @anthropic-ai/claude-code | npm install -g @anthropic-ai/claude-code (inside WSL) |
| Node.js | brew install node | sudo apt install nodejs npm (inside WSL) |
macOS β Host Setup
The host is the developer who owns the project. You start the session and share the join command.
Step 1 β Install dependencies
brew install cloudflared
pip install letswork
Step 2 β Install Claude Code
npm install -g @anthropic-ai/claude-code
Step 3 β Start the session
Navigate to your project folder and run:
cd /path/to/your/project
letswork start
You'll be asked for your display name, then a session box appears:
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β π€ LetsWork Session Active β
β β
β Send this command to your collaborator: β
β letswork join https://abc123.trycloudflare.com --token a1b2c3d4 β
β β
β Press Ctrl+C to stop. β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Copy the full letswork join ... command and send it to your collaborator.
Two new terminal windows open automatically:
- Claude Code β already connected to LetsWork
- A chat window to communicate with your collaborator
Step 4 β Approve guest changes
When the guest edits a file, you'll see a notification in Claude Code. Ask Claude:
get_pending_changes
Then approve or reject:
approve_change <id>
reject_change <id>
Step 5 β Stop the session
Press Ctrl+C in the terminal where you ran letswork start.
macOS β Guest Setup
The guest connects to the host's project. You need the join command from the host.
Step 1 β Install dependencies
brew install cloudflared
pip install letswork
Step 2 β Install Claude Code
npm install -g @anthropic-ai/claude-code
Step 3 β Join the session
Run the command the host sent you:
letswork join https://abc123.trycloudflare.com --token a1b2c3d4
You'll be asked for your display name. Then two windows open:
- Claude Code β connected to the host's project
- A chat window to communicate with the host
Step 4 β Edit files
Ask Claude to read and edit files normally. When you write a file, it goes into an approval queue β the host reviews it before it's written to disk. You'll get a notification when it's approved or rejected.
Windows β Guest Setup (WSL)
LetsWork runs inside WSL (Windows Subsystem for Linux). The guest experience is the same as macOS once WSL is set up.
Step 1 β Enable WSL and install Ubuntu
Open PowerShell as Administrator and run:
wsl --install
Restart your computer when prompted. Ubuntu will install automatically.
Open Ubuntu from the Start menu and set up your Linux username and password.
Step 2 β Install dependencies inside Ubuntu
Open Ubuntu and run these one by one:
# Update packages
sudo apt update && sudo apt upgrade -y
# Install Python
sudo apt install python3 python3-pip -y
# Install Node.js and npm
sudo apt install nodejs npm -y
# Install cloudflared
curl -L https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64 -o cloudflared
chmod +x cloudflared
sudo mv cloudflared /usr/local/bin/
# Install letswork
pip3 install letswork
Step 3 β Install Claude Code inside Ubuntu
npm install -g @anthropic-ai/claude-code
Step 4 β Join the session
Run the command the host sent you, inside Ubuntu:
letswork join https://abc123.trycloudflare.com --token a1b2c3d4
You'll be asked for your display name. Claude Code launches directly in the same terminal window.
Note for Windows users: Claude Code runs in the WSL terminal β not as a separate window. Everything else works identically to macOS.
MCP Tools Available
Both host and guest have access to these tools inside Claude Code:
| Tool | Who Can Use | Description |
|---|---|---|
list_files | Both | List files and directories with lock status |
read_file | Both | Read file contents (1MB limit, text files only) |
write_file | Both | Submit a file change (guest changes need host approval) |
lock_file | Both | Lock a file for exclusive editing |
unlock_file | Both | Release your own file lock |
get_status | Both | Show session info, connected users, and active locks |
get_notifications | Both | Quick summary of what needs attention |
ping | Both | Verify connection to the host MCP server |
set_display_name | Guest only | Set your display name for the session |
my_pending_changes | Guest only | View your submitted changes awaiting approval |
get_pending_changes | Host only | View all changes awaiting approval with diffs |
approve_change | Host only | Approve a pending change and write it to disk |
reject_change | Host only | Reject a pending change |
force_unlock | Host only | Force-release a stuck file lock |
Approval Flow
Guest file writes do not go directly to disk β they go through the host's approval queue:
- Guest asks Claude to edit a file β
write_filesubmits the change - Host sees:
π guest submitted change to server.py (ID: a1b2c3) - Host asks Claude:
get_pending_changesβ sees a full diff - Host approves:
approve_change a1b2c3β file is written to disk - Or rejects:
reject_change a1b2c3β guest is notified
Security
- Random Cloudflare subdomain β URL is unguessable
- Cryptographic token β second auth layer on top of the URL
- All traffic encrypted via HTTPS
- Path traversal prevention β guest cannot access files outside the project root
- File locks auto-expire after 30 minutes
- No accounts, no signup, no persistent credentials β session ends when host stops
Constraints
- Maximum 2 users per session (Host + 1 Guest)
- Text files only β binary files not supported
- 1MB file size limit per read/write operation
- Guest has no shell access β file operations only
cloudflaredmust be installed on the host machine (guest does not need it on macOS, but WSL guests do)
CLI Reference
letswork start [--port PORT] [--debug] # Start a session (default port: 8000)
letswork join <URL> --token <TOKEN> # Join a session as guest
Architecture
Host Machine:
[Project Files] β [MCP Server :8000] β [Cloudflare Tunnel] β HTTPS URL
β
Guest connects here
via stdio proxy + secret token
The guest connects through a stdio proxy rather than directly over HTTP β this avoids Cloudflare SSE reliability issues and gives stable MCP connectivity.
License
MIT β see LICENSE
Built with the Model Context Protocol.
