Slack helps people work together regardless of location or device. It connects groups, systems, and data under purposeful contexts, and it’s the application that has improved my working life most significantly.

Slack is a human-first operating system for connecting the next generation of business applications, allowing people to collaborate with data and systems, much like they do with each other. This is why we at Robots & Pencils created Beep Boop, a platform for building and hosting Slack integrations.

Today we are happy to share our most recent development: a brand new Beep Boop Slack bot. It allows you to manage projects, subscribe to notifications from any channel, and chat with our team from the comfort of your own Slack team.

The Beep Boop Slack Integration runs as a standard Beep Boop project and is built with Slapp, our open source node.js library. It uses the Events APIInteractive message buttons, Slash Commands, and a bot user.

We favor the Events API because it makes it easier to develop and deploy Slack integrations at scale. The socket based Realtime Messaging API has its advantages but imposes an impedance mismatch between the rest of the Slack platform, which is HTTP based.

With the new Beep Boop Slack app, we pushed the boundaries of what is possible, acceptable, and pleasing. We wanted to provide a balance between complexity and convenience for the user while gracefully conforming to Slack’s formatting and interaction guidelines.

There were seven key lessons and recommendations that guided our approach, thinking, and design decisions.

1. Stay out of the uncanny valley

The term “uncanny valley” was coined in 1970 by robotics professor Masahiro Mori. Mori postulated that as the human likeness of a robot increases, our familiarity and empathy for it increases as well, until a sharp inflection point where our empathy almost instantly turns into revulsion. The distance between the points of familiarity that are “barely human” and “fully human” is known as the uncanny valley.

Above: The uncanny valley, the proposed relation between the human likeness of an entity and the perceiver’s affinity for it.

Our new bot is decidedly inhuman. It doesn’t chatter, exchange pleasantries, or try to convince you it is intelligent. Instead it guides you down a predictable path.

2. Know who you are

A Slack app can be a robot, a sidekick, a lifeless notification deliverer, a set of syntactic commands, or an application. In fact, it could have multiple aspects. Regardless, it is important to define what it is and what it isn’t.

In our case, our new bot is decidedly inhuman. It doesn’t chatter, exchange pleasantries, or try to convince you it is intelligent. Instead it guides you down a predictable path. It is an “appbot” with personality consistent with our brand, but first and foremost users should identify with our Slack app as an application and not as a human-like robot. As an appbot, it is minimally conversational and exhibits application-like qualities.

3. Use buttons for navigation

Notice in the GIFs in this article that navigation is performed almost exclusively with buttons; with each button invocation, the previous message (aka view) is replaced with a new view. A back button at the bottom of each view takes you to the previous view. This simple ontology should be familiar to Beep Boop users.

Above: Buttons, buttons, and more buttons!

4. Mind historical relevance and take out the trash

Be very mindful of the “trash” you leave behind. It’s annoying when a human fills the stream with an endless tsunami of messages, but it is generally untenable when the messages are system generated. The love for your bot quickly turns cold and you are either sent to the attic (filtered to #bot-spam, e.g.) like Woody and Buzz in Toy Story 3 or even worse, shipped off to Sunnyside Daycare (uninstalled).

Above: Sunnyside Daycare was once a great place for bots to be played with until Lotso arrived.

Ask yourself: Would the message be useful in search results? Is it just noise? Does the sequence of conversation tell a story that should be retained? If a message has no historical value, then delete it or replace it if you can. For example, we may replace a message with a completely different view when navigating with buttons.

Above: Replacing the message with the next view.

Or we may replace it with a message that is contextually relevant.

Above: Indicating a selection for contextual relevance.

And sometimes it makes sense to remove the message entirely. For this we provide a “Dismiss” button, based on early feedback from users who said they wanted a “close” option, which makes sense since we are positioning our integration like an embedded app.

Above: You are the weakest message, goodbye.

5. Don’t forget about ephemeral messages

Use ephemeral messages judiciously. Ephemeral messages can be sent in response to a message action or a slash command and are only visible to the user who initiated the event. They are the perfect way to share information, like an error message in response to a user-initiated event, that’s valuable to a single user and not a group.

With Beep Boop we use ephemeral messages to reduce noise and keep private information private. When you browse your personal list of projects or lookup your account information, we can safely assume that you don’t want to share this information with anyone else. For this reason, we send the Beep Boop menu, which is initiated from the “/beepboop” slash command, as a ephemeral message.

Above: Ephemeral messages are only visible to one user.

If you subscribe a channel to a particular project, those messages are normal messages visible to anyone. We assume you subscribe a channel because the project is relevant to that cohort of people. In the future, we’ll provide a way for you to share some views (e.g., log history) with the channel by replacing the ephemeral message with a normal message.

6. Make notifications actionable

If there is a predictable action that may be performed in response to a notification, provide a button inline with the notification. For example, when a build fails for your Beep Boop project, you receive a build failure notification with a retry button. In truth, we wanted to provide an option on each notification to unsubscribe or quiet notifications, but the presence of buttons on each notification message felt too heavy.

Above: ’Cause if you liked it, then you shoulda put a button on it.

7. Act on behalf of each user

The first step to using the Beep Boop bot from Slack is to link a new or existing account. We map your identity in Slack (team Id + user Id) to your Beep Boop user and use your OAuth credentials for any derivative calls. In the above example, if you click retry on a failed build notification for a project you don’t have access to, you will receive an appropriate error response.

Above: Keeping things on the up and up.

Not all Slack integrations are created equal, so these recommendations that guided our thinking may not work perfectly for you. At a minimum I hope this sparks some creativity for your next project. For us, dog-fooding Beep Boop and Slapp to build this integration was incredibly valuable.

Above: Slack is a human-first operating system.

If you are interested in creating Slack integrations for your company to use, to share with any Slack team, to connect an existing product or service to Slack or just for fun, I hope you give Beep Boop, Slapp, and the Events API a try. And if you any need help, the Beep Boop and Robots & Pencils team is here to give you a boost.