Status: Public Alpha (
v0.0.1-alpha.1)
This is an early alpha release. APIs, config formats, and behavior may change between versions. Expect breaking changes and rough edges.
Remote Coder is a Slack-first daemon that lets you control local coding agents, stream their output into Slack threads, and eventually sync progress back to GitHub pull requests. The project runs entirely on your own machine.
- Slack-first control center – Operate your daemon entirely through Slack. Send requests, monitor output, and manage sessions without leaving your workspace.
- Channel-to-repository mapping – Each Slack channel connects to a configured local repository, keeping project contexts organized.
- Thread-based sessions – Every Slack thread is an isolated session with its own state, enabling concurrent work on the same repository.
- Automatic PR management – Changes are committed, pushed, and linked to GitHub pull requests automatically. Updates flow back to Slack with PR links.
- Multi-agent support – Switch between coding agents (Claude, Codex, Gemini) mid-session with a single command. No need to restart.
- Zero API key overhead – Uses local coding agent CLI installations. No additional LLM API keys required beyond what your CLIs already use.
Remote Coder is designed to run on your own machine, with your own tokens, using a simple config directory and .env file.
Before installing Remote Coder, you'll need:
-
System requirements
- uv - Python package manager
- Python 3.11 or higher
-
Coding agent CLIs (at least one required)
Remote Coder requires at least one coding agent CLI to be installed and authenticated:
- Claude Code CLI - Installation guide
- Codex CLI - Installation guide
- Gemini CLI - Installation guide
After installing and authenticating your chosen CLI(s), use the
REMOTE_CODER_AGENTSenvironment variable to specify which agents to enable (see configuration below). You can verify your CLIs are properly authenticated using the!setupcommand once Remote Coder is running. -
Slack App (required)
You'll need a Slack app with Socket Mode enabled to control Remote Coder. See the Slack App Setup section below for detailed instructions on creating the app and obtaining your
SLACK_BOT_TOKENandSLACK_APP_TOKEN. -
GitHub Personal Access Token
If you want Remote Coder to automatically create and update pull requests, you'll need a GitHub PAT. See the GitHub PAT Setup section below for instructions.
uv tool install git+https://github.com/PeterShin23/remote-coder --upgradeThis installs a global remote-coder command.
Want to contribute or modify the code? Clone the repo and run uv pip install -e . from the project root for an editable install.
Run the interactive setup wizard to create your configuration:
remote-coder initThis will guide you through:
- Setting up Slack tokens and allowed users
- Configuring GitHub integration (optional)
- Adding your first project
Configuration is saved to ~/.remote-coder by default.
Alternative: Manual configuration (click to expand)
If you prefer to set up config files manually:
mkdir -p ~/.remote-coder
cd ~/.remote-coderCopy example files from the repo or download them:
# If you have the repo cloned:
./scripts/copy_configs.sh
# Or manually copy:
cp /path/to/remote-coder/.env.example .env
cp /path/to/remote-coder/config/projects.yaml.example projects.yaml
cp /path/to/remote-coder/config/agents.yaml agents.yamlThen edit .env and fill in your tokens. See the Slack App Setup and GitHub PAT Setup sections below for details.
Please :)
remote-coder
# or keep your Mac awake while it runs:
caffeinate -i remote-coderYou should see logs indicating that .env and the YAML files were loaded, Slack Socket Mode connected, and the daemon is listening for events. Built-in Slack thread commands include !use, !status, !review, !reload-projects, !setup, !end, !purge, and !help.
Remote Coder currently always uses ~/.remote-coder for configuration. To use configs from elsewhere, copy or sync them into ~/.remote-coder.
All agents are defined in agents.yaml. By default, all agents in that file are enabled.
You can limit which agents Remote Coder uses by setting the REMOTE_CODER_AGENTS environment variable (comma-separated list of agent names):
REMOTE_CODER_AGENTS=claude,codexRules:
- If
REMOTE_CODER_AGENTSis unset or empty, all agents fromagents.yamlare enabled. - If it is set, only the listed agents are loaded.
- If any name in
REMOTE_CODER_AGENTSdoes not exist inagents.yaml, Remote Coder fails fast on startup with a clear error message. - Make sure the agent names match CLIs you've installed and authenticated (see Prerequisites above).
Set this in your .env file or export it in your shell before running remote-coder.
Prerequisites: Slack workspace admin access (to create and install apps).
-
Visit api.slack.com/apps, create an app, and enable Socket Mode.
-
Example manifest:
{ "display_information": { "name": "Remote Coder" }, "settings": { "org_deploy_enabled": false, "socket_mode_enabled": true, "is_hosted": false, "token_rotation_enabled": false } } -
Add scopes your bot needs (minimum:
app_mentions:read,channels:history,channels:read,chat:write; addmessage.channelsif you want to capture every message in a channel without @-mentions). -
Under Event Subscriptions, turn it on, choose Socket Mode delivery, and subscribe to:
app_mention(always required so mentions work)message.channelsif you want to react to all channel traffic- Reinstall the app after adding scopes/events so Slack issues a token that matches the new permissions.
-
Install (or reinstall) the app to your workspace and copy:
- Bot User OAuth Token (
SLACK_BOT_TOKEN, looks likexoxb-...) - App-Level Token (
SLACK_APP_TOKEN, looks likexapp-1-...)
- Bot User OAuth Token (
-
Set
SLACK_ALLOWED_USER_IDS(comma-separated) to the Slack user IDs that can talk to the bot. You can find your user ID in your Slack profile.
To let the bot open/refresh pull requests and sync comments, it requires a GitHub token with access to the repositories you map in projects.yaml.
- Head to github.com/settings/tokens and create either:
- A fine-grained token scoped to the specific org/repo with
Contents: Read/WriteandPull requests: Read/Write, or - A classic token with the
reposcope (which already includes PR permissions).
- A fine-grained token scoped to the specific org/repo with
- Copy the token value into your
.envasGITHUB_TOKEN=ghp_.... - Keep the token local. Remote Coder only uses it when a workflow explicitly needs GitHub API access (e.g., syncing edits to a PR).
projects.yaml maps Slack channels to local git repositories. Each entry only needs a relative path (relative to base_dir), a default agent, and optional GitHub metadata:
base_dir: /home/you/code
projects:
remote-coder:
path: remote-coder
default_agent: codex
github:
owner: your-github-handle
repo: remote-coder
default_base_branch: mainagents.yaml lists the CLI commands Remote Coder can launch:
agents:
claude:
type: claude
command: ["claude", "--print", "--permission-mode", "acceptEdits", ...]
working_dir_mode: project
models:
default: sonnet
available: [opus, sonnet, haiku]Commands run once per Slack message, so make sure the CLI you specify supports non-interactive usage. When you want to add a new project or tweak an agent, edit the YAML directly and restart remote-coder.
Make sure you invite the bot to the channel with your project so that it can start listening for messages in that channel
!use <agent-id>– switch to a different coding agent for this session.!status– show the current agent, active model, and history count.!review– list unresolved GitHub review comments for the session's PR and immediately run the active agent to address them.!reload-projects– reload.env,projects.yaml, andagents.yamlafter running./scripts/copy_configs.sh.!setup– health-check your CLI authentications (inside the container or on bare metal).!end– end the current session (start a new Slack thread to reset state).!purge– cancel all running agent tasks and clear all sessions (useful for resetting daemon state without restarting).!help– show the available commands.
When an agent edits files in a session, Remote Coder creates (or reuses) a branch named remote-coder-<session-id>, commits the changes, pushes to origin, and opens/updates a pull request against the project’s default base branch. A link to the PR is posted in the Slack thread after every successful push so you can review progress immediately. Make sure each project points to a git repository with a clean working tree and a reachable origin, and that projects.yaml includes the repository’s GitHub metadata.
- Slack Socket Mode Docs: https://api.slack.com/apis/connections/socket
- Slack App Management: https://api.slack.com/apps
- PyGithub: https://pygithub.readthedocs.io/
- Using Gemini CLI is kinda slow for some reason. Recommending you use the actual paid stuff first until you hit the limits first like claude code and codex cli before using gemini. Just my opinion. Do what you want.