Hi! I’m Andrew Monks

Chicago, IL



I’ve been making websites, servers, and applications for more than ten years now. I like making good tools and libraries and then using them to deliver good results. I usually choose Clojure or JavaScript. I used to write a lot of Ruby.

For the past year, I’ve been lead-developing full-stack web projects for big brands at a small agency.


  • Realtime webapps
  • Realtime data processing / analytics systems
  • Realtime graphics
  • Native applications
  • Cloud infrastructure / ops / linux


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 Activated Objects.

I love the web.

I run a weekly meetup in Chicago for artists who want to incorporate technology into their work. If that sounds like you, text me for the details at 978-254-1779.

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

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…