Hi! I’m Andrew Monks

Chicago, IL



I’m a developer and designer based in Chicago, IL. I love single-page realtime web-apps, and I also love regular html websites like this one. I’m into scaling cloud infrastructure.

I’ve been making websites and applications for more than ten years now. I enjoy programming using functional paradigms. Especially in Clojure and JavaScript. I used to write a lot of Ruby.


  • Scalable, serverless architectures
  • Responsive web design
  • Native applications
  • 3D graphics development


GIFBOOTH provides animated gif photobooths at events for brands like Red Bull, Neimann Marcus, and New York Fashion Week.

I built the server-side database and transcoding system, which scales to handle huge spikes in traffic. I also built the single-page web application.


I have a BFA in Art and Technology from the School of the Art Institute of Chicago. I took classes ranging from Algorithms & Artificial Intelligence and Human Computer Interaction to Programming for Drawing, Data Visualisation, and Networked Objects.


  • react & redux (/reagent)
  • unity3d
  • ofx
  • max/msp
  • aws
  • vim

I love the web.

It’s supposed to be this huge democratizing force, a place where anyone with an Internet connection can carve out a space for their ideas.

Many people find web development frightening. The technology exists, but education hasn’t caught up yet. I love working with non-web-experts to build the agency, confidence, and literacy they need to make the web work for them.

If you need the web to work for you, but you don’t yet have the skills to make it happen, or if you just want to talk about javascript, give me a call at 978-254-1779.

Here’s a big sorted list of everything on this website.

Here are some of my favorite things I’ve worked on:

Estate of the Salon Video [for LEAFTYPE]
Analog Music Video

Monetize Now!

There’s an enormous market for data about you—your location, your purchasing habits, your interests. Many of the websites and services you use, the stores you visit, and the devices you carry are constantly scrambling to collect this data and sell it to the highest bidder.

But nobody has more access to valuable data about you than you do.

With Sellf, you can create a data product far more valuable than what anyone else could collect. Companies like Facebook and Google put millions of dollars into correlating datasets together, but you can sell all of your data as a single package. Google and Facebook can’t compete.

What The Hell Is Testing?
Intro To Testing

If you’ve spent any time in programming circles in the last few1 years, you’ve probably heard people talk about writing tests.

If you’re self-taught, there’s a decent chance you have no idea what they’re talking about.

Why test?

Let’s say you’re writing a pluralizer. You have a main function, pluralize(), which takes a string and returns a plural version of that string.

Here’s a way-too-basic version, in JavaScript ‘cause I heard it’s the most popular language.

// pluralizer.js

function pluralize(string) {
    var lastCharacter = string.slice(-1);
    switch(lastCharacter) {
        case "s":
            return string + "es";
            return string + "s";
read more…

Experimental Record Label

Belgian Man Records is a record label I started in 2007.

In the beginning, I made a commitment to personally handle as many aspects as possible, and as a result I᾿m proud that my own hand has touched almost every release, be it through audio mastering, cover design, or full-on recording and production, and that I᾿ve personally done all the label᾿s promotion, web development, and management.

Running the operation, I᾿ve had the opportunity to design album covers, t-shirts, and posters, plan large events, record and produce albums, and work with dozens of creative people whom I᾿d never have met were it not for Belgian Man.

You can find my own releases and a collection of my cover designs on my page at Belgian Man.

Collaborative Mapping

Where At? is a simple tool for annotating, sharing, and collaborating on maps.

My apartment is a bit hard to find: I᾿m in the rear of my building, and you have to enter from an alley rather than from the main street. Normal Google Maps directions to my address end up at the wrong place, but there᾿s no way within Google Maps to draw your own route and send it to someone. With Where At?, you can.

such term extraction. wow.

doger.js is a “doge” meme generator. It generates scalable, css-based graphics. Given a block of text or a website url, it uses term extraction to pull out important keywords. Then, it uses the linguistic conventions of the popular “doge” meme to generate phrases based on those keywords.

doger.js is implemented as a javascript library. It’s intended to run in the browser, which makes it very portable.

Here are some things I’ve posted recently:

Two uses of macros
Understanding Lisp

Lisp has macros.

Macros are functions you write that operate on that syntax tree during compilation.

It’s not obvious at all what they’re for.

I’ll discuss two ways that macros are used.

read more…

Landing Pages
Always Be Closing!

The landing page is often a potential customer’s first point of engagement with a brand/product. With a good landing page, you can walk them straight from the first impression to a sale. A successful approach is to answer three questions:

  1. What is this?
  2. How will it help me achieve my goals
    • for b2b, this means: “How will it help my business make more money?”
  3. How do I buy it?

Here are some really good landing pages:

Central Working

Central Working’s business is complicated, but they navigate it by addressing the customer’s business goals directly. The killer sentence:

When you join Central Working, we actively introduce you to the companies that you need for growth. You will gain access to thousands of investors, clients and suppliers; all here to help you thrive and succeed. And what’s more, we guarantee  it.


Dropbox uses a short-sell/long-sell structure. The first screen answers the three questions quickly, like Bobby. If a customer isn’t sold yet, they can read on and follow a longer path. Notice how the selling points (“Take your docs anywhere”, “Send videos quickly”, “Keep your photos safe”, “Work on slides together”, and “Never lose a file again”) directly address customer needs, from the customer’s perspective. They’re really good.


Bobby does one specific understandable thing, so they’re able to answer the three questions within one screen.

Coda for iOS

There are way too many text editors for iOS, so Panic needs its landing page to distinguish Coda from the rest. Unlike for Dropbox, where “good design” means clearly answering the three questions, for Coda “good design” includes distinguishing itself visually with a unique, designy-feeling look.


ZocDoc is interesting for a few reasons. First, they have a ton of different types of potential customer: patients, doctors, hopsital networks, and potential employees. Patients are the group most likely to buy based on a website, so it starts with them, and then addresses the other markets in order of decreasing importance-of-marketing-website-in-overall-sales-strategy.

Since patients are the most important audience for the landing page, they alternate between addressing potential patients and the other groups.

I love that if a potential patient is interested enough to get to the bottom of the page, but hasn’t been funneled off into booking yet, they provide a phone number for offline sales.

Functional Usage

You can try this code out in your browser on tonicdev

Have you ever chained a bunch of functions together?


Maybe in jQuery?

$('div').css('color', 'red')

or with promises or node streams?

It’s a powerful, expressive, & concise way to program.

It’s easy to do when you have a set of functions that accept an object and return an object of the same type.

These four functions all work with jQuery DOM elements:

  • $(‘div’)
  • .css(‘color’, ‘red’)
  • .slideUp(2000)
  • .slideDown(2000)

These four functions all work with Numbers:

  • Math.random
  • Math.sqrt
  • Math.floor
  • Math.log

Check out this chain:

const isEven = x => x % 2 == false


Here’s a few properties that arrays have that make them good for chaining:

  • there’s a way to put something into an array ([])
  • there’s a way to get something out of an array ([0])
    • in fact, i === [i][0]
  • there are functions that take arrays and return other arrays, like filter(fn)
  • there’s .map(fn), which does three things:
    • unwrap the array
    • apply a apply regular (not array-specific) function to the value inside
    • wrap the result back up into an array

When a data structure has those properties ^^, it is a monad.

jQuery DOM elements are not a monad because there isn’t really a way to put something in and take it back out.

The Array Monad has some special features that distinguish it from other monads, namely:

  • it’s good for holding a bunch of values in a particular order
  • it’s good for finding a value if you know its index

Monads (“chainable containers”) are such a generic idea that people have conceived of monads suited to all sorts of particular tasks, such as:

  • the Maybe Monad and the Either Monad, which make it easy to chain functions together that might fail

  • the Task/Future monad, which makes it easy to chain functions together that perform long-running or asynchronous tasks

  • the IO monad, which makes it easy to control exactly when and how a chain of functions interacts with the outside world

Functions within a program might all return different monads. This program has a long-running function that returns a Task monad, a randomly-failing function that returns a Maybe monad, and a logging function that returns an IO  monad.

However, functions in a chain must all accept and return the same type of monad. The chain in this program is based around the Task monad. We’ll use functions to convert the Maybe and IO monads into Task monads.

Let’s get started.

read more…

Analytic Typography

A couple months ago, Jon Gold wrote a fascinating article about his work at The-Grid creating “a system that can understand, select & apply typography with the nuance of an expert human designer.”

Unfortunately, Jon left The-Grid and never had the opportunity to take the work to production, so I copied him!

Here is a big ugly table with analysis of half of the Google Fonts in it. You can click on a font and the app will surface other similar fonts.

You can follow the instructions in the README to analyze the rest of the Google fonts (it only takes a minute, but the output is way too big for localStorage and slightly too big for the Github file-size limit).

Can I Make Up My Own Domain Name?

Submitted question:

it must be possible for one to make a website at http://ell.vis, right? I know ellv.is is via iceland, but i like .vis better.

Short answer: not possible.

Long answer: it’s technically possible but it requires a huge commitment of resources and is very expensive.

The domain name system (dns) works in tiers.

‘.com’ and ‘.org’ and ‘.is’ are ‘top level domains’. ICANN is the organization in charge of top level domains. When you go to google.com, your computer asks ICANN “who’s in charge of .com?” and they say “Verisign”. A great deal of top level domains have been registered, but none of them are ‘.vis’.

Verisign is called a registry. They’re responsible for maintaining a list of .com domain names. They contract with registrars (like hover or gandi or godaddy or whatever) to sell access to that list. When you buy a domain name, you pay a registrar, but the registrar has to pay Verisign, and Verisign has to pay ICANN.

A few years ago, ICANN started letting companies apply to be the registry for new top level domains. It costs $185,000, plus an extra $25,000 per year, and you have to demonstrate that you have A. enough money to not go out of business and fuck up everybody’s domain name and B. enough technical infrastructure to actually maintain a domain name list and give it out potentially billions of times a day. [reference]

That sounds like a huge amount of money, but a ton of new top level domains have been registered in the new system. There’s a registry called Donuts with 189 of them.

Audio Circuits

I make audio mixers.

I’ve been working up from a small passive mixer, through a larger 4x4 matrix mixer, and my goal is to make a full-sized studio mixer, complete with tone controls and busses and the like.

Contextualizing ‘How Not To Be Seen’
Surveillance Culture

In 2013, growing surveillance and growing anxiety in the zeitgeist about late capitalism joined and culminated in a cultural moment of visibility–anxiety. Despite a surveillance/control dialogue going back hundreds of years, How Not To Be Seen could only be the product of this particular moment.

read more…

Creative Computer
Mind, Body, and Will

“Progress happens when all the factors that make for it are ready, and then it is inevitable.”

–Henry Ford

“All mankind is of one author, and is one volume”

–John Donne

I often find people using creativity as a thought-terminator in discussions of artificial intelligence: “Computers can’t do [whatever] because they can’t be original! They’re much too deterministic!” but is that really true? does creativity require nondeterministic behaviour? Can computers really not accomplish it?

read more…

Here are a couple projects I’m working on right now:

composable static sites

Web Components present a wonderfully simple model: write your own html elements, and then compose complex things with them. <modal title="Hello!">Modal Body</modal>! Unfortunately, the Web Components spec introduces a lot of complexity of its own.

What if defining a component was as easy as writing some html and css into a file? xenakis is an in-progress static site generator based on Web Components.

Train Game

I’m making a multiplayer 90s-style text game (you're in a dark room, Andrew is here, go east, say hi to Andrew, look around) to deployed to a guerrilla mesh wifi network on the subway. The game will automatically pop up on people’s phones and hopefully some % will play.

I’d like to create a social (if potentially a bit intrusive) experience from the antisocial reality of the commute. It’s a lot easier to type say hello than to actually say “hello” to a stranger on a train. Basically a chatroom, but I think styling it as a text adventure gives the whole project a kind of friendly-nostalgic vibe, and gives people a reason to stick around and explore until somebody else connects.

"sweet record homeslice"
"it's that new new from do crimes"
"i'll cop that for sure"

 this is a label
 we like to do many crimes
 you go do some too


This project creates a stdlib of CDNed vendor code for (require.js) async javascript.

Simply src-in 0.js and then require any libraries you need, they’ll be loaded in asynchronously. You don’t need to think about CDNs or building libraries or versions or anything like that, dependencies are resolved automatically.

live demo

<script src="http://0.ss.cx/0.js"></script>
  require(['jquery'], function ($) {
    $('body').append('<h1>Hello from jQuery!')
read more…