Control your AI coding assistant from anywhere β your phone, tablet, or another computer.
remote-opencode is a Discord bot that bridges your local OpenCode CLI to Discord, enabling you to interact with your AI coding assistant remotely. Perfect for developers who want to:
- π± Code from mobile β Send coding tasks from your phone while away from your desk
- π» Access from any device β Use your powerful dev machine from a laptop or tablet
- π Work remotely β Control your home/office workstation from anywhere
- π₯ Collaborate β Share AI coding sessions with team members in Discord
- π€ Automated Workflows β Queue up multiple tasks and let the bot process them sequentially
βββββββββββββββββββ Discord API βββββββββββββββββββ
β Your Phone / β ββββββββββββββββΊ β Discord Bot β
β Other Device β β (this project) β
βββββββββββββββββββ ββββββββββ¬βββββββββ
β
βΌ
βββββββββββββββββββ
β OpenCode CLI β
β (your machine) β
ββββββββββ¬βββββββββ
β
βΌ
βββββββββββββββββββ
β Your Codebase β
βββββββββββββββββββ
The bot runs on your development machine alongside OpenCode. When you send a command via Discord, it's forwarded to OpenCode, and the output streams back to you in real-time.
- Installation
- Quick Start
- Discord Bot Setup
- CLI Commands
- Discord Slash Commands
- Usage Workflow
- Configuration
- Troubleshooting
- Development
- Changelog
- License
- Node.js 22+ β Download
- OpenCode CLI β Must be installed and working on your machine
- Discord Account β With a server where you have admin permissions
# Global installation (recommended)
npm install -g remote-opencode
# Or run directly with npx
npx remote-opencodegit clone https://github.com/RoundTable02/remote-opencode.git
cd remote-opencode
npm install
npm run build
npm link # Makes 'remote-opencode' available globallyIf you want to create a single .exe that runs without Node.js installed:
# Generates dist/remote-opencode.exe
npm run build:sea# Step 1: Run the interactive setup wizard
remote-opencode setup
# Step 2: Start the Discord bot
remote-opencode startThat's it! Now use Discord slash commands to interact with OpenCode.
The setup wizard (remote-opencode setup) guides you through the entire process interactively:
- Opens Discord Developer Portal in your browser
- Walks you through creating an application, enabling intents, and getting your bot token
- Generates the invite link automatically and opens it in your browser
- Deploys slash commands to your server
Just run remote-opencode setup and follow the prompts β no manual URL copying needed!
π Manual setup reference (click to expand)
If you prefer manual setup or need to troubleshoot:
- Create Application: Go to Discord Developer Portal, create a new application
- Enable Intents: In "Bot" section, enable SERVER MEMBERS INTENT and MESSAGE CONTENT INTENT
- Get Bot Token: In "Bot" section, reset/view token and copy it
- Get Guild ID: Enable Developer Mode in Discord settings, right-click your server β Copy Server ID
- Invite Bot: Use this URL format:
https://discord.com/api/oauth2/authorize?client_id=YOUR_CLIENT_ID&permissions=2147534848&scope=bot+applications.commands
| Command | Description |
|---|---|
remote-opencode |
Start the bot (shows setup guide if not configured) |
remote-opencode setup |
Interactive setup wizard β configures bot token, IDs |
remote-opencode start |
Start the Discord bot |
remote-opencode deploy |
Deploy/update slash commands to Discord |
remote-opencode config |
Display current configuration info |
Once the bot is running, use these commands in your Discord server:
View the git diff of the current project or active worktree.
/diff
/diff staged:True
| Parameter | Description |
|---|---|
staged |
Optional. If True, shows only staged changes. |
Features:
- π³ Worktree Aware β Automatically shows diffs for the specific worktree if used in a
/workthread. - π Formatted β Uses syntax-highlighted code blocks.
- βοΈ Smart Truncation β Safely handles large diffs to stay within Discord's message limits.
Register a local project path with an alias for easy reference.
/setpath alias:myapp path:/Users/you/projects/my-app
| Parameter | Description |
|---|---|
alias |
Short name for the project (e.g., myapp, backend) |
path |
Absolute path to the project on your machine |
View all registered project paths and their aliases.
/projects
Set which project a Discord channel should interact with.
/use alias:myapp
After binding, all /opencode commands in that channel will work on the specified project.
The main command β sends a prompt to OpenCode and streams the response.
/opencode prompt:Add a dark mode toggle to the settings page
Features:
- π§΅ Auto-creates a thread for each conversation
- β‘ Real-time streaming β see output as it's generated (1-second updates)
- βΈοΈ Interrupt button β stop the current task if needed
- π Session persistence β continue conversations in the same thread
Start isolated work on a new branch with its own worktree.
/work branch:feature/dark-mode description:Implement dark mode toggle
| Parameter | Description |
|---|---|
branch |
Git branch name (will be sanitized) |
description |
Brief description of the work |
Features:
- π³ Creates a new git worktree for isolated work
- π§΅ Opens a dedicated thread for the task
- ποΈ Delete button β removes worktree and archives thread
- π Create PR button β automatically creates a pull request
This is perfect for working on multiple features simultaneously without branch switching.
Enable passthrough mode in a thread to send messages directly to OpenCode without slash commands.
/code
How it works:
- Run
/codein any thread to enable passthrough mode - Type messages naturally β they're sent directly to OpenCode
- Run
/codeagain to disable
Example:
You: /code
Bot: β
Passthrough mode enabled for this thread.
Your messages will be sent directly to OpenCode.
You: Add a dark mode toggle to settings
Bot: π Prompt: Add a dark mode toggle to settings
[streaming response...]
You: Now add a keyboard shortcut for it
Bot: π Prompt: Now add a keyboard shortcut for it
[streaming response...]
You: /code
Bot: β Passthrough mode disabled.
Features:
- π± Mobile-friendly β no more typing slash commands on phone
- π§΅ Thread-scoped β only affects the specific thread, not the whole channel
- β³ Busy indicator β shows β³ reaction if previous task is still running
- π Safe β ignores bot messages (no infinite loops)
Enable automatic worktree creation for a project. When enabled, new /opencode sessions will automatically create isolated git worktrees.
/autowork
How it works:
- Run
/autoworkin a channel bound to a project - The setting toggles on/off for that project
- When enabled, new sessions automatically create worktrees with branch names like
auto/abc12345-1738600000000
Features:
- π³ Automatic isolation β each session gets its own branch and worktree
- π± Mobile-friendly β no need to type
/workwith branch names - ποΈ Delete button β removes worktree when done
- π Create PR button β easily create pull requests from worktree
- β‘ Per-project setting β enable/disable independently for each project
Manage which AI model is used for the current channel.
/model list
/model set name:google/gemini-2.0-flash
| Subcommand | Description |
|---|---|
list |
List all available models from OpenCode CLI |
set |
Set the model to use in this channel |
Set the range of ports the bot can use for OpenCode server instances.
/setports min:3000 max:4000
| Parameter | Description |
|---|---|
min |
Minimum port number (>= 1024) |
max |
Maximum port number (<= 65535) |
Control the automated job queue for the current thread.
/queue list
/queue clear
/queue pause
/queue resume
/queue settings continue_on_failure:True fresh_context:True
How it works:
- Send multiple messages to a thread (or use
/opencodemultiple times) - If the bot is busy, it reacts with
π₯and adds the task to the queue - Once the current job is done, the bot automatically picks up the next one
Settings:
continue_on_failure: IfTrue, the bot moves to the next task even if the current one fails.fresh_context: IfTrue(default), the AI forgets previous chat history for each new queued task to improve performance, while maintaining the same code state.
-
Register your project:
/setpath alias:webapp path:/home/user/my-webapp -
Bind to a channel:
/use alias:webapp -
Start coding remotely:
/opencode prompt:Refactor the authentication module to use JWT -
Continue the conversation in the created thread:
/opencode prompt:Now add refresh token support
Perfect for when you're away from your desk:
- π± Open Discord on your phone
- Navigate to your bound channel
- Use
/opencodeto send tasks - Watch real-time progress
- Use the Interrupt button if needed
Pro tip: Enable passthrough mode with /code in a thread for an even smoother mobile experience β just type messages directly without slash commands!
Share AI coding sessions with your team:
- Create a dedicated Discord channel for your project
- Bind the project:
/use alias:team-project - Team members can watch sessions in real-time
- Discuss in threads while AI works
Perfect for "setting and forgetting" several tasks:
-
Send multiple instructions:
You: Refactor the API Bot: [Starts working] You: Add documentation to the new methods Bot: π₯ [Queued] You: Run tests and fix any issues Bot: π₯ [Queued] -
The bot will finish the API refactor, then automatically start the documentation task, then run the tests.
-
Monitor progress: Use
/queue listto see pending tasks.
All configuration is stored in ~/.remote-opencode/:
| File | Purpose |
|---|---|
config.json |
Bot credentials (token, client ID, guild ID) |
data.json |
Project paths, channel bindings, session data |
{
"discordToken": "your-bot-token",
"clientId": "your-application-id",
"guildId": "your-server-id"
}{
"projects": [
{ "alias": "myapp", "path": "/Users/you/projects/my-app", "autoWorktree": true }
],
"bindings": [
{ "channelId": "channel-id", "projectAlias": "myapp" }
],
"threadSessions": [ ... ],
"worktreeMappings": [ ... ]
}| Field | Description |
|---|---|
projects[].autoWorktree |
Optional. When true, new sessions auto-create worktrees |
- Check bot is online: Look for the bot in your server's member list
- Verify permissions: Bot needs these permissions:
- Send Messages
- Create Public Threads
- Send Messages in Threads
- Embed Links
- Read Message History
- Redeploy commands:
remote-opencode deploy
You need to bind a project to the channel:
/setpath alias:myproject path:/path/to/project
/use alias:myproject
Slash commands can take up to an hour to propagate globally. For faster updates:
- Kick the bot from your server
- Re-invite it
- Run
remote-opencode deploy
- Verify OpenCode is installed:
opencode --version
- Check if another process is using the port
- Ensure the project path exists and is accessible
The bot maintains persistent sessions. If you encounter issues:
- Start a new thread with
/opencodeinstead of continuing in an old one - Restart the bot:
remote-opencode start
- Check Node.js version:
node --version # Should be 22+ - Verify configuration:
remote-opencode config
- Re-run setup:
remote-opencode setup
git clone https://github.com/RoundTable02/remote-opencode.git
cd remote-opencode
npm install
# Development mode (with ts-node)
npm run dev setup # Run setup
npm run dev start # Start bot
# Build and run production
npm run build
npm startnpm testsrc/
βββ cli.ts # CLI entry point
βββ bot.ts # Discord client initialization
βββ commands/ # Slash command definitions
β βββ opencode.ts # Main AI interaction command
β βββ code.ts # Passthrough mode toggle
β βββ work.ts # Worktree management
β βββ setpath.ts # Project registration
β βββ projects.ts # List projects
β βββ use.ts # Channel binding
βββ handlers/ # Interaction handlers
β βββ interactionHandler.ts
β βββ buttonHandler.ts
β βββ messageHandler.ts # Passthrough message handling
βββ services/ # Core business logic
β βββ serveManager.ts # OpenCode process management
β βββ sessionManager.ts # Session state management
β βββ queueManager.ts # Automated job queuing
β βββ executionService.ts # Core prompt execution logic
β βββ sseClient.ts # Real-time event streaming
β βββ dataStore.ts # Persistent storage
β βββ configStore.ts # Bot configuration
β βββ worktreeManager.ts # Git worktree operations
βββ setup/ # Setup wizard
β βββ wizard.ts # Interactive setup
β βββ deploy.ts # Command deployment
βββ utils/ # Utilities
βββ messageFormatter.ts
βββ threadHelper.ts
See CHANGELOG.md for a full history of changes.
- Automated Message Queuing: Added a new system to queue multiple prompts in a thread. If the bot is busy, new messages are automatically queued and processed sequentially.
- Queue Management: New
/queueslash command suite to list, clear, pause, resume, and configure queue settings.
- New
/setportsslash command to configure the port range for OpenCode server instances.
- Fixed Windows-specific spawning issue (targeting
opencode.cmd). - Resolved
spawn EINVALerrors on Windows. - Improved server reliability and suppressed
DEP0190security warnings.
- New
/modelslash command to set AI models per channel. - Support for
--modelflag in OpenCode server instances.
- Fixed connection timeout issues.
- Standardized internal communication to use
127.0.0.1.
MIT
Contributions are welcome! Please read our Contributing Guide before submitting a Pull Request.
