Join us for office hours !


While Probot doesn't have an official extension API (yet), there are a handful of reusable utilities that have been extracted from existing apps.


probot-config is an extension for sharing configs between between repositories.

const getConfig = require('probot-config')

module.exports = robot => {
  robot.on('push', async context => {
    // Will look for 'test.yml' inside the '.github' folder
    const config = await getConfig(context, 'test.yml')

    context.log(config, 'Loaded config')

Use the _extends option in your configuration file to extend settings from another repository.

For example, given .github/test.yml:

_extends: probot-settings
# Override values from the extended config or define new values
name: myrepo

This configuration will be merged with the .github/test.yml file from the github-settings repository, which might look like this:

shared1: will be merged
shared2: will also be merged

Just put common configuration keys in a repository within your organization. Then reference this repository from config files with the same name.


probot-commands is an extension that adds slash commands to GitHub. Slash commands are lines that start with / in comments on Issues or Pull Requests that allow users to interact directly with your app.

For example, users could add labels from comments by typing /label in-progress.

const commands = require('probot-commands')

module.exports = robot => {
  // Type `/label foo, bar` in a comment box for an Issue or Pull Request
  commands(robot, 'label', (context, command) => {
    const labels = command.arguments.split(/, */)
    return context.github.issues.addLabels(context.issue({labels}))


probot-metadata is an extension that stores metadata on Issues and Pull Requests.

For example, here is a contrived app that stores the number of times that comments were edited in a discussion and comments with the edit count when the issue is closed.

const metadata = require('probot-metadata')

module.exports = robot => {
  robot.on(['issues.edited', 'issue_comment.edited'], async context => {
    const kv = await metadata(context)
    kv.set('edits', kv.get('edits') || 1)

  robot.on('issues.closed', async context => {
    const edits = await metadata(context).get('edits')
      body: `There were ${edits} edits to issues in this thread.`


probot-scheduler is an extension to trigger events on a periodic schedule. It triggers a schedule.repository event every hour for each repository it has access to.

const createScheduler = require('probot-scheduler')

module.exports = robot => {

  robot.on('schedule.repository', context => {
    // this event is triggered on an interval, which is 1 hr by default

Check out stale to see it in action.

Found a mistake or want to help improve this documentation? Suggest changes on GitHub

Get occasional updates on new apps & features.


with by @bkeepers

Code licensed ISC Docs licensed CC-BY-4.0