I’m a programmer, designer, student, and entreprenuer.
I’m working on Stash, the personal finance mobile app that makes you a money-saving badass. Previously, I worked at Segment as one of the first engineers, during which time we scaled to over 50 billion requests a month, became one of the best placest to work, and earned millions in recurring revenue. Before that, I worked at Basecamp where I worked one-on-one with Jason Fried and Ryan Singer and prototyped new ideas, apps, and interface concepts.
I hack on open source software nearly every day. I believe that anything that can be open source, should be.
I grew up driving tractors, milking cows, and running through corn fields with my yellow lab, Mindy. I now live in Toronto, Ontario, Canada.
Would you like to get in touch with me? Please do! Feel free to send me an email or message me on Twitter.
Subscribe to my mailing list to learn more about technology and business.
timecop is a gem providing “time travel” and “time freezing” capabilities, making it dead simple to test time-dependent code.
an Xcode plug-in to use Clang's format tools and consistently format your code.
CLI tool to easily deploy your ECS services.
CLI tool to run commands your ECS container instances.
A BigQuery client to batch and load data with Go (Golang).
is a web server agnostic Rack Middleware for defining and applying rewrite rules.
TRVSEventSource an ObjC server-sent
events EventSource client using NSURLSession.
- TRVSMonitor an ObjC synchronization
construct to make asynchronous testing simple.
- judy.js is the JS lib that provides
the sweet rainbow animates links on my site. Here's
my iOS version too.
- shoulda-context is a Test::Unit context
framework extracted from thoughtbot’s
- Stash- the personal
finance tool that makes you a money-saving badass.
- Segment- the customer
for iPhone, Basecamp
for iPad, Basecamp- the project
Techniques to Achieve High Write Throughput With Elasticsearch
Using Golang and JSON for Kafka Consumption With High Throughput
- Graphing Kafka Offset Lags With StatsD 26-03-16
- SSH into EC2 Instances By Instance Id 30-11-15
- Outbound connections from Docker with VirtualBox not working? 17-11-15
- Building a custom Zendesk app 10-11-15
- Library and Lambda function to show your Rdio Heavy Rotation on your website 24-10-15
- Error responses on Node.js with Koa 21-10-15
- Building Infrastructure with Docker, AWS ECS, and Hashicorp's Terraform 07-10-15
- Piping into a docker container 25-09-15
- Animated nyan cat in the terminal 25-06-15
- Re-architecting the api 25-03-15
- How to hide Chrome's notification icon in the menu bar 24-07-14
- NSURLSession and NSOperationQueue working together = TRVSURLSessionOperation 17-06-14
- Added support for promises in mocha v1.18.0 14-03-14
- Jasmine-jQuery v2 adding support for Jasmine v2 13-01-14
- Writing @ prefixed macros 10-01-14
- My Xcode plug-in to have Clang format/style your code using the new clang-format 07-01-14
- Text processing with NSLinguisticTagger: implementing Writer Pro's syntax control 25-12-13
- Preventing 'IB auto generated at build time for view with fixed frame' when using Auto Layout 28-11-13
- URL Linking in a non editable NSTextView 09-11-13
- Using UIImage, UIColor, UIFont code on mac os x 02-11-13
- Using TextKit to put an image in a text view 20-10-13
- How to know when a UIScrollView (includes UITableView, UICollectionView) finished scrolling 19-10-13
- Server-sent event event source api client in objc for ios and mac using nsurlsession 12-10-13
- Writing your own Emacs interactive functions with completion 10-09-15
- Async testing with xcode and any testing framework such as xctest, sentestingkit, expecta, etc. 11-10-13
- `git author sha` - get author info for a given sha in git 05-10-13
- Xcode attaching to app running in simulator not working 03-10-13
- Basic authentication with afnetworking 2 27-09-13
- Disable microphone muting when typing in google+ hangouts 24-09-13
- Scroll to the very bottom of a uicollectionview 19-09-13
- Installing ruby with rbenv and homebrew on os x mavericks 24-06-13
- When google chrome won't open itunes links 04-06-13
- Getting the status bar's height in ios 06-05-13
- Converting avfoundation's power levels to/from logarithmic and linear scale 08-02-13
- Notify yourself of successful/failed xcode builds by email 17-01-13
- Overriding uiviewcontroller's view property, done right 28-12-12
- Quick staging and other file operations in git 01-11-12
- Making custom transitions between uiviewcontrollers 22-10-12
- Alias in zsh with completion 08-08-12
- iOS how-to mask and shadow an image 06-08-12
- Adding a drop shadow to a table view 23-07-12
- Getting the index path of a table view cell via a subview event 22-07-12
- Rendering errors in json with rails 27-04-12
- How-to test starting backbone's history 16-04-12
- Web inspector's new dock to right feature 01-04-12
- errors.js - client side errors object 30-03-12
- Generate rails migrations that automagically add your change 16-03-12
- Using git's include for private configuration information (like github tokens) 09-03-12
- Find rails partial references in vim 23-02-12
- Using postgresql's hstore with rails 20-02-12
- Tidying up with the power of :g 17-02-12
- Modern grep 09-02-12
- Search a git repo like a ninja 02-02-12
- Zsh's extended glob, and octopress's new_post script 30-01-12
- Comments, and automatically folding them in vim 17-01-12
- Expressive domain specific languages (dsl) in ruby 28-12-11
- Keeping your git repo clean of .orig files! 03-12-11
- Saving files in nonexistent directories with vim 28-11-11
- Markdown headers in vim 18-11-11
- Mess up a rebase? reflog your problems away 31-10-11
- M-x occur for vim 31-10-11
- Hello. yes, this is blog. 29-10-11