Home

Awesome

Build Status Stories in Ready

About

This is a web app for facilitating S'Ups (quick meetings) between the employees of a company.

A Standup is a regular meeting between the members of a specialized team to discuss their team's goals, and priorities for achieving those goals. A S'Up (short for standup) is instead an informal and interdisciplinary standup, where members discuss what's up with their own work, or just in general.

Why use the sup app to have S'ups?

S'Ups help form connections between colleagues that normally aren't nearby or working with each other, creating a lattice of connections throughout a whole un-fragmented company.

The interdisciplinary nature of the meetings often leads to creative conversations sparking ideas for new directions in research and product development. Remote workers especially appreciate S'up since it gives them a chance to have informal interactions with otherwise inaccessible members of the company, strengthening the sense of community.

This app passively generates fresh triads of company members to S'up every week. It does all the scheduling to make sure every member has a meeting with a coworker they are unlikely to have had a chance to chat casually with lately, and communicates this to everyone involved via email.

Before S'Up

Here is a graph of a sample company's employees connected together via their work team co-memberships. The graph has clear hubs, and the number of bonds per employee (node) is unequal throughout.

sample image of a company graph hi res here

After S'Up

Here is a graph of a sample company's employees connected together via their S'Up co-memberships after 6 weeks. The graph is distributed and clustering is starting to disappear. You can see employees who signed up for S'Up later (bottom right corner) have yet to be completely subsumed by the plane of spaghetti.

sample image of a company after 6 weeks of S'Up hi res here

App Experience Overview

S'up contains a homepage where new users can sign up, edit their name/email and group memberships, and also disable themselves from being included in S'ups in the case of a busy week.

Sup on the web gif

S'up sends emails on Sunday mornings with information about scheduled S'ups:

Sup sunday email pic

and then sends a followup email the Saturday after the work week to confirm that the members have met (which will prevent them from meeting again until they have met with everyone else in the company), and asks for feedback.

Sup on email gif

S'up member matching

S'ups follow a few rules:

Usage

Deployment

This is a rails app that can easily be deployed with heroku, so the instructions there can be followed. The only requirement before deploying is to set some environment variables for your own sup app.

Environment variables

This app uses the figaro gem, so it is recommended that you place all your environment variables in a application.yml file in the config directory of the app. The required environment variables are:

COMPANY_NAME: "Initech"
COMPANY_NAME_POSSESSIVE: "Initech's"
PRODUCTION_DOMAIN: "guarded-stream-9823.herokuapp.com"
SUP_USER_NAME: "username"
SUP_PASSWORD_HASH: "..."
SMTP_USER_NAME: "ilyakava@initech.com"
SMTP_PASSWORD: "lumberghrulz"
SMTP_DOMAIN: "guarded-stream-9823.herokuapp.com

You should put the app under SSL and restrict its access with a username/password.

require 'bcrypt'
BCrypt::Password.create('password')
 => "$2a$10$yKF3BYd1sbZNvandxGJg4.EsQcYd41UP1FJrs6PwrcA6gJ3rQIA8u"

An optional but recommended environment variable is:

COMPANY_MEMBER_EMAIL_REGEXP: "@initech|@inite\\.ch"

Another optional environment variable is:

ADMIN_EMAIL: "bill@initech.com"

This address will get weekly email reports of which meetings are scheduled, and what comments people are leaving when confirming their S'up.

Adding cron tasks (Heroku)

Once you've deployed to heroku, follow the instructions about heroku scheduler only in the "Installing the add-on" and "Scheduling jobs" sections. Then, after selecting your app in the heroku dashboard, and clicking on "Heroku Scheduler," and add the following three jobs:

TaskDyno SizeFrequencyLast RunNext Run
rake schedule_meetings1XDailynever13:00 UTC
rake trigger_weekly_email1XDailynever15:00 UTC
rake trigger_followup_email1XDailynever15:00 UTC
rake send_weekly_admin_email1XDailynever16:00 UTC

Although the least frequent running choice is "Daily" on heroku, these jobs will actually be run on Friday, Sunday, Saturday, and Sunday respectively (for info on why: look in ./lib/tasks/scheduler.rake).

With the configuration in the above table: S'ups are scheduled 8am EST on Friday, email invitations to S'ups are sent 10am EST on Sundays, S'up followups are sent 10am EST on Saturday, and the admin email is sent 11am on Sunday. This app will work fine without followup emails scheduled, but by responding to followup emails accurately, the quality of S'up matchings will be higher. The first two tasks are the bare minimum for the app to function.

Adding teams (Heroku)

Following the commented example in the seeds.rb file in the root directory, write some ruby code that will generate the teams at your company. Then run heroku run db:seed.

Member Signup

Visit your app (heroku open), and sign members of your company up, or link people to the site. Members will need to enter their name and email, and choose 1-5 work teams that they are a part of. These should be teams in which they are already a part of some formal standup, since no S'ups between members of the same work-team will be allowed.

Attend S'ups

Since each S'up contains 3 people, remember that unless your company has an exact multiple of 3 employees signed up, not everyone will be a part of a S'up each week. However, it is very unlikely for anyone to be left out of S'up two weeks in a row.

If things around the office get a bit hectic, any member can disable their participation in S'up via their member panel in the app.

Contributing and Reporting Bugs

Testing

Run rake fspec to exclude the slow specs that check the convergence of the pairing algorithm, and rake to run all tests (several minutes).

License

(c) Artsy, 2015 + Ilya Kavalerov

MIT