Developing an app

To develop a Probot app, you will first need a recent version of Node.js installed. Open a terminal and run node -v to verify that it is installed and is at least 8.3.0 or later. Otherwise, install the latest version.

Generating a new app

create-probot-app is the best way to start building a new app. It will generate a new app with everything you need to get started and run your app in production.

To get started, run:

npx create-probot-app my-first-app

(npx is available since npm 5.2. If you are using an older version of npm, follow these instructions)

This will ask you a series of questions about your app, which should look something like this:

Let's create a Probot app!
? App name: my-first-app
? Description of app: A 'Hello World' GitHub App built with Probot.
? Author's full name: Katie Horne
? Author's email address:
? GitHub user or org name: khorne3
? Repository name: my-first-app
? Which template would you like to use? (Use arrow keys)
❯ basic-js
  basic-ts (use this one for TypeScript support)

Finished scaffolding files!

Installing dependencies. This may take a few minutes...

Successfully created my-first-app.

Begin using your app with:
  cd my-first-app
  npm start

View your app's README for more usage instructions.

Visit the Probot docs:

Get help from the community:

Enjoy building your Probot app!

The most important files created are index.js, which is where the code for your app will go, and package.json, which makes the app a standard npm module.

Running the app locally

Now you’re ready to run the app on your local machine. Run npm run dev to start the server:

Note: If you’re building a TypeScript app, be sure to run npm run build first!

> testerino@1.0.0 dev /Users/hiimbex/Desktop/testerino
> nodemon

[nodemon] 1.18.4
[nodemon] to restart at any time, enter `rs`
[nodemon] watching: .env *.*
[nodemon] starting `npm start`

> testerino@1.0.0 start /Users/hiimbex/Desktop/testerino
> probot run ./index.js

01:57:22.365Z  INFO probot:

  Welcome to Probot! Go to http://localhost:3000 to get started.

01:57:22.428Z  INFO probot: Forwarding to http://localhost:3000/
01:57:22.431Z  INFO probot: Listening on http://localhost:3000
01:57:22.564Z  INFO probot: Connected

The dev script will start your app using nodemon, which will watch for any files changes in your local development environment and automatically restart the server.

Configuring a GitHub App

To automatically configure your GitHub App, follow these steps:

  1. Run the app locally by running npm run dev.
  2. Next follow instructions to visit localhost:3000 (or your custom Glitch URL).
  3. You should see something like this: screen shot 2018-09-25 at 10 01 28 pm
  4. Go ahead and click the Register a GitHub App button.
  5. Next, you’ll get to decide on an app name that isn’t already taken.
  6. After registering your GitHub App, you’ll be redirected to install the app on any repositories. At the same time, you can check your local .env and notice it will be populated with values GitHub sends us in the course of that redirect.
  7. Install the app on a test repository and try triggering a webhook to activate the bot!
  8. You’re all set! Head down to Debugging to learn more about developing your Probot App.

GitHub App Manifests–otherwise known as easy app creation–make it simple to generate all the settings necessary for a GitHub App. This process abstracts the Configuring a GitHub App section. You can learn more about how GitHub App Manifests work and how to change your settings for one via the GitHub Developer Docs.

Manually Configuring a GitHub App

If you created an App with a manifest, you can skip this section; your app is already configured! If you ever need to edit those settings, you can visit

To run your app in development, you will need to configure a GitHub App to deliver webhooks to your local machine.

  1. On your local machine, copy .env.example to .env in the same directory. We’re going to be changing a few things in this new file.
  2. Go to and click Start a new channel. Set WEBHOOK_PROXY_URL to the URL that you are redirected to.
  3. Create a new GitHub App with:
    • Webhook URL: Use the same WEBHOOK_PROXY_URL from the previous step.
    • Webhook Secret: development, or whatever you set for this in your .env file. (Note: For optimal security, Probot apps require this secret be set, even though it’s optional on GitHub.).
    • Permissions & events is located lower down the page and will depend on what data you want your app to have access to. Note: if, for example, you only enable issue events, you will not be able to listen on pull request webhooks with your app. However, for development, we recommend enabling everything.
  4. You must now set APP_ID in your .env to the ID of the app you just created. The App ID can be found in your app settings page here screen shot 2017-08-20 at 8 31 31 am
  5. Finally, generate and download a private key file (using the button seen in the image above), then move it to your project’s directory. As long as it’s in the root of your project, Probot will find it automatically regardless of the filename.

For more information about these and other available keys, head over to the environmental configuration documentation.

Installing the app on a repository

You’ll need to create a test repository and install your app by clicking the “Install” button on the settings page of your app, e.g.

Other available scripts

  • $ npm start to start your app without watching files.
  • $ npm run lint to lint your code using standard.


  1. Always run $ npm install and restart the server if package.json has changed.
  2. To turn on verbose logging, start the server by running: $ LOG_LEVEL=trace npm start

Alternate way of running a probot app

If you take a look to the npm start script, this is what it runs: probot run ./index.js. This is nice, but you sometimes need more control over how your Node.js application is executed. For example, if you want to use custom V8 flags, ts-node, etc. you need more flexibility. In those cases there’s a simple way of executing your probot application programmatically:

// main.js
const { Probot } = require('probot')
const app = require('./index.js')

// pass a probot app as a function

Now you can run main.js however you want.