Publisher interface for Brave Payments
Clone or download
corymcdonald Wordpress URL (#1534)
This answer on Stack Overflow says that even if you rename a plugin the url will stay the same.

Until we test brave-intl/brave-payments-verification#13 we can have the URLs be the previous ones
Latest commit 5dbd00b Jan 15, 2019
Type Name Latest commit message Commit time
Failed to load latest commit information.
.github Add brakeman to gemfile (#898) May 22, 2018
app Separate publisher notification from payout report generation (#1529) Jan 14, 2019
bin Remove the script that would have executed wkhtmltopdf (#1224) Oct 12, 2018
config Wordpress URL (#1534) Jan 15, 2019
db Multi-Channel mode for tipping banners (#1357) Dec 14, 2018
docs Add rate limiting and reCAPTCHA to resend_auth_email (#803) Apr 24, 2018
lib Rebrand from Brave Payments (#1519) Jan 10, 2019
log publishers model Oct 2, 2016
public Sweet error pages Oct 18, 2016
ssl release 2017-12-06 (#361) Dec 6, 2017
test Separate publisher notification from payout report generation (#1529) Jan 14, 2019
tmp publishers model Oct 2, 2016
vendor/assets Migrate to webpacker Jan 8, 2018
.babelrc Foundational PR for new UI (#1495) Jan 8, 2019
.gitignore Remove package-lock.json, and add .gitignore rule (#1512) Jan 8, 2019
.postcssrc.yml Migrate to webpacker Jan 8, 2018
.rubocop.yml revert rubocop so that no one else can see the lint Nov 15, 2018
.ruby-version Uplift to Ruby 2.4.5 (#1458) Jan 7, 2019
.stylelintignore Remove QUnit, Add Jest (#1443) Dec 18, 2018
.stylelintrc-jsx.json Foundational PR for new UI (#1495) Jan 8, 2019
.stylelintrc-scss.json Add javascript and scss lint (#1449) Dec 17, 2018
.travis.yml Menu to split channels (#1472) Dec 20, 2018
Dockerfile Uplift to Ruby 2.4.5 (#1458) Jan 7, 2019
Gemfile Foundational PR for new UI (#1495) Jan 8, 2019
Gemfile.lock Foundational PR for new UI (#1495) Jan 8, 2019
LICENSE Initial commit Sep 30, 2016
Procfile Use a separate sidekiq config for a dedicated process. Closes #1420 Dec 10, 2018 Give EnqueuePublishersForPayoutJob default arguments (#1493) Jan 2, 2019 Update (#1516) Jan 9, 2019
Rakefile rubocop setup Oct 4, 2016
base.yml Update docker compose set up to work with bat-ratios (#1522) Jan 10, 2019 rubocop setup Oct 4, 2016
docker-compose.yml Update docker compose set up to work with bat-ratios (#1522) Jan 10, 2019
package.json Foundational PR for new UI (#1495) Jan 8, 2019
tsconfig-jest.json Remove QUnit, Add Jest (#1443) Dec 18, 2018
tsconfig.json Add javascript and scss lint (#1449) Dec 17, 2018
tslint.json Foundational PR for new UI (#1495) Jan 8, 2019
yarn.lock Foundational PR for new UI (#1495) Jan 8, 2019

Build Status

🔧 Setup

Follow these steps to setup the App for This guide presumes you are using OSX and Homebrew.

  1. Install Ruby 2.4.5. For a Ruby version manager try rbenv. Follow the Installation section instructions. Once installed run rbenv install 2.4.5. Be sure to restart your terminal before continuing.

  2. Install Node 6.12.3 or greater: brew install node

  3. Install Postgresql 9.5+: brew install postgresql

    If you get the error psql: FATAL: role “postgres” does not exist. You'll need to create the /usr/local/opt/postgres/bin/createuser -s postgres

  4. Install Redis: brew install redis

  5. Install Ruby gems: gem install bundler foreman mailcatcher.

  6. Install Yarn for Node dependency management: brew install yarn --without-node

    Note: --without-node avoids installing Homebrew's version of Node, which is desirable if you are using nvm for Node version management.

  7. Install project dependencies

    • Ruby dependencies: bundle install
      • Possible error: Nokogiri, with libxml2. Try installing a system libxml2 with brew install libxml2 and then bundle config build.nokogiri --use-system-libraries then again bundle install.,.
    • Node dependencies: yarn --frozen-lockfile
  8. (Optional) Get an file from another developer which contains development-mode bash env exports and source that file. You can start developing without this, but some functionality may be limited.

  9. Install Rails: gem install rails Be sure to restart your terminal before continuing.

  10. Setup SSL as described below.


Local development of brave-intl uses HTTPS. This allow us to use web APIs such as U2F in development.

If you already have a key and certificate for the localhost domain place them in the ssl/ directory:


If you don't, you will need to generate certificates for this domain:

bundle exec rake ssl:generate

When you first visit the application in a browser you may need to add an exception to trust this self-signed certificate. Sometimes this is under an "advanced" or "proceed" link.

Note: If you're seeing SSL error, peer:, peer cert: , #<Puma::MiniSSL::SSLError: OpenSSL error: error:141F7065:SSL routines:final_key_share:no suitable key share - 337604709>

Please try changing your Gemfile to use the fixes documented in


  1. Start Postgres and Redis: brew services start redis postgresql
  2. Create and initialize the database:
rails db:create RAILS_ENV=development
rails db:migrate RAILS_ENV=development

Note: If you receive a fatal-role error, try running /usr/local/opt/postgres/bin/createuser -s postgres due to being installed from homebrew. Further documentation is here.

  1. Run Rails server and async worker: foreman start -f

  2. Visit https://localhost:3000

  3. To test email, run a local mail server with: mailcatcher

  4. To view the emails sent to your inbox visit: http://localhost:1080

API Setups

Google API Setup

Setup a google API project:

  • Login to your google account (dev), or the Brave google account (staging, production)
  • Go to
  • Select "Create Project" then "Create" to setup a new API project
  • Give the project a name such as "publishers-dev"
  • Select "+ Enable APIs and Services"
  • Enable "Google+ API" and "YouTube Data API v3"
  • Back at the console select Credentials, then select the "OAuth consent screen" sub tab
  • Fill in the details. For development you need the Product name, try "Publishers Dev (localhost)"
  • Then Select "Create credentials", then "OAuth client ID"
    • Application type is "Web application"
    • Name is "Publishers"
    • Authorized redirect URIs is http://localhost:3000/publishers/auth/google_oauth2/callback
    • select "Create"
  • Record the Client ID and Client secret and enter them in your Env variables
  • Back at the console select "Create credentials" and select API key. This will be used for youtube channel stats via the data api.
  • Record the API and enter it in your Env variables

You may need to wait up to 10 minutes for the changes to propagate.

These steps based on directions at the omniauth-google-oauth2 gem.

Twitch API Setup

Setup a twitch API project:

  • Login to your Twitch account (dev), or the Brave Twitch account (staging, production)
  • Go to
  • Select "Get Started" for "App"
  • Give the project a name such as "publishers-dev"
  • Give the app a name and application category.
  • Use the redirect URI https://localhost:3000/publishers/auth/register_twitch_channel/callback in development.
  • Create a Client ID and secret, saving each of them.
    • Update your env to include TWITCH_CLIENT_ID="your-app-id"
    • Update your env to include TWITCH_CLIENT_SECRET="your-app-secret"
  • Save the app

Twitter API Setup

  • Apply for a developer account at
  • Select "Create an App"
  • Give the app a name like "Brave Payments Dev"
  • Make sure "Enable Sign in with Twitter" is checked
  • Set the callback url to https://localhost:3000/publishers/auth/register_twitter_channel/callback. If it does not allow you to set localhost, use a place holder for now, and later add the correct callback url through instead.
  • Fill in the remaining information and hit "Create"
  • Navigate to your app settings -> permissions and ensure it is readonly and requests the user email
  • Regenerate your Consumer API keys
  • Update your env to include TWITCH_CLIENT_ID="your-api-key" and TWITTER_CLIENT_SECRET="your-api-secret-key"
  • Save


In order to test the rate limiting and captcha components you will need to setup an account with Google's reCAPTCHA. Instructions can be found at the reCAPTCHA gem repo. Add the api keys to your Env variables.

Local Eyeshade Setup

  1. Follow the setup instructions for bat-ledger
  2. Add export API_EYESHADE_BASE_URI="" to your secrets script
  3. Add export API_EYESHADE_KEY="00000000-0000-4000-0000-000000000000" to your secrets script

To stop using Eyeshade locally, set API_EYESHADE_BASE_URI="".



Configuration is set in config/secrets.yml via environment variables.

It might be useful to maintain a local bash script with a list of env vars. For an example see config/secrets.yml.

Automagic addon vars

Some variables are set automagically with Heroku addons:

  • MAILGUN_* - For sending emails.
  • NEW_RELIC_APP_NAME, NEW_RELIC_LICENSE_KEY - New Relic app monitoring.
  • REDIS_URL - For Sidekiq and rack-attack

Other vars

A few variables are not configured in secrets.yml: currently none


For Ruby we use rubocop to standardize our project.

To run simply open the project and run in the terminal


For Typescript/Stylesheets we use tslint and stylelint respectively.

To run simply open the project and run in the terminal

yarn lint



bin/rake test

We use capybara which runs selenium tests, which depends on chromium. If you don't installed, you'll get an error "can't find chrome binary". On debian you can install it like:

sudo apt-get install chromium

And on mac with:

brew cask install chromium

We also use ImageMagick to process user uploaded images. If you don't have it already, you might get an error "You must have ImageMagick or GraphicsMagick installed". You can install on mac with:

brew install imagemagick


We use jest for our javascript testing framework. You can run the tests through the following command.

yarn test

Running locally with docker-compose

First, install docker and docker compose.

Check out publishers.

In a sibling directory check out bat-ledger.

You can add any environment variables that need to be set by creating a .env file at the top of the repo. Docker compose will automatically load from this file when launching services.

e.g. you might have the following in .env:







If you wish to make modifications to the compose files you can place a file named docker-compose.override.yml at the top of the repo. For example you can expose ports on your system for the databases with this docker-compose.override.yml:

version: "2.1"

      - "27017:27017"
      - "6379:6379"
      - "5432:5432"

to start with docker build the app and eyeshade images

docker-compose build

and bring up the full stack

docker-compose up

Create the databases

docker-compose run app yarn install; docker-compose run app rake db:setup; docker-compose run eyeshade-worker sh -c "cd eyeshade && ./bin/"

Run Tests

Tests can be run on the container with

docker-compose run app rake test

Other one off commands can be run as above, but replacing rake test. Note this spawns a new container.


Debugging with byebug and pry can be done by attaching to the running process. First get the container id with docker ps

docker ps
CONTAINER ID        IMAGE                    COMMAND                  CREATED                  STATUS              PORTS                                            NAMES
234f116cd942        publishers_app           "foreman start --pro…"   Less than a second ago   Up 2 seconds>3000/tcp                           publishers_app_1
b592d489a8d3        redis                    "docker-entrypoint.s…"   15 minutes ago           Up 3 seconds        6379/tcp                                         publishers_redis_1
f1c86172def7        schickling/mailcatcher   "mailcatcher --no-qu…"   15 minutes ago           Up 2 seconds>1025/tcp,>1080/tcp   publishers_mailcatcher_1

Then attach to the container and you will hit your binding.pry breakpoints

docker attach 234f116cd942

To connect with a bash shell on a running container use:

docker exec -i -t 234f116cd942 /bin/bash