Making is thinking.


While working on web UIs, it is often convenient to serve static files over HTTP in the local network, in order to test on multiple devices.

OS X comes with apachectl, the Apache HTTP Server Control Interface, which helps to control the preinstalled Apache HTTP server on your Mac.

To serve a particular directory on your system, you have to specify it in the Apache HTTP server configuration file located at:


Change these two lines (170 and 197 in my case):

DocumentRoot "/Library/WebServer/Documents"
<Directory "/Library/WebServer/Documents">

… to point to your desired path:

DocumentRoot "/path/to/your/site"
<Directory "/path/to/your/site">

Start the server:

% sudo apachectl restart

Now you can browse to http://YourComputerName.local with your phone or tablet to check your responsive design (located at /path/to/your/site on your Mac).

Trivial, of course, but I kept forgetting. Maybe now, having it noted here, on the next, rather rare, occassion, when I have to fiddle with CSS, I will remember.

But wait! You don’t really want to have httpd running on your system, do you—I mean, who could possibly want that? Why not use Node to write a little server and save it to a file named stserver.js?

var http = require('http')
var st = require('st')

Start the server (as root because of port 80):

% sudo node stserver.js

Browse to http://YourComputerName.local to test.

Less fluff, more buff! The st module serves static files, does etags, caching, etc. In fact, it also comes with a CLI—so, if installed globally:

% npm install -g st

… you can spawn a server from the command-line:

% sudo st -p 80 -d /path/to/your/site

What about Python? I cannot withhold the simplest way to serve the current working directory on OS X:

% sudo python -m SimpleHTTPServer 80

Python is preinstalled on OS X; I should use it more often—not only in LLDB, once in a blue moon.