Spoke is an open source text-distribution tool for organizations to mobilize supporters and members into action. Spoke allows you to upload phone numbers, customize scripts and assign volunteers to communicate with supporters while allowing organizations to manage the process.
Spoke was created by Saikat Chakrabarti and Sheena Pakanati, and is now maintained by MoveOn.org at https://github.com/MoveOnOrg/Spoke.
This repository is a branch of MoveOn/Spoke created by Politics Rewired, a small campaign tech consultancy created in 2019.
Due to a desire to develop more quickly, we did not maintain compatibility with MoveOn/Spoke, which means although this repository will be
a useful source of ideas, it may more work than is worth it to merge it back into MoveOn/Spoke, although we welcome any efforts towards
that goal. See HOWTO_MIGRATE_FROM_MOVEON_MAIN.md
- Install Postgres.
- Install the Node version listed under
enginesinpackage.json. NVM is one way to do this. npm installnpm install -g foremancp .env.example .env- If you want to use Postgres:
- In
.envsetDB_TYPE=pg. (Otherwise, you will use sqlite.) - Set
DB_PORT=5432, which is the default port for Postgres. - Create the spokedev database:
psql -c "create database spokedev;"
- In
- Create an Auth0 account. In your Auth0 account, go to Applications, click on
Default Appand then grab your Client ID, Client Secret, and your Auth0 domain (should look like xxx.auth0.com). Add those inside your.envfile (AUTH0_CLIENT_ID, AUTH0_CLIENT_SECRET, AUTH0_DOMAIN respectively). - Run
npm run devto create and populate the tables. - In your Auth0 app settings, add
http://localhost:3000/login-callback,http://localhost:3000andhttp://localhost:3000/logout-callbackto "Allowed Callback URLs", "Allowed Web Origins" and "Allowed Logout URLs" respectively. (If you get an error when logging in later about "OIDC", go to Advanced Settings section, and then OAuth, and turn off 'OIDC Conformant') - Add a new rule in Auth0:
function (user, context, callback) {
context.idToken["https://spoke/user_metadata"] = user.user_metadata;
callback(null, user, context);
}- If the application is still running from step 8, kill the process and re-run
npm run devto restart the app. Wait until you see both "Node app is running ..." and "webpack: Compiled successfully." before attempting to connect. (make sure environment variableJOBS_SAME_PROCESS=1) - Go to
http://localhost:3000to load the app. - As long as you leave
SUPPRESS_SELF_INVITE=blank and unset in your.envyou should be able to invite yourself from the homepage.- If you DO set that variable, then spoke will be invite-only and you'll need to generate an invite. Run, inside of a
psqlshell:
- If you DO set that variable, then spoke will be invite-only and you'll need to generate an invite. Run, inside of a
echo "INSERT INTO invite (hash,is_valid) VALUES ('abc', true);"
- Then use the generated key to visit an invite link, e.g.: http://localhost:3000/invite/abc. This should redirect you to the login screen. Use the "Sign Up" option to create your account.
- You should then be prompted to create an organization. Create it.
If you want to create an invite via the home page "Login and get started" link, make sure your SUPPRESS_SELF_INVITE variable is not set.
For development, you can set DEFAULT_SERVICE=fakeservice to skip using an SMS provider (Twilio or Nexmo) and insert the message directly into the database.
To simulate receiving a reply from a contact you can use the Send Replies utility: http://localhost:3000/admin/1/campaigns/1/send-replies, updating the app and campaign IDs as necessary.
Twilio
Twilio provides test credentials that will not charge your account as described in their documentation. You may use either your test credentials or your live keys by following the instructions here.
We deploy via https://github.com/assemble-main/spoke-terraform, which deploys one Elastic Beanstalk cluster and one Lambda function side- by-side, interacting with the same Aurora Postgresql Serverless database. We use a small proxy app (https://github.com/assemble-main/spoke-fly) built to run on https://fly.io to route traffic from the /admin UI to Elastic Beanstalk, and all other requests to Lambda. This let's Lambda deal with high throughput traffic (sending and receiving texts) and the long running servers on EBs can handle actions (such as uploading or exporting) that may exceed Lambda's limits.
Spoke is licensed under the MIT license.