I create
Handcrafted apps for small companies

I can help you

Bring your ideas to life

If you have a great idea but need some help translating that into an app or website, or are looking to improve the user experience of your existing product, I can help you.

loading...


Develop new products

Develop new products

Enhance user experience

Enhance user experience

Automate business tasks

Automate business tasks

Optimize applications

Optimize applications

Improve reliability

Improve reliability

Deploy to the cloud

Deploy to the cloud

Case Studies

Trusted by

It's important to choose

The best tool for each job

Static Website

If all you need is a simple website, I'll usually choose to build it with Next.js. Next enables me to build highly functional and interactive websites very quickly (using React components), and then deploy them as a static bundle - which saves you hosting costs and provides a faster load-time for your users.

Web Application

For more complex applications, I prefer to use Node.js or Ruby on Rails to provide a backend API and then create a static frontend application separately that interacts with it.

I find it highly beneficial to decouple frontend and backend development in this way.

User Interface

I use React pretty much exclusively for frontend work. I start by designing a library of components in isolation using Storybook, allowing for clean testing and reuse.

I then incorporate these components into a static website that communicates with a backend API.

API

If the API will be consumed primarily by internal services, I often go with GraphQL. This allows me to separate unrelated responsibilities into modules and microservices, and stitch them together into a single schema later on.

Database

For important relational data I use PostgreSQL, while in smaller applications and prototypes I often find it more expedient to choose MongoDB.

I strongly recommend Redis for key-value storage, and for time-series data such as metrics I suggest Prometheus.

Deployment

Whenever possible, I recommend a container-based serverless deployment such as Zeit Now.

However, I have also built complex environments using Chef, Consul, Docker Swarm, and more. Every organization has different needs.

Working together

My recipe for success

Everyone has their own style, and a successful relationship depends on finding the right match. When I am engaged in a project, here is an idea of what you can expect.

Ready to get started?

loading...

Pay as you go

You can pay your invoices securely online with a credit card or bank transfer.

Reminders will be sent out at five, ten, and twenty-one days. After a third reminder, your project will just be on hold until the balance is settled.

Ongoing maintenance

A project rarely just ends once the work is complete. For a small maintenance fee, I will remain available at the original rate for the occasional change.

I will also continue to monitor your application's stability and keep you informed of upcoming issues that may impact your business.

Discounts for good humans

I offer a significantly lower hourly rate for registered charities, open source projects and anyone who paid their last invoice in under five days.

Everything is yours, always

You legally own any work created up to the last invoice paid, and can leave any time. All configuration, code and assets exist in a Github account controlled by you. Domains, SSL certificates and third party accounts are always in your name.

Free software

Open-source projects


hipchat-addon

hipchat-addon

Create Sinatra-powered Hipchat Addons with Yeoman
grunt-rasterize

grunt-rasterize

Rasterize SVG graphics at various sizes using Inkscape
grunt-environment

grunt-environment

Add environment-centric logic to your Grunt builds
grunt-hipchat-notifier

grunt-hipchat-notifier

Send grunt messages to a Hipchat channel
grunt-phonegap

grunt-phonegap

Local build tasks for Phonegap applications.
Diablo 3 Move Tool

Diablo 3 Move Tool

A small utility to keymap movement actions in Diablo 3.
grunt-config-dir

grunt-config-dir

Split your grunt configuration into multiple files.
Tassadar Server

Tassadar Server

Starcraft II replay file parsing as a web service.
SeedList

SeedList

Strategies for seeding players into a tournament bracket.
Prometheus

Prometheus

A layer above Thor to create beautiful command-line interfaces.
Windbag

Windbag

Windbag is an event notification system for Rails 3
ActionPusher

ActionPusher

Push views over WebSockets from anywhere in your application.
Guard RBP

Guard RBP

Code quality monitoring for Rails applications.
Litmus Mailer

Litmus Mailer

Update your Litmus tests whenever email is delivered.

GPG Key Fingerprint

398CFF961C1BFAA430551B9FEBA7BD5CB8B7CB94