Deploy WordPress theme code to your server with git push

Here’s the setup. You’re a good little developer and you’re building your latest WordPress Theme using git to track your changes. You’ve got a local environment where you develop and test edits to your theme file but you don’t have a good way to push those changes to the server. Yesterday I was doing my development using git but using FTP to send updated files to the server, today I simply use git push. Here’s how: 

First I’d like to thank Philip Brown for this tutorial which got me started and this GIST by noelboss which also helped.


I assume you know a bit about git, aren’t confused by the term SSH, and can work on the command line. What we’ll be doing here is setting up a remote repository on your server, setting it as a remote on your local git project, and configuring a git “hook” to move files to a particular directory on your server when you use git push.

When we are done your workflow will look like this:

git commit -m "latest changes"
git push dev-server master

Then your remote server will have the latest changes! Here are the steps:

  • Create a folder on your server where you’ll keep “bare” git repositories
  • Init a “bare” repository for your project
  • Configure the post-receive git hook to send the latest files to the deployment directory

For the purpose of this example let’s assume the project I’m working on is call “goodgoodproject” and it’s a wordpress theme. I have a local development environment I’ll refer to as “local” and a server that I’ll refer to as “remote”.

If you run into problems, I’ve added a “gotcha” section at the bottom.

Set up the remote server

First thing you’ll need to do is get SSH access to your server. Once you have that I would recommend setting up your ~/.ssh/config it saves so much time, read more about that here. I’ll use normal syntax throughout the tutorial though.

Connect to your server, it would look something like this:


If you use a port that command might look like this:

ssh -p 22000

Once you’re on your server create a folder in your home directory where your git repositories will live, I called my folder git/ but you could call it anything. We’ll make a empty directory using the mkdir (make directory) command.

mkdir git

Now we want to make a repository for the “goodgoodproject”, let’s change directories using cd (change directory) command.

cd git

This leaves us in our new folder at ~/git/. Next we will use the git init command to initialize a new git repository, but pay attention to what I do here:

git init --bare goodgoodproject.git

I’m initializing a “bare” repository, this means that there aren’t working files just the bare essentials that make up a git repo. I’ve also added goodgoodproject.git to the end, this tells git to initialize a bare repository in a directory of that name. I use the dot git ending just so I can indicate that this directory contains a git repo, you can names yours anything.

Create your deployment directory

This is the directory (on your remote server) where you want your code to end up. In our example I’m working on a WordPress theme called goodgoodproject. So I want it to be in the wp-content/themes/ folder in my web directory on my remote server. Your server might be different so be aware of where you want to write your files! My public html file is where I’ve install WordPress so to create my deployment directory I’m going to use the make directory command like so:

mkdir ~/public_html/wp-content/themes/goodgoodproject

Now there is an empty folder where the files from my git repo will be placed when I deploy them from my local machine!

Setup the post-receive hook

Git has these “hooks” which allow you do perform special action based on actions taken by or upon the git repo. The post-receive hook is activated when git push is done on the repo. This will become more clear as we go on.

First let’s change directory to the hooks folder of our new repository on our remote server.

cd ~/git/goodgoodproject.git/hooks

We are going to create a file in this directory called “post-receive” and put some content in it. To do this we simply have to open the file with a text editor from the command line. I like using nano but you could use vim or anything else. nano is the program on my server (and most UNIX servers) that allows me to edit text, so we’ll use this command:

nano post-receive

We are now in the nano program, it should be mostly black, no text on the inside. We are going to write this simple little sh script. I’ve added comments after # hashtags, these aren’t read by the script, they are for your reference. Except for the first line, the #!/bin/sh is called a hashbang, it tells the computer how to run the following file.

# the target is the deployment directory we created earlier 
# the GIT_DIR is the directory where our git repo we made is
# this is the command we want to run when this hook is fired
git --work-tree=$TARGET --git-dir=$GIT_DIR checkout -f
# finally anything we echo will show up as a message on our local machine when we push to our server!
echo "latest files moved to $TARGET"

A quick note, the $HOME variable is the same as ~ it expands to the home directory of the user. The above code is for a sh script, or shell script. This means that when the post-receive hook files we are simply running a shell script on the server, this means you could do loads of cool stuff when you push to the repo. Right now we are simply running the following command:

git --work-tree=$TARGET --git-dir=$GIT_DIR checkout -f

This is simply using the git checkout -f (force checkout) to put files from the git-dir HEAD into the work-tree path. I’ve used the variable $TARGET and $GIT_DIR to make the code a bit more readable and easy to edit.

Nano editor

Now we save our file. With nano you will press Ctrl+V it will ask you if you want to write, press y then return. Finally we need to make sure our new file can be executed! We are going to run the chmod or Change Mode command on our new file and set it so it can be executed.

chmod +x post-receive

That’s it, now we are ready to go back to our local environment.

Setup the local git repo

I’ll assume you’ve already got your local git repo set up, navigate to that folder. We are going to add a remote repository! From our git repo on our local machine we are adding a remote named server you can, however, name it what ever makes sense to you!

git remote add server ssh://

This looks a bit complicated, let’s break it down. The first part is a normal git command to add a remote repo, you’ve probably done this with a service like, that’s the git remote add server part.

Let’s look now at the remote url we are using. It starts with ssh:// this simply tells git to use SSH as the protocol for connecting to the server. Next comes the username this is what ever your SSH account’s user name is. Then we have, typically this is the server’s web address, but it might be the IP address. Followed by :22000, this is the port, sometimes you need a port, sometimes you don’t, I just wanted to make sure you knew what it looked like. After that we have /git/goodgoodproject.git you should recognize this as the path to the git folder you initialized earlier!

Because I use an ssh config alias my remote url is much easier:

git remote add server goodgoodwork:git/goodgoodproject.git

Just remember that you need a colon between the SSH address and the path to your remote git repo.

Great, now the local repo has a new remote called server. All you’ve got to do now is push to it!

git push server master

This will push the master branch to the server url! Once it lands on the server a program called git-receive-pack will trip the post-receive hook and fire the shell script to add the files to our deployment directory!


There are a few places where things could go awry, let’s look at them:

git-receive-pack: command not found

You do your git push from the local machine and get the following error:

bash: git-receive-pack: command not found
fatal: Could not read from remote repository.

This means that the git-receive-pack command couldn’t be found on the remote server. I use Namecheap hosting (and so should you) which for what ever reason do not add this command to the PATH by default. They provide a simple fix where you add the folder where 3rd party programs live on their server to your PATH file via .bashrc file. I won’t go into that, but you should be able to figure out a solution to your environment based on this.

You need to test if git push works

When I was setting this up I kept running into the problem where I’d do a git push, something wouldn’t work, I’d fiddle around on the server then want to test again but when I did another git push I’d get:

“Everything up-to-date”

There was an easy way to get around this, just add a dummpy commit:

git commit --allow-empty -m 'push to execute post-receive'

It adds useless commits to your history, but who’s paying that any mind?


I hope you found this helpful, if you learn of any more gotcha’s I’ll add them. I would love to hear how other people use this and other hooks.

Oh yeah! I also wrote a little bash script that you can put on your server to generate these git repos with ease.

Opting into collaboration with Good Good Work

Relationships are built on mutually understood agreements. More often than not, these agreements are based on mutually implicit understandings of common terms. Employee, best friend, peer, co-worker, manager, president, CFO, etc. all have implicit meanings which we assume are commonly understood. In my experience, we can often trace problems in relationships back to misalignment in these implicit understandings. Our expectations of another person do not align with what they believe is expected of them when our agreement is only as deep as a single word like “client” or “consultant.” At the end of the day each of us has our own unique understanding of these words.

At Good Good Work we strive to make the implicit explicit. We also strive to be transparent. To that end, I’m going to dig a little deeper into how we engage with clients.

The Master Service Agreement

From Wikipedia:

“A master service agreement is a contract reached between parties, in which the parties agree to most of the terms that will govern future transactions or future agreements.”

Download the template here

We see the MSA as the opening of a relationship with a group we are going to do work for. In fact, before we do any work for a group, we require that they sign an MSA. Typically, the MSA is followed by a Statement of Work (SOW), which defines the scope of a project. The MSA acts as a foundation for the relationship while the SOW defines very specific acts. Legally speaking, the SOW supersedes the MSA whenever they are in conflict. The MSA “catches” anything that isn’t covered by a SOW. This allows us to create Statements of Work that are tidy and precise.

We break our MSA up into a few sections:

  • Preamble
  • Rate
  • Legal Requirements
  • Cultural Norms
  • Client Cultural Norms

The preamble and legal requirements aren’t really interesting; you’ve probably seen this kind of stuff in many agreements and it’s thoroughly covered online, and you really should talk with a lawyer about this kind of stuff anyway.

We define the rate  as a means to set a standard hourly rate for any work that falls outside of a Statement of Work. This allows us to do little things for our clients without having to create a whole new SOW. For instance, we were asked to do a discovery recently for a client, but quickly found out that they had an emergency with their server. Due to a little bit of technological malpractice on the part of a former consultant, they were 200% over their server space limit and were about to be charged some $700 by their hosting company. We were able to swoop in and save the day because we had the MSA already in place to account for this kind of out-of-scope work.

This might seem small or petty, but we can avoid uncomfortable situations because we are explicit like this. Having a Master Service Agreement allows us to do work without putting us or the client at risk.

Cultural Norms

What I’m really proud of here is our cultural norms section. This is something that Katie developed after years of working on her own. She developed an arsenal of legalese to protect her against bad clients who stiffed her or stole her work. In spite of that, she found that there were practices some clients would engage in that couldn’t be curbed through legal language. What it came down to was expectations and our misalignment around them. For example:

[9:45 pm] Client: “Hey I’ve got an urgent request, can you do this now?!”

This is a text message we’ve gotten far too often. The work day is over and we are trying to maintain a healthy work/life balance when an urgent request comes in. This signals different expectations. The client expects people to be on call, perhaps because they are on call (for whatever reason) at night. It’s a minor thing but again, this is about setting expectations so everyone can be happy. We cover this exact scenario in the maintain professional boundaries section of our cultural norms:

As it turns out, our Clients are pretty great! We love to socialize and get to know them on a personal level. We’re all about happy hours and hikes instead of dumping catch-up and hang-out time into meetings. One-on-one time shouldn’t cost money. We also like to keep work inside standard US business hours (10:00-18:00 eastern time, Monday-Friday). If we get text messages [see documentation]—or emails after hours—it’s 99% likely we won’t respond. But we’ll certainly get back to you the next time we’re in the office.

This gives us the power to say “no” and mean it. We’ve set a boundary and now it’s just a matter of pointing to the document everyone signed and saying “nope sorry can’t do that, we agreed.” This might seem trivial, but consider the power dynamic of someone who controls your livelihood making a demand like that.

Beyond being able to say no with confidence, it also supports our own development of healthy work habits. I’m constantly reminded of this agreement, that I have with all of my clients, when an email pops up on my phone while I’m out with friends. Not only do I have no obligation to look at it, I’m actually incentivised not to respond lest I break my own agreement!

The Client’s Cultural Norms

We provide space for our clients to add their own cultural norms too. We want to know what they expect and how they work. We haven’t yet actually tested this part of our document with any clients, so I can’t say how well this works. If you want to try it out with us, just book a consult here.

What I do know is that this little bit of work upfront can save a lot of heartache down the road.

The post Opting into collaboration with Good Good Work appeared first on Good Good Work.

Introducing Jason Wiener’s new website

When Katie and I set off to create Good Good Work, before we even had a name, we were looking for legal advice. We wanted to start a social enterprise that was prefigurative, legally sound, and reflected our radical values. Katie and Jason had been moving in similar circles in Colorado for a while (most specifically, platform cooperativism) and his name kept popping up. It didn’t take us long to realize that we’d be great collaborators.

We decided to work with him to design our business, you know, the one that eventually evolved into the Good Good Work Co-op. Our relationship was built on mutual aid and in-kind trade. As he set up our business we began working on his website, which we all felt didn’t express his professionalism, skill, and leading edge practice. 

Here’s the home page of the old site.

A new Vision

The first step in refreshing a website is taking stock of what’s there and envisioning what could be there, or what’s missing. Jason and his team had a lot of ideas for what they wanted the site to be. We sat down with them over multiple meetings and determined what their vision for the site was long term. Through this process we also began mapping out the site, it’s pages and content. This was a process of looking at what was on the site and determining how that existing content would translate into the new design. This was also a process of determining a road map towards the greater vision for the site.

The bigger picture, longer term vision for Jason’s site is to have a place online that supports the cooperative movement. Jason and his team are dedicated to promoting and facilitating change where it’s most needed. Their work is fully inline with our work in that way. If we support Jason’s team, we’re supporting better legal standards for the folks out there doing good work.

Our job is often taking a vision, in this case Jason’s vision for a dynamic interlinked resource hub, and subtracting until we find a starting point from which we can begin to build that vision. This “version 1” is a lot like base camp at the foot of a mountain. We are aiming for the top, but we need to start somewhere (plus we want to launch something sooner than waiting for it to be perfect later).

Distributing project management

To accomplish and track this we set up a content tracking spreadsheet which determined the pages, their content, and the current status of those pages’ progress. We then split them into V1 and V2. Ideas that were out of scope for V1 were recorded for V2. We (almost) always build a content tracking sheet for our projects. It helps us in a few ways:

  • it keeps everything in one place
  • it allows us to work asynchronously
  • it sits inside Google Drive so we never have to worry about project management software and learning (or paying for) new systems
  • it gives team members the authority to change things on their own as needed
  • it reduces the stress on project leads by distributing knowledge

This process allowed us to stay focused on building something that we could launch in the short term while tracking our larger goals.


Style Guide

Once we understood what we were building it was time to define a style guide which we would follow when designing the website. This included colors, website features, and typographic treatments.

This became the literal guide to visually redesigning the website. Home page mockups were made to get a sense of how elements might appear together on a page, and once approved we began to develop the WordPress theme. We used Theme Foundry’s amazing Make theme for our base.

A note on branding

Our aim in branding is to re-establish what we mean by “brand”. It’s less about sales, and it’s not just the logo and color palette. A brand is about the total experience people have with you and your company/group. It gets into your norms and language and the photographs you choose to represent you. It’s about how you treat people and how they feel when they walk away from an experience with you. We covered some of this in the brand guide and some of this in our conversations with Jason and Steve.

Check out some of the home page mockups from the first design pass:

jason wiener site mockups jason wiener site mockups jason wiener site mockups

Pro tip: We love using Make. Many of our clients come to us with WordPress messes on their hands. Often the Visual Composer and a bunch of other plugins have been installed and are either in conflict, are soon to be in conflict, or are unsafe because they’re out of date and updating their plugins would mean creating a conflict. Make has a lightweight and flexible page builder that we adore but avoids all the messy code conflicts.


Jason really wanted to have some new photographs for his site and his business. At some point he reached out to us to find a good photographer (Katie was a photographer in a former life) who could capture his professional approachable brand. We set him up with a few folks and he chose Jonathan Galbreath of Brightly Creative. Jason’s team and he seemed to really hit it off and the pictures are the proof.

Jason Wiener, international man of cooperation  Steve Kelton, legal aficionado extraordinaire

Putting it all together

As the content was being generated, edited, and adapted from the old site we were also developing the WordPress theme on a development server. Our copywriting and editing team consulted with the Jason and his team on their content, our designers created mockups and style guides, and the developers turned it all into code. We were able to rapidly develop the site in parallel through cycles of internal communication. Content would update layouts, layouts would change design, and design would move theme code in different directions. We tracked these changes through Gitlab’s issue tracker and our content spreadsheet.

In the end we were able to deliver a highly polished refresh to a stale website. You can see the new site over at

Thank you

A big thanks to Jason and Steve, and our own internal team of talented Good Good Workers for making this project a huge success! We’re looking forward to continuing our relationship with Jason’s firm as they develop more resources for the cooperative community and make legal services accessible for the rest of us.

The post Introducing Jason Wiener’s new website appeared first on Good Good Work.

Platform Cooperativism Conference: A Download

This past weekend I went to The People’s Disruption: Platform Co-ops for Global Challenges what follows is a download of my notes from the weekend. There were loads of great speakers and the organizers did a great job of centering voices that normally aren’t visible. I went to the first Platform Co-op conference in 2015 and the growth and maturing of the community and movement is inspiring. Get ready for a non-linear dump of links and information!  First off, you can view archived livestream of the whole event here.

Zebras fix what unicorns break

Learned about Zebras Unite and their conference Dazzle Con (Katie will be there). This movement came out of a great think piece called Sex and Startups and has turned into a movement. Basically they are promoting funding more feminine business practices. Here’s an image from that they shared:

This platform helps organize workers in legacy industry to build and exercise power.

Open Collective

This platform helps groups skip the incorporation step and just start transparently managing and collecting money.

“How can your idealism be corrupted?”

Co-ops for a better world


“Co-op are lacking the tools to scale democracy”

22% of freelancers get work via platforms

On the topic of platforms…

“How do we build trust with culturally defuse people?”

Something we are thinking about here at Good Good Work.

National Cooperative Business Association

Co-ops aren’t new, they are a foundation of America:

42 million people get their electricity from co-ops.

Next Century Cities

Like the electricity co-ops but for broadband. Just look at RS Fiber.

Data Farmers

A coop for sharing and owning data from farms.

This book!


“Economic power controls political power”

Another book: Change Here Now

Oh, did you know these folks were a co-op?

ESOP loans

Joseph Blasi talked about ESPO loans, a way to get credit to buy an asset and have that assets profits pay back the loan. Co-ops can use credit to buy companies. I don’t get it but I like the idea!

The crown jewel of the platform coop movement,

Arcade City

Peer to peer ridesharing.

“Financial institutions are platform monopolies”

Modo Car Share

20 years of sharing cars in Vancouver.

Real Patient Insights.


National Domestic Workers Alliance helps support domestic workers.

“The [current] system is designed to make us fail”


Decentralized Blockchain-based Organizations for Bootstrapping the Collaborative Economy.

A mastodon micro blogging community server run as a platform coop.


The bHive Cooperative is a community owned person-to-person sharing economy platform being developed for Bendigo by a team of five local entrepreneurs. bHive is the future of work.

“Make choices of least regret”




A cooperative that support freelancers, something we might want to model Good Good Work after… Smart takes care of the paper work and mutualizes costs.

Cooperativism is NOT new, it is a strategy of oppressed people.


We have HUGE purchasing power

The government is the #1 buyer of technology, let’s get them to prioritize buying from co-ops.

Universal Basic Assets

Income comes from assets, beyond income people need assets.

Read more about the idea

Holo Chain

Sweet sweet blockchain!


More blockchain goodness.


The post Platform Cooperativism Conference: A Download appeared first on Good Good Work.

Fractals: Considerations for More Effective Change-Making

Last month was the 6 year anniversary of #OCCUPYWALLST, a political movement in the US that needs no introduction. September 17th, 2011 was a pivotal point in my life. It was the day I started down a road divergent from the status quo, the day I left the confused world of early 20’s “adulting” and joined The Movement. It brings hope of a world arranged in such a way that poverty is impossible and extractive ecocide is not the basis of economic activity.
It took me three years to begin to grasp a very important lesson that The Movement demanded I learn.

Photo by Steven Diaz on Unsplash

“Change must start from within”

It’s almost cheesy in its simplicity. But this was such a profound realization that I recall the exact moment it truly stuck. Sitting on a low wall, looking over the East River on September 17, 2013, I realized that change starts within me. This is why a protest that seemed to be about big banks and income inequality spent so much time talking about systemic racism. It’s why I was constantly being told to “check my privilege,” why I was told to examine my bias. The systems that created the economic crisis of gross inequality didn’t come from nowhere; they came from people just like me. People who hold within themselves the schematics of oppressive systems. It is through people that these horrors are birthed and through them that the horrors are overcome.

“The first act of violence that patriarchy demands of males is not violence toward women. Instead patriarchy demands of all males that they engage in acts of psychic self-mutilation, that they kill off the emotional parts of themselves.”

Bell Hooks

In this quote, Bell Hooks is describing the connection between violence against women with the internal violence against one’s self. She makes a similar connection to police violence in the US and its roots at home. There is a thread of commonality that runs between the unaccountable violence we see from police as an institution and the individual acts of violence we commit against ourselves and others. The way we treat ourselves as individuals and those around us is linked to the whole of a culture.

Photo by kazuend on Unsplash

As Above, So Below

I believe the message here is that we cannot hope to address systemic violence in our institutions if we do not also face the violence in and around ourselves.

More broadly, we cannot change anything outside of ourselves if we do not also change within. This is why:

“Change must start from within”

I don’t believe that it is a controversial thought, that a person who commits domestic violence will bring that same violence into their workplace and, inversely, a workplace that is violent will be carried home by those who work there.

What The Movement taught me with #OCCUPYWALLST was that I couldn’t hope to change the way the world worked if I didn’t change the way I worked within the world. If I want women to be equal I’d better treat them as equals. If I want equality, then I must practice equality in my life.

The fractals of change

These thoughts are not groundbreaking; the Dalai Lama was tweeting about this before I even integrated it into myself.

What I want to do is apply this truth to work we do and how we do that work. Consider the leap between me not interrupting women at meetings and systemic violence against women being eliminated. I’ll admit, a single act of not-being-a-dick doesn’t do much to erode thousands of years of systemic oppression. But the actions of the self and the actions of a culture are fractal reflections of each other, with too many steps in between for a single act to resolve this deep-rooted issue.

For the purposes of this article, “culture” is defined as the dominant form of human activity on earth. This could be K-12 education, nation-states, money, etc. Basically, everyone except for the 0.01% of tribal people still holding on.

If we consider culture to be a mighty river, then the individual is but a tiny spring that flows into it. These individual springs flow together to form a small creek, and all the creeks join together to form a stream, and the streams join to form the river…we can see how this analogy might be used to map the fractals of human endeavors. The individual flows into a group, the group into a team, the team into an organization, the organization into sectors, the sectors into economies, the economies into culture.

Image taken from Pexels

So, if we agree with the premise that “Change must start from within,” we see the fractal connection between the atomic part (the individual) and the whole (culture, or all humans). Change the humans, change the culture. This connection is present between every step in that system. To change the family, you must start with the family members. To change the team you must start with the members of that team. Again, I suspect that this isn’t earth-shattering news to you. Basically, what I’m saying is, “To change the whole you must start with the parts.”

There is a relationship between the components and the whole. If you want to change the educational system, teachers will change how they teach, schools will change how they run, school districts will change how they operate, and so on up the fractal ladder. If we want to address police violence we must address violence along the fractal, from violence against the self to domestic violence, to violence among nations. The violent tweet is connected to the bombs dropped on Syrian children is connected to a bully beating up a peer is connected to the violence that the bully witnesses at home. All are parts of the fractal.

Photo by Rostam Torki on Unsplash

You are part of the world and part of the fractal

At this point, we must be careful not to get lost within ourselves. Change along these fractal ladders happens all at once. Its influence is omnidirectional, happening up and down and at all points. It can be easy to confuse the need to start within with the desire and ease of staying within. We must address state violence as we address police violence as we address our own violence. It all happens in tandem. The spring flows at the same time as the river.

You might think that you need to do all the internal work before facing the work that needs to be done in the world. This is not the case; I can advocate for a carbon tax while still driving a car. You can and will be a hypocrite and that’s okay.

The whole system moves at once. We start from within because it is where we have the power to start. I can only move my body. I cannot move yours, yet by moving my body, I inspire yours to move too.

Photo by Dan Roizer on Unsplash

What you do is how you do it

Let’s consider how we make change in the world. The kind I’m talking about is often done through activism and organizations with social good as their bottom line, which in the US take the form of non-profits or a 501c3. These organizations seek to change something other than the numbers in their bank account. The idea that “Change must start from within” is probably very familiar to them. Personal development, anti-oppression training, and other means to change the “within” of the individual are often present. But what doesn’t seem to be given much thought to is how these organizations’ structures mirror the fractal patterns they target for change.

Can an organization that wants to reduce inequality in the world complete their mission if those very patterns of inequality exist within their own organization?

“Change must start from within”

Even if the people in the organization are all woke as f**k, that organization also needs to start from within.

This is the fractal ladder we must climb to get out of our current crisis. Just as we need to look inward to work through our internalized biases, so too must our change-oriented organizations look within. How can a group fight for women’s rights if women are talked over in meetings discussing this very subject? How can a group push for greater democracy in the world while organized as a tyrannical hierarchy? How can a group demand equality while it’s interns go unpaid?

It is this relationship between the meta and the micro that we need to address. I do not mean to say that a group cannot work toward change without being perfect. Instead, we need to always remind ourselves that working towards change means working to change –on all levels of ourselves, our lives, our peers, and our culture.

This is why my co-op chose to organize as a co-op instead of any other hierarchical business model. This is why we spend so much time working on our internal culture. If we want to be able to shift other groups’ culture towards alignment with their goals, we too have to shift our culture to align with ours.

“Change must start from within”

This post also appears on if you’d like to click buttons about it over there.

The post Fractals: Considerations for More Effective Change-Making appeared first on Good Good Work.

Legislator Lookup WordPress Plugin

There is nothing better than building a tool that can be used by many people. We were approached by New Futures to build a website a few months ago for their Smart Start campaign. One of their requirements was a tool to help their visitors look up their state representatives. We accomplished this by building a plugin for WordPress which New Futures has agreed to allow us to release to the public. Their investment in this plugin will now increase in value every time someone uses this plugin! Download the zip, check out the code on GitLab

This plugin provides a set of shortcodes to build pages that look up US state representatives using Open State API data.

The [legislator-lookup] shortcode creates an address input field that uses Google Places API to auto complete addresses.

The [legislator-results] is used to display the results of the search.

Currently both shortcodes need to appear on the same page to function properly. Here’s what they look like in the editor:

The legislator-lookup shortcode accepts two attributes:

  • placeholder which changes the default text in the address input.
  • submitValue which changes the default submit button text.

The legislator-results shortcode accepts one attribute:

  • accordion which controls the representative result boxes appearing collapsed and opening one at a time. Default is true, set to false to disable.

The legislator-results is an “enclosing” tag, meaning it can be wrapped around content in the editor. Anything the shortcode wraps will appear next to the results. This can be used to give users a script to follow or some context for what to do after they search.


The post Legislator Lookup WordPress Plugin appeared first on Good Good Work.

A Website for the March For Racial Justice

In early August, organizers from the March for Racial Justice connected with us, needing a website for their march in Washington DC on September 30th, 2017. We were able to get started on August 15th, after writing up a statement of work that outlined a design and development process.

It quickly became clear that things were moving faster than our plan could handle. There were over 6 thousand people “going” to the Facebook event and over 50,000 “interested”, with no website to speak of. Andrea, the point person who brought us into the project, was overwhelmed and stretched thing, taking on more than she could handle. In addition to making a website, our goal was to make her life — and the lives of the other organizers — less anxiety-inducing. 

We were quickly brought into their project management system, got on the same page as their core organizing team, and collaboratively formulated a plan to get this website put together. The original plan started with a sitemap, provided by the organizing team. Given that info and their technical desires/limitations, we came up with a feature list and reorganized their sitemap. The interactive features included:

  • Shop
  • Resource library
  • Sister march map (and sign up)
  • Endorsement capture
  • Donations
  • Volunteer sign up

It turned out that many of these features were already being handled in an ad-hoc manner. A stopgap website was being put together by the design team Design Choice on Squarespace (these were the folks who did a bang-up job building the brand and identity for the March).

Initially, we planned to build the site with WordPress but determined that it would be best to stick with what had already been developed and continue implementing custom features into Squarespace. The platform is pretty flexible as far as proprietary systems go, and we knew it would be quick and easy to get admins on the site, empowered to make changes.

a browser image with the m4rj website inside it

Though Squarespace can be pretty limited, it allows teams to build an online presence that looks great. Most non-developers really love the drag and drop feature on the page builder and limitations of the text formatting keep things neat and tidy, even when there are a bunch of different people pitching in and making edits. The downside is that there is no revision history, so many people pitching in can cause serious problems.

Once the site went up, we started seeing all kinds of change requests spring up from stakeholders, so we built a content tracking sheet in Google Sheets. This is standard practice for us, as it helps us stay on top of edits and overall site progress.

a screenshot of a browser displaying a Google Spreadsheet that is tracking content

This sheet acted as an outline for the sitemap as well as a central resource for links to live pages and Google Documents where people could edit, suggest, and comment on content before it went online. Having this in place allowed us to let self-organizing take over. When more people have a stake in the work and are empowered to take charge, things get done a lot faster, especially in a semi-chaotic situation.

Special Features

We created two custom features for the M4RJ site, the Resources library, and the March map. These are easy to build yourself if you have some time and patience. Learn how to build these tools using Awesome Tables with our tutorial.

The resource library

The M4RJ organizers wanted to build a resource library so that the march would have an impact beyond the day of the March. This space would serve as a hub for people to share information about racial justice. The Squarespace blogging feature is pretty weak and it would have taken an absurd amount of time (which we didn’t have) to make a custom feature within the platform. Even building it in WordPress would have taken too long.

We finally settled on building a spreadsheet that would feed directly into the site via Awesome table. It had a few key bonuses:

  • It could be updated by a lot of different people.
  • The styling could be easily updated to match the site.
  • No one had to log into Squarespace to make edits.
  • It took mere minutes to set up.

Awesome table is fairly intuitive once you understand its basic principles. We were able to coordinate two volunteers to add custom styling to the tables so they better matched the site theme.

Here’s the live resource library, from this Google Spreadsheet:

The sister march map

Organizers wanted to create a map that displayed “sister marches” around the world. They already had a Google Form that fed a spreadsheet where they were tracking potential sister marches as they sprung up. Because the marches were self-reported, the organizers had to confirm that they were real before we added them to the map. The workflow looked something like this:

  • Sister march organizer filled out a Google Form to announce their march.
  • #M4RJ organizer reached out to confirm details about the sister march.
  • Once verified, the entry in the spreadsheet is marked to be added to map.

Using some Google Spreadsheet functions, like QUERY(), we were able to add awesome table functionality to the existing spreadsheet without ever interrupting the organizer’s workflow. You can see the live map here:

a browser window displaying a map with a big title reading sister marches

Looking toward the future

The team rallied together to make something pretty incredible happen in a very short period of time. It was wonderful to be included.

In the end, we all agreed that it would have been really nice to stand something up that was designed for marches. The good news was that we built a great site. The bad news was that it was a rush job and had to be built on a proprietary platform. Looking into the future, we know we’ll get more requests like this.

This isn’t the first time that we’ve done this either. It’s not at all uncommon for us to be given similar parameters for a project: short deadline, lots of organizers, volunteers aplenty, and similar feature requests. It’s stressful for both the team organizing the march and the team providing support.

Because we profoundly believe in sharing resources and maximizing efficacy, we want to build an open-source version of this website that everyone can use. It’s just one of many projects that, if crowdfunded, could provide a huge amount of financial, emotional, and technological benefit to the network of activists and organizers working on positive change.

More on that in a later blog post.


The post A Website for the March For Racial Justice appeared first on Good Good Work.

Puerto Rico Relief Donation Drop Off Map

I’m co-working with Katie today in a Brooklyn Cafe. An old friend Pablo ran into us and we got to talking about our upcoming trip to Spain and what each of us are working on. Pablo revealed that he is working on relief work for Puerto Rico and that they needed a map. I’ve gotten really good at setting up maps recently, you can read more about how I do it here.

Pablo called up his contact, shared a Google spreadsheet and in a few minutes I had this map setup based on a spreadsheet of donation drop off locations across the US maintained by Pablo’s team. See it after the jump. 

Here is the map, note the search filter under the map.

The post Puerto Rico Relief Donation Drop Off Map appeared first on Good Good Work.

Designing the DSA’s Voting Guidebook in 3 Days

As a designer, I love a good challenge. A recent favorite of mine was working for the DSA on a 3-day deadline.

Download the PDF here

Delegates were about to pick the new leadership body, but were dealing with the unique challenge of needing to represent the true scope of diversity that exists within the democratic socialist left. Charles Lenchner – with People for Bernie – and his team wanted to create a booklet and worksheet to help delegates in the selection process. It would help see at a glance how diverse their choices were before casting their votes.

With the 3-day deadline, we needed to act fast. We had to be agile and adaptive.

The booklet Charles needed had to contain the list of candidates. Each profile would describe them, including a short bio, the region from which they were, their gender, race, and a few other stats that were easy to read for the regular voter with a quick scan.

The worksheet we created would allow to tally up the diversity categories’ totals.  

With such a short deadline, the challenge was not only to deliver on time, but also to design alongside Charles and his team. While we created the actual document, they were putting all the information to be printed in the finished booklet together. For this very reason, we needed to work with live documents, so we worked in Google Docs. That’s how Charles and his team were able to update and edit everything as it was created. I watched their edits in real-time, while I fixed up the formatting and design.

Because Google docs’ styling tools are not as robust as in my software of choice – Adobe InDesign – formatting was a challenge. However, the limitations lent to a clean and very simple design, resulting in an easy-to-read document with clear organization. It wasn’t the most indulgent of designs, but what we lost in flashy graphics, we made up for with time. Thanks to the live documents, we had no back and forths of confusing revisions, so all we had to do was work.

With the magic of Google docs, we were able to create live/editable pie charts of the diversity data with customized style and colors. As the data was updated, transferring the new stats to the pie charts was as easy as, well… pie.

In the nick of time, we called it done. We exported the doc as a pdf and went to print. What a rush! Thanks to this time-constrained challenge, I got to enjoy adapting my process to our client’s specific needs. There are a lot of really great tools out there for us to use. Though I may be more comfortable with a cordless screwdriver, sometimes I need to use a hammer.

Do you have a challenge for Good Good Work? Say

The post Designing the DSA’s Voting Guidebook in 3 Days appeared first on Good Good Work.

How we saved the People’s Summit nearly $10,000

This is the story of free and open source solutions that made an event more inclusive and less costly.

On the weekend of June 9th, 2017, thousands of progressive americans came together in Chicago for the 2nd annual People’s Summit. There were inspiring speakers, such as Nina Turner, as well as  brilliant panels that enlightened, informed, and educated the throngs of activists who had gathered from around the nation. The keynote speaker was Bernie Sanders, who asked the assembled crowd of over 4,000 attendees, “How many of you have run for office, or are actively involved in local campaigns? Stand up.” Half the audience stood. It was truly inspiring.

A few months earlier, in April, organizers came to us, looking for a solution to sell tickets more profitably. Last year, Eventbrite had cost them an exorbitant sum of money in fees. Fees that could have been spent on stipends to help people attend—one of The People’s Summit’s main goals. So, this time around, they wanted to deploy their own ticket sales system.

In the end, we delivered a unique solution that not only helped them achieve their goals, but also saved them ~ $10,00 in fees.

The First Problem: High Eventbrite costs

Eventbrite charges a fee per ticket ($0.99) and takes a percentage of the ticket (2.5%). We created a spreadsheet where we did the math, taking the tickets sold through our system and applying the eventbrite cost to them.

ticket type cost approx ticket sales eventbrite fee per ticket total fees
Scholarship Ticket $0.00 474 $0.99 $469.26
Low income/Student $45.00 1042 $2.12 $2,203.83
Regular $115.00 1283 $3.87 $4,958.80
Solidarity $225.00 230 $6.62 $1,521.45
Institutional $350.00 68 $9.74 $662.32
eventbrite total $9,815.66

This spreadsheet doesn’t include the one-time fee paid to Good Good Work for creating the new ticketing system or payment processing fees—which can’t be avoided. In the long run, however, this sum will be the total savings for each of The People’s Summit’s events.

The spreadsheet takes the fee from Eventbrite and sticks it into our formula with the ratio of attendees based on a past event.  Because there are always additional fees when credit cards are a payment option, the Stripe fee is an unavoidable expense, even in a new system.

By setting up our own ticket shopping cart with the WordPress plugin Tickera, we were able to provide the same functionalities that Eventbrite has:

Example of the PDF ticket generated by Tickera
  • Online cart, sales page, etc.
  • Multiple tickets with different prices
  • Payment processor (using Stripe)
  • Paper ticket generation with Tickera via PDF download
  • Day of event check-in via Tickera phone apps that could scan printed QR codes

The major feature that Eventbrite has and that a WordPress plugin can’t provide is exposure. People go there to find tickets! For many events that might be an issue, but The People’s Summit had enough exposure on their own. They knew that they would sell out before even making an announcement, so they didn’t need Eventbrite to make them more visible than they already were.

Because we were able to handle all the other features through Tickera—which had a $99 price tag—we could avoid paying third-party fees.

Some key points here include:

  1. The power of open systems like WordPress.
    Because WordPress is a free and open system designed to be extended with plugins, there’s a whole ecosystem and user-base available to developers who wish to solve problems, such as ticket sales and event registration. This ecosystem can provide inexpensive solutions to millions of people in a decentralized way. Where Eventbrite has to maintain many servers and staff to keep everything running, that overhead is distributed among the WordPress community of users and developers. It is all-around more economic.
  2. An investment that gets less expensive with age.
    With a one time investment in hiring Good Good Work, The People’s Summit now has a system that will save them money over and over in the next few years. While they saved ~50% of $10,000 this year, next year they will save 100%. And as Eventbrite fees increase, they will continue to save more and more. A little investment of resources now will net a huge win in the future. Ultimately, profits will go exactly where they’re meant to go rather than into the pockets of third-party websites like Eventbrite.

The Second Problem: Making a more inclusive summit

Summit organizers knew they were in the unique situation of having more people who wanted to attend the summit than what the space allowed. The event was going to sell out, which would skew the attendee profile towards people who could afford to purchase tickets fast. This wasn’t what organizers wanted.

The People’s Summit wanted their own, personalized ticketing system that could circumvent the need for a website such as Eventbrite. They also wanted a more open application process that could empower partner organizations to select attendees from their diverse crowd of applicants. They wanted the conference to be a true representation of the American people; diversity in age, race, location, identity as well as individuals with a different mental or physical stance, outside of the usual binaries. Its final goal was really to make the event all-around inclusive while saving them as many third-party ticketing fees as possible.

Our solution had to be flexible, fast, and easy enough for organizers to use. We immediately began researching the problem. There were three main systems to consider:

  • Applications system – We needed to create a step in the application process that would involve partner organizations first, before moving accepted applications on to the registration process, starting with the gateway.
  • Registration Gateway – Once an applicant was selected, the website needed a way to verify the acceptance before letting them buy a ticket. We also needed to be sure that the applicant’s data – such as a registration code – hadn’t already been used to buy a ticket before.
  • Sales system – Once an accepted applicant was through the gateway, we needed a way for them to purchase their ticket—minus the Eventbrite fees.

Once we fully understood the problem and the requirements, the solution and its design quickly became clear.

Here’s the chart mapping the review system we created. Click here to find out more about the process.

The Good Good Work team always aims to empower our clients to use and adapt the systems we create for them. That’s why we live by the principle of meeting people where they’re at technologically. In the case of The People’s Summit, we opted to use Google Spreadsheets because that’s where the organizers were doing their work. We didn’t introduce any new or hard-to-grasp tools because we felt it was better to follow our stakeholders, even if there might in fact be more effective tools out there.

As we were working closely with organizers and talking to them about the system in a holistic way, we were able to develop systems that saved countless staff and volunteer hours in addition to the final ~$10,000. I’ve created a more detailed technical overview. Go check it out!

The Final Product consists of…

  • An application and registration process that allowed partner organizations to accept the right applicants and automatically grant them access to buy tickets.
  • A ticket sales platform that we integrated into the existing summit website which could handle the sale, distribution, printing, and collection of tickets for the event.

In the end, we were able to solve some complex problems with elegant solutions in a matter of weeks. We hit a constantly moving target, for which we’re all very proud. By stepping back from the problem and taking our time to thoroughly examine the solutions, we were able to save The People’s Summit many hours of labor as well as thousands of dollars. We managed to automate a system that our client didn’t even imagine could be.

This years registration was pretty smooth, in large part to the staff and volunteers and the system we put in place.

The People’s Summit can now do all their own ticket sales, no longer reliant on Eventbrite. They’re mostly self- sufficient; they might now be dealing with more overhead, but it comes with more control.

In fact, with a little more investment, the system we built for The People’s Summit could be generalized and used by the smaller partner organizations who don’t have the resources to hire the developers to do this.

Each time organizations use open systems like WordPress, they support all the little organizations who don’t have the resources. We built something that could be used and re-used and we supported a group who has already built a successful ticketing system (Tickera), which then helps them continue to make their product better.

If you’re organizing an event and think that a system like this might be helpful – or you’re into saving thousands of dollars, give us a holler.

The post How we saved the People’s Summit nearly $10,000 appeared first on Good Good Work.