Skip to content
Hacktoberfest - App to manage the annual open source challenge.
HTML Ruby CSS Other
Branch: master
Clone or download
johndbritton Merge pull request #441 from digitalocean/MattIPv4/show-gifted-stickers
Add new state to profile for showing the gifted sticker
Latest commit fc4e084 Nov 19, 2019
Type Name Latest commit message Commit time
Failed to load latest commit information.
.github Split CI test steps into dedicated workflows (#421) Nov 11, 2019
app Correct redemption URL Nov 19, 2019
bin excluding bin folder Aug 14, 2019
config Merge pull request #428 from digitalocean/branch-deploy Nov 18, 2019
db remove seed data Nov 12, 2019
lib Rename rake task Nov 14, 2019
log create rails app Aug 7, 2019
script Split CI test steps into dedicated workflows (#421) Nov 11, 2019
spec Update Segment stub in user_state_transition_segment_service_spec.rb Nov 18, 2019
storage create rails app Aug 7, 2019
tmp create rails app Aug 7, 2019
vendor/assets/javascripts Add dynamic graph w/ fake data (& fix stats box issues) Oct 28, 2019
.gitignore ignore `.env` files for all environments Oct 18, 2019
.rspec Update rspec configuration to run specs in random order Oct 9, 2019
.rubocop.yml Ignore our config/deploy.rb for rubocop Oct 18, 2019
.ruby-version Set ruby app version to 2.5.5 Sep 22, 2019 update token docs Oct 18, 2019
Brewfile Add redis to brewfile Oct 10, 2019 Add code of conduct Oct 15, 2019 Change wording Nov 6, 2019
Capfile Load our dotenv config first thing for capistrano Oct 17, 2019
Gemfile Missed part of hothix needed for DEV envs Nov 11, 2019
Gemfile.lock bundle update loofah Nov 8, 2019
Guardfile use single quoted strings Aug 14, 2019 Update LICENSE to reflect brand assets Nov 12, 2019 Change checklist header to Requirements to merge Nov 6, 2019 Merge pull request #432 from digitalocean/url-typo Nov 12, 2019
Rakefile use single quoted strings Aug 14, 2019 adding frozen_string_literal: true everywhere needed Aug 14, 2019
package.json create rails app Aug 7, 2019
yarn.lock Commit yarn.lock file Sep 22, 2019



  • Static pages
  • Airtable backed events and FAQs
  • Issue discovery by language
  • Log in with GitHub
  • Multi-step registration
  • Pull request timeline
  • Challenge completion validation
  • Prize distribution


There are three major components that are entirely separate from one another:

  1. Issue discovery - Fetches issues from GitHub with the label hacktoberfest and persists them in the database to be featured on the homepage based on a randomized quality filter.

  2. Content pages - Primarily static pages that are supplemented with dynamic data from Airtable.

  3. Participant management - Allows users to register to participate in Hacktoberfest, tracks user progress, and distributes prizes based on availability. The majority of the business logic is implemented with a state machine, validating that various conditions are met before a user may be transitioned to a new state and with certain actions being triggered on successful state transitions.

Getting Started

These instructions will get you a copy of the project up and running on your local machine for development and testing purposes.


  • Ensure your os is the latest MacOS

  • Have brew installed (Run the following command in a mac os terminal to install):

/usr/bin/ruby -e "$(curl -fsSL"

Application Setup

  1. Install and Setup
  2. Setup Oauth Token
  3. Configure remaining environment variales
  4. Create first user
  5. Import Projects


Clone the repo:

git clone

In your local repository, run script/setup, which will install all necessary dependencies for you:


Setup Oauth Token

Hacktoberfest uses GITHUB_CLIENT_ID & GITHUB_CLIENT_SECRET variables to configure OmniAuth.

This allows users to be authorized for Hacktoberfest via Github.

For this, you will have to create a Github OAuth App (

Be sure your OAuth app is configured with the following URLs

Oauth Config

Homepage URL: http://localhost:3000
Authorization callback URL: http://localhost:3000/auth/github/callback

The Client ID and Client Secret are right above this configuration. Use them to set the following ENV variables:


ENV Variables

Start Date & End Date

Hacktoberfest is officially active from October 1st - October 31st (in any timezone)

The app can be in three different states:

  • Pre-launch
    • Users can sign up and all pages are reachable, but the profile page is not yet tracking pull requests
  • Active
    • All pages are active and the profile is tracking PRs
  • Finished
    • Hacktoberfest has declared its winners

So your dates can look something like this if you're developing in October 2019 and you want the app in the Active state.

 START_DATE="2019-09-30 10:00:00 UTC"
 END_DATE="2019-11-01 12:00:00 UTC"

(These timestamps account for the furthest positive UTC offset (+14 in Kiribati), where they’ll see 1st Oct 00:00 on 30th Sept 10:00 UTC and the furthest negative UTC offset (-12 in the US Outlying Islands), where they’ll see 1st Nov 00:00 on 1st Nov 12:00 UTC).

If you want to work on the app in the Pre-Launch state, set the start date to a future date. If you want to work on the app in the Finished state, set the end date to a past date.

Airtable API Key & Airtable App ID

Hacktoberfest uses Airtable as a CMS to hold useful data such as:

  • Events
  • FAQ
  • Spam Repositories

For your convenience we have created two options:

Create an Airtable Database:

We created a read-only copy of what the Airtable database should look like.

With this you can create your own schema by following this format: (

After you’ve created and configured the schema of an Airtable base from the graphical interface,

your Airtable base will provide its own API to create, read, update, and destroy records.

You should update these variables accordingly in your .env

Use Placeholder Airtable Service

If configuring your own Airtable schema does not sound like your cup of tea - don't fret.

We have created placeholder service objects that will render test data if your Airtable keys are not set.

This service will be used as default.

You can find this service in app/services/airtable_placehoder_service.rb

Create First User

  1. Spin up the server by running script/server

  2. Now, open your browser of choice and visit localhost:3000

  3. Click START HACKING on the top right of the navigation bar

start hacking

  1. Log in with your github account

  2. Agree to the terms and conditions and continue

Import Projects

This task imports repositories to the hacktoberfest app(these are displayed on the homepage). If you don't run the task, there simply won't be any repositories on the homepage aside from the hard-coded climate change repos.

  1. Spin up sidekiq:
  1. In a separate terminal window, run the import script:
bin/rails github:fetch_popular_languages_projects

Running the project

There are two commands you will need for running the project.

First, spin up the rails server locally:


If you will be running any background jobs through sidekiq, run the following command in a separate terminal window from script/server which will spin up both redis and sidekiq:



Hacktoberfest is open source and we welcome contributions. See for more info.

Code of Conduct

This project uses the Contributor Covenant Code of Conduct. See for more info.


The Hacktoberfest app is built and maintained for DigitalOcean by developers from


Licensed under the MIT License. The full license text is available in

You can’t perform that action at this time.