Bike!Bike! Website!
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Jonathan Rosenbaum 15ecc409b1 Corrected ofelia typo. 6 months ago
app Getting more detail about response from ReCaptcha v3 12 months ago
bin Ready to merge 9 years ago
config Corrects spelling mistake 1 year ago
db Adds the changes from bikebike/bikebike for tracked files that weren't committed to git. 3 years ago
doc adding setup notes for getting started with ubuntu 10 years ago
features Updated location cache 7 years ago
lib/tasks 2016 design 8 years ago
nbproject Some updates to translation engine, added dotenv but have not yet set it up. 10 years ago
public Replaced delayed job with sidekiq 8 years ago
script 2016 design 8 years ago
vendor/assets Replaced Pen with Quill and removed dead CSS rules 7 years ago
.coveralls.yml Bumped VERSION to 0.1.3 11 years ago
.gitattributes This successfully builds a working bikebike rails app with Docker! 3 years ago
.gitignore Ignore node_module & public/stylesheets 1 year ago
.rspec Some updates to translation engine, added dotenv but have not yet set it up. 10 years ago
.slugignore moved files to proper folder 11 years ago
.travis.yml Fix for travis 7 years ago Updated gems 11 years ago
Capfile Added capistrano to help speed up sass compilation 8 years ago
DB specs.txt Fixed some issues with registration 10 years ago
Dockerfile Modernizes docker-compose, add git-lfs to Dockerfile. 1 year ago
Gemfile This successfully builds a working bikebike rails app with Docker! 3 years ago
Gemfile.lock Adding important lock files to the reporsitory 1 year ago
Guardfile 2017 refactor 7 years ago
LICENSE Bumped VERSION to 0.1.3 11 years ago Improves ofelia documentation, changes job name for docker-compose.yml to test version. Comments out cantainer_name to avoid container conflicts with multiple instances. 1 year ago
Rakefile Asset fixes (#238) 7 years ago
VERSION Updated gems 11 years ago
bower.json The working basics 11 years ago
bumbleberry-admin.tar.gz Removed erroneous files added during earlier processing 1 year ago
bumbleberry-application.tar.gz Adds development mode, improves the assets, updates the README with helpful information! 3 years ago
bumbleberry-web-fonts.tar.gz Adds development mode, improves the assets, updates the README with helpful information! 3 years ago
caniuse.js Updates browserlist daily with a ofelia job, so that caniuse generates the newest browsers. 6 months ago
config.rb The working basics 11 years ago Bumped VERSION to 0.2.0 11 years ago Development improvements: Don't save temp containers, and recreate volumes by not making them external. 1 year ago
docker-compose.yml Corrected ofelia typo. 6 months ago This successfully builds a working bikebike rails app with Docker! 3 years ago
jpegoptim.exe The working basics 11 years ago
optipng.exe The working basics 11 years ago
package.json Updates browserlist daily with a ofelia job, so that caniuse generates the newest browsers. 6 months ago
pngquant.exe Fixed 404 and 403 errors 8 years ago
pnpm-lock.yaml Updates browserlist daily with a ofelia job, so that caniuse generates the newest browsers. 6 months ago


Environment Build Status
Development Development Build Status
Production It works with this Fork!

About this Fork

The Tech group for BikeBike!Everywhere! decided to utilize this conferencing/scheduling software for the next BikeBike.

This repository creates a test environment so that we can test/fix issues before manually committing them to the live site.

Instructions can be found in docker-compose.yml, and

Install git-lfs

This repository utilizes git-lfs. You will want git-lfs installed:

apt-get install git-lfs


git lfs pull

You can learn more about git-lfs commands at

About that letsencrypt network in docker-compose.yml

This network provides a nginx proxy and an automatic generation of letsencrypt certificates.

The bike_bike_advanced_environment file

This file allows you to insert custom environmental variables, but primarily so that ACME Companion can be utilized to automate the creation, renewal and use of SSL certificates for proxied Docker containers through the ACME protocol. This is useful to seamlessly handle the secure translation urls. The example variables below communicate to an available external acme (letsencrypt) network to properly setup this proxied environment.,,,,,,,,

This is an example docker-compose.yml file handling the letsencrypt network.

docker-compose.yml (acme-companion & nginx-proxy)
version: '3'

# LetsEncrypt 
# If you need a custome nginx.conf, remember to copy it over


    image: nginxproxy/acme-companion
    container_name: letsencrypt
    #  - nginx-proxy
      - certs:/etc/nginx/certs:rw
      - acme:/etc/
      - vhost:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - NGINX_PROXY_CONTAINER=nginx-proxy
    #network_mode: "bridge"
      driver: "json-file"
        max-size: "10m"
        max-file: "3"
    restart: always

    image: nginxproxy/nginx-proxy
    container_name: nginx-proxy
      - conf:/etc/nginx/conf.d
      - vhost:/etc/nginx/vhost.d
      - html:/usr/share/nginx/html
      - certs:/etc/nginx/certs:ro
      - /var/run/docker.sock:/tmp/docker.sock:ro
      - "80:80"
      - "443:443"
      driver: "json-file"
        max-size: "10m"
        max-file: "3"
    restart: always


    external: true    

Commonly used environmental variables in .env

RAILS_ENV={production | development | customized environment in config/environments}
PORT={usually 3000}
SMTP_ADDRESS={your SMTP server address}
SMTP_DOMAIN={The domain you want to link back in emails, usually the website itself, but not any translation subdomains}
SMTP_PORT={465 | ..}
SMTP_SSL={true | false}
ADMIN_EMAIL={administrator email address}
DEFAULT_URL={the website itself}

After successful installation

There isn't much to do until the first conference is created. But you will need an adminstrator to make that happen.

First create a user for yourself at /user . If you properly setup SMTP via docker, you will receive a confirmation email, which allows you to setup a session on your respective browser.

Then go to the database container (db), and utilizing psql, update your user.

UPDATE users SET role = 'administrator' WHERE firstname = 'Jonathan Rosenbaum';

Now go to /conferences , create your first conference, and the fun begins!

The commandline psql interacts with the database with 'strict' sql statements, so use single quotes around strings, not double quotes, and all should be good.

Here's a good link to bring you up to speed with the power of psql:

Job Scheduler for caniuse.js

Caniuse.js uses browserslist to query the caniuse-lite database. This is the substitute program for the now defunct Bumbleberry. Ofelia is used as an independent scheduler, and ofelia labels in services establish the job requirements.

docker-compose.yml for Ofelia job scheduler
# This service provides ofelia, which is a job scheduler (cron).
# There should be at least on job in one of the services to make this 
# meaningfull to run.
# It is accessible everywhere since it is bound to the docker socket.
# Cron jobs can be conveniently created with labels.
# When you add/change a cron job simply -
# docker compose restart

    container_name: ofelia
    image: mcuadros/ofelia:latest
    command: daemon --docker
    restart: always
      - /var/run/docker.sock:/var/run/docker.sock:ro
      driver: "json-file"
        max-size: "10m"
        max-file: "3"

Production and Development mode

You may easily switch between the production and development environment in the .env file.


One good reason for doing this is that some system administration tasks are handled differently in production. For instance, mail is delayed in production.

Realize you can always do things in the container .. the commands without docker-compose, or automate it all with a docker-compose script:

docker-compose exec bikebike /bin/bash

From production to development after changing .env

docker-compose down
docker-compose up -d
rake assets:clobber
rake assets:precompile

From development to production after changing .env

docker-compose down
docker-compose up -d
rake assets:clobber
rake assets:precompile
rake db:sessions:clear
docker-compose restart bikebike

From bikebike/bikebike

This is the repository for the Bike!Bike! website. It can be found in development at and in production at

Feel free to clone or fork the repository any time to start working on new features or fixes. To get help create an issue or contact Godwin: goodgodwin @ any time.

Screenshot of Bike!Bike!


Internal Gems

We will make a commitment to extract any functionality that makes sense to do so, into separate gems in order to share functionality with others, with our other projects (such as, and to enable easier collaboration amongst ourselves.

It is recommended that you at least use also clone bikecollectives_core into you workspace. To override the gem location execute:

bundle config local.bikecollectives_core PATH_TO/bikecollectives_core

Here is a list of the gems we have created so far, if you are a collaborator on this project you may need to become a collaborator on these gems as well. Don't hesitate to make a request, it won't be denied:

Bike Collectives Core

Bike Collectives Core is where models, migrations, and some common controllers and helpers live. This Gem is shared between Bike Collectives and Bike Collectives Workbench.

Lingua Franca

Lingua Franca provides an easy way to include translatable content and provides a user interface for translators to provide translations. See Translations for best practices on the Bike!Bike! website.


Bumbleberry provides cross-browser support with little effort and minimum file sizes. Basically it creates a different stylesheet for every known browser and only includes supported rules for each using information obtained from

Github Workflow

If you are a git wiz, feel free to adjust the steps below slightly, otherwise follow these steps until you are familiar enough to stray. What should remain constant is that we need to branch, code review, and merge with master.

  1. Before you start working on a new feature, start working on a new branch (alternatively you can fork): git checkout -b myname_new_feature
  2. Write your new feature
  3. Add tests and execute them using bundle exec i18n
  4. Make any adjustments, make sure you have included comments and abided other coding conventions
  5. Check your git status to make sure you are on the correct branch and have any new files to add: git status
  6. Add any new files using: git add [myfile]
  7. Commit your changes: git commit -am 'My commit message'
  8. Switch back to the development branch and pull the latest: git checkout master && git pull
  9. Switch back to your branch: git checkout myname_new_feature
  10. If there were any changes, rebase. This merges in the new code with your new code: git rebase -i origin/development
  11. Push your changes: git push origin myname_new_feature
  12. Make a pull request and wait for your code to be reviewed
  13. If any changes are required, make them commit your changes, and rebase again. This time you need to make sure that you squash your commits (makes sure you only add one commit in the end). Where you see your commit message, change 'pick' to 'fixup' or 'f'.
  14. Push your code again and repeat 12 and 13 until your code gets merged with development
  15. Once your code is in development it will be released to our development site, once new translations are added and the site is manually tested it will be moved to master and the production site

Deployment Process

Please note, we currently don't have this process set up, we're working to get here.

  1. Write code and get it pulled into master
  2. Your changes will be automatically be deployed to our preview site
  3. Your changes will be tested there, if tests fail deployers will be notified
  4. Once that deployment process completes and tests pass, translators will be notified if there are new translations
  5. Once translators have completed translations, translations will be committed to master and your changes will be deployed to production


Translating our site into multiple languages is a key part of opening it up to the world. When coding, never include any English text as in a string or Haml. Instead, we shall always use the underscore helper method _. The method takes a translation key and some optional parameters.

All translation is done in a collaborative, volunteer based system on the site itself, even the English text. If a user has sufficient permissions, the underscore method will produce highlighted text which can be edited directly by the user.

The method can be used as follows:

%p=_'basename.my_key', :paragraph

Assuming none of the keys map to translations, this will be rendered into the following HTML:

  Lorem ipsum dolor sit amet

  Curabitur non nulla sit amet nisl tempus convallis quis ac lectus. Vivamus magna justo, lacinia eget consectetur sed, convallis at tellus. Proin eget tortor risus. Donec sollicitudin molestie malesuada. Donec rutrum congue leo eget malesuada.

  click me

By default, the key will be translated using the last key part ('click me' in this example), however if a context is provided, some appropriate lorem ipsum text. Available contexts are:

  • title (alias: t): title text, a few words in upper case
  • word (alias: words, w): A word, if a second parameter is provided a numbr of words will be rendered (for example _'key',:w,3)
  • sentence (alias: sentences, s): A sentence or multiple sentence
  • paragraph (alias: p): A paragraph

If actual translations are not provided by the time the code hits production, fatals will occur.

Entering translations

Translations can be provided directly by editing en.yml but will also be directly using the workbench:

Screenshot of the Bike Collectives Workbench

Collecting translations

Translations, along with screenshots and HTML page captures are collected during testing so that the workbench will have up to date translations and context for each to make it easier for translators to provide relevant translations. To collect these translations yourself, execute rake i18n.

Testing Practices

Our focus will be on integration testing using Capybara. While testing the app records all translations that it finds, whether or not they exist, and which pages that they were found on.

Before commiting you shuold always run:

bundle exec rake cucumber:run


bundle exec rake i18n

The former is going to be faster but does not perform checks for untranslated content, it is recommneded that you run this regularily while developing while running the i18n check will ensure that you have not missed translations.

If you are creating any new content you will also want to add a new feature or scenario to ensure the new translations are picked up.