Oregon Historical Society

I’m currently working on the Oregon Historical Society‘s digital history projects:

These sites were developed in partnership with Portland State University over the past 10+ years. I’m maintaining the sites and building new features.

  • Code
  • Tech: Python 3, Django, Postgres/PostGIS, Angular, Bootstrap, jQuery, OpenLayers
  • Deployment: CentOS 7, Apache/mod_wsgi, Ansible

My Stops

A map-based interface for Trimet‘s TransitTracker. The site is currently a prototype, but it works well enough for me that I’ve been using it exclusively instead of TriMet’s site. I have plans to add features such as saving stops and stop groups (e.g., work, home).

For this project I decided to forgo using an ORM and instead write raw SQL, with a thin query wrapper around common operations.

  • Site
  • Code
  • Tech: Node.js, Express, Postgres/PostGIS, React & Redux, OpenLayers, Mapbox tiles, Trimet Developer API
  • Deployment: Ubuntu, Nginx, pm2, Ansible


In the mid-to-late 2000s, byCycle.org was somewhat well-known nationally for being one of the first online bike-routing tools in the US.

The project was supported by Metro, a regional government agency in the Portland, Oregon, area. In particular, they provided free access to their street and bike route geodata (RLIS).

Without a sustainable business model and after Google Maps added biking directions, the site languished. Currently it’s in an experimental state using OpenStreetMap data for address lookup and routing.

  • Site
  • Code
  • Tech: Python 3, Postgres/PostGIS, React & Redux, OpenLayers, Bing Maps tiles, OpenStreetMap data
  • Deployment: Ubuntu, Nginx, uWSGI

Web Framework

A few years ago, I started writing a resource oriented Python 3 web framework just for the experience. I wanted to make something RESTful, with resources as a central concept instead of “controllers” and/or “views”, which don’t seem particularly well-defined in web apps. I think the framework is fairly well designed, but maintaining a framework is a ton of work, so I only use it for side projects (e.g., it’s used by byCycle).