SkillAgentSearch skills...

Replbot

Slack/Discord bot for running interactive REPLs and shells from a chat.

Install / Use

/learn @binwiederhier/Replbot
About this skill

Quality Score

0/100

Supported Platforms

Universal

README

🤖 REPLbot

Release Go Reference Tests Go Report Card codecov Slack channel

REPLbot is a bot for Slack and Discord that allows you to control a REPL or shell from a chat. It comes with a few REPLs (Go 🥳, Java, NodeJS, PHP, Python, Ruby, Scala, Kotlin, C++, Ubuntu, Debian, Alpine, Arch Linux, Amazon Linux, CentOS & Fedora), but you can easily make or bring your own.

replbot demo

Why ...?

I thought it might be a fun way to collaboratively dabble with a REPL in a team. Yes, I could have gone for a terminal in a browser, but there's nothing like having it right there in Slack. Mainly I did it because it was fun though. 😄

How it works

I use tmux and the tmux capture-pane command to run most of the show. It's simple, but effective. In the first iteration I tried using a pseudo terminal (pty) directly, but with all the escape sequences and commands, it was getting kinda tiresome, and I was spending time with stuff that I didn't want to spend time with (though I learned a lot!). And tmux does its job so well.

The actual REPLs are just simple scripts (see script.d folder), so they could be anything you like. I highly recommend using Docker to provide somewhat of an isolation, though you'll probably still need to trust the people using the bot if you give them an entire REPL.

Screenshots & Videos

<table> <tr> <td><img src="assets/discord-scala-split.png" width="300"></td> <td><img src="assets/discord-ubuntu-htop-split.png" width="300"></td> <td><img src="assets/discord-cpp-channel.png" width="300"></td> </tr> <tr> <td>Scala, split mode (Discord)</td> <td>Ubuntu running `htop` (Discord)</td> <td>C++, channel mode (Discord)</td> </tr> <tr> <td><img src="assets/slack-ubuntu-cursor-train.gif" width="300"></td> <td><img src="assets/slack-ubuntu-custom-multiple.png" width="300"></td> <td></td> </tr> <tr> <td>Blinking cursors, choo choo 🚂 (Slack)</td> <td>Custom shells, multiple sessions (Slack)</td> <td></td> </tr> </table>

Usage

After installing REPLbot, you may use it by tagging @replbot in Slack/Discord. For the most part it should be pretty self-explanatory:

replbot mention

To start a session with the default settings, simply say @replbot java to start a Java REPL. There are a few advanced arguments you can use when starting a session.

REPL scripts

REPLbot can run more or less arbitrary scripts and interact with them -- they don't really have to be REPLs. Any interactive script is perfectly fine, whether it's a REPL or a Shell or even a game. By default, REPLbot ships with a few REPLs. To extend the REPLs you can run, simple add more scripts in the script-dir folder (see config.yml).

Here's a super simple example script:

#!/bin/sh
# Scripts are executed as "./script run <id>" to start the REPL, and as "./script kill <id>"
# to stop it. Not all scripts need the "kill" behavior, if they exit properly on SIGTERM.
case "$1" in
  run)
    while true; do
      echo -n "Enter name: "
      read name
      echo "Hello $name!"
    done 
    ;;
  *) ;;
esac

In all likelihood, you'll want more isolation by running REPLs as Docker containers. Here's the PHP REPL script that REPLbot ships with (not shortened):

#!/bin/sh
# REPLbot script to run a PHP REPL.
#
# Scripts are executed as "./script run <id>" to start the REPL,
# and as "./script kill <id>" to stop it.

DIR="$(cd -- "$(dirname "$0")" >/dev/null 2>&1 && pwd -P)"
case "$1" in
  run) docker run --rm --name "$2" -it php ;;
  kill) "$DIR"/helpers/docker-kill "$2" ;;
  *) echo "Syntax: $0 (run|kill) ID"; exit 1 ;;
esac

Session commands

When a session is started, you can get a list of available commands by typing !help (or !h). To exit a session at any point in time, type !exit (or !q).

replbot session help

Recording sessions

Sessions can be recorded using asciinema, and can even be automatically uploaded to either asciinema.org or your private asciinema-server (see install instructions).

After a session exits, the recording is then attached to chat as a ZIP file and optionally as a link to the asciinema server. This behavior can be controlled by the default-record and upload-recording option in the config.yml file, as well as the record/norecord option when starting a session.

Here's the asciinema.org link of the example I recorded, as well as the ZIP archive with the recording.

replbot session recording

Web terminal

Entering commands via Slack or Discord can be quite cumbersome, so REPLbot provides a web-based terminal (powered by the amazingly awesome ttyd). If enabled, a unique link is created for each session, which provides a read-only or writable web terminal.

replbot web terminal

This behavior can be controlled by the default-web option in the config.yml file, as well as the web/noweb option when starting a session. While a session is running, it can be toggled using the !web command.

replbot web terminal

Terminal sharing

You can share your local terminal window in Slack or Discord using the share feature. It's quite cool, although it's really got nothing to do with REPLs 🤷. It also has to be specifically configured in the config.yml file using the share-host option, since it needs direct communication between the client and REPLbot.

replbot terminal sharing

Control mode

You can specify if you want the session to be started in the main channel (channel), in a thread (thread), or in split mode (split) using both channel and thread. Split mode is the default because it is the cleanest to use: it'll use a thread for command input and the main channel to display the terminal.

replbot split mode

Terminal size

You can set the terminal window size when you start a session by using the keywords tiny (60x15), small (80x24), medium (100x30), and large (120x38). The default is small. You may also resize the terminal while the session is running using the !resize command.

replbot window size

Window mode

When starting a session, you can choose whether to trim empty space from the terminal session (trim), or whether to show the entire terminal window as it would appear in a terminal emulator (full). The default is full, as trim mode can get awkward when the terminal is expanded and the collapsed again.

replbot window mode

Installation

Please check out the releases page for binaries and deb/rpm packages.

Requirements:

  • A modern-ish Linux, preferably Ubuntu 18.04+, since that's what I develop on -- though it also runs on other distros.
  • tmux >= 2.6 is required, which is part of Ubuntu 18.04 (but surprisingly not part of Amazon Linux!)
  • docker for almost all scripts REPLbot ships with
  • asciinema if you'd like to record sessions
  • ttyd if you'd like to use the web terminal feature

Creating a REPLbot Slack app:
REPLbot requires a Slack "Classic App (bot)", because of its use of the real time messaging (RTM) API. To create a classic app and acquire a Slack bot token, follow these steps:

  1. Create a classic Slack app
  2. In the "App Home" section, add a "Legacy bot user"
  3. In the "OAuth & Permissions" section, click "Install to Workspace" (this may require workspace admin approval)
  4. Copy the "Bot User OAuth Token" starting with "xoxb-..."

Creating a REPLbot Discord app:

  1. Create a Discord app
  2. In the "Bot" section, click "Add Bot" and disable "Public Bot"
  3. In the "OAuth2" section, click "Add Redirect" and type a URL (even https://google.com is fine), select the scopes "bot" and "messages.read", and the permissions "public threads", "private thread", "send messages", "manage messages", "manage threads". Click "Save changes".
  4. Copy the OAuth2 URL and navigate to it in the browser and authorize the app.
  5. In the "Bot" section, copy the token and paste it here

Installing replbot:

View on GitHub
GitHub Stars212
CategoryDevelopment
Updated3mo ago
Forks11

Languages

Go

Security Score

97/100

Audited on Dec 22, 2025

No findings