Hi, I'm Henry. In 2012 I quit my job as a programmer at BioWare to spend a year making my own indie games. This blog is about what happened next...

Like Spaceteam? Want to support my work?
Join the Spaceteam Admiral's Club!


On Saturday I lured some friends over for a “stuffing party” where we stuffed Kickstarter reward packages and then our faces (this weekend was Canadian Thanksgiving).

We had to stamp, slice, cut, match, stick, stuff, and label packages destined for the USA, Canada, UK, Belgium, Netherlands, Germany, Australia, Japan, New Zealand, Denmark, Norway, Spain, France, Finland, Sweden, Switzerland, Mexico, South Africa, Malta, Italy, Austria, and Israel. There was a lot of stuff.

At peak operation we had three assembly lines working independently. As a factory foreman I feel I was harsh but fair. My workers were paid in chestnut pie and other treats. There were some rumblings of unionization but they never went anywhere.

In the end we stuffed 400 packages. I still have about 250 to go but the party was an enormous help. Thank you to everyone who came out.

Now that I have all the final rewards I can report on the costs (shipping is estimated until next week):

  • Buttons x 2000 = $574 = $0.29 each from Six Cent Press
  • Embroidered Patches x 1000 = $730 = $0.73 each from Custom Patches
  • Certificate card stock x 350 = $40 = $0.11 each from a local print shop
  • Gold Seal x 714 = $64 = $0.09 each from a local stationery store
  • Lenticular Membership Cards x 1000 = $676 = $0.68 each from Snapily Pro
  • Medals x 300 = $1,003 = $3.34 each from Awards Canada
  • Fridge magnets x 500 = $1862 = $3.72 each from Fridge Magnets Canada
  • Envelopes x 750 = $364 = $0.49 each from ULINE
  • Shipping x 658 = (_estimated) _$3,626 _= _ $5.51 each using Canada Post

Since I ordered in bulk I still have some goodies left over which I’m expecting to use if/when I reopen the club to new members. The grand totals are:

  • Total cost of rewards to send out: $6,755
  • Value of leftovers: $2,184

The rewards cost a bit more than my original rough estimate (8% instead of 5% of the total) but they’re still in a reasonable range and there weren’t any huge surprises so I’m pretty happy.

Here are some things I discovered:

  • The post office will give you as many adhesive address labels/customs forms as you want (I asked for 600) and I was able to print onto them with my printer, so I didn’t have to address and declare/itemize everything by hand.
  • Canada Post’s “Light Packet” service (which I am using) is not available through their online Electronic Shipping Tools. For some reason it’s only available to eBay customers, or in-store. Luckily my local post office is happy to accept and process all the packages and then charge me for everything when they’re done.
  • It might save you a bit of money to print things on your own printer, but if the card stock you’re using is thick enough that you have to manually feed sheets one at a time to stop them getting jammed, it will be very annoying. And it probably won’t save you much after all because your toner will run out 😉

To actually generate the rewards I wrote a bunch of Ruby scripts to process the member database, add my own special cases, generate images & labels and annotate them with text in specific positions. Here are the tools I used:

  • Ruby (my favourite scripting language) and its built-in CSV parsing tools
  • RMagick (for manipulating images)
  • rqrcode_png (for generating QR codes)

In between physical reward prep I’ve been working hard on the Lexicogulator and it’s getting very close. I hope to have it ready in time for you to authenticate your identities using your fancy new membership cards :)

Other tasks have been slower going: eg. banging my head against a wall over what seems to be a pretty widespread iPhone 5 crash bug*. I still haven’t found the solution but I think I’ve found a way to mitigate the bug somewhat so I’m going to patch it for now and keep investigating.

Either way, I’m looking forward to pushing Spaceteam v1.6 out the door very soon!

*For anyone curious: the bug is a sporadic memory stomp that overwrites a variable during an asynchronous networking call. However the variable has very limited scope (it’s a local variable captured by a dispatch_async block) so I don’t know how to set a watchpoint to find out what is changing it. Quite frustrating.