Blog
2026
Stateless map matching
HTTP range requests, a temporary road graph, and browser-native RPC
Rapid Agent Chat Interface Prototyping with FastMCP
Generating highly customized chat workflows with tightly curated data models
Talking a Map Into Existence with Squidmaps
Exploring a new map API through a narrated Oakland walk
Integration Tradeoffs Between MCPs and Plugins
Comparing AI integration methods, local execution risks, and context management
Streaming When Your Cache Becomes the Bottleneck
Tradeoffs Between Redis and Kinesis at Scale
Dynamically Rebalancing Geo-Constrained Stream Processing
Using real-time spatial signals and fast redeploys to keep geo pipelines efficient under changing load
2025
Triaging Heuristics for Erronous Matches
Exploring a few strategies to penalize matching errors on intersecting roads
Lightweight HMM Map Matching in Go
Building and benchmarking a simple, high-concurrency map matcher in Go
2023
Full stack map control
Self-service tiling and webmap app from Github Pages
Fast de/serialization with numerical arrays
Efficiently pass through lists of floats between languages via Redis
2022
Simultaneously explode multiple array cells in SQL
Trino/Presto pattern for row-wise expansion of multiple grouped arrays with UNNEST
Trino/Presto spherical distance capabilities
AWS Engine V3 now supports full Trino geospatial functions from coordinate data
Running Selenium on AWS Lambda
Lambda supports custom Docker images but container behavior is inconsistent on AWS infra
2021
Upcoming transit stop arrivals data parsing
Merging static and real time GTFS data for upcoming stop arrivals insights
Calculating turn angles
Notes on how to determine turn direction
More efficient spatial intersection in Spark
A poor man's R-tree spatial index solution
Modeling a 40% budget increase w/ GTFS
Allocating new service based on routes by headway and trip runtime
2020
Notes from challenges during parsing of AWS access logs
Regex conditionals and non-capturing groups for the win
RAPTOR algorithm with caching
Notes on suggested optimizations
RAPTOR transit routing algorithm basics
A simple code-based demonstration of the fundamental concept behind RAPTOR
Map matching over-simplified
An attempt to break down map matching into a simple, albeit crude example
Faster tests with PySpark
Unit testing and data warehouse queries
Slicing polygons with linestrings
Adapting split strategies from Shapely to TurfJS
External DAG triggers in Airflow
Executing DAGs from within other DAGs and managing shared context
Localized GeoDataFrame UTM reprojection
Programmatically identify UTM zones during meter-projection conversion
Testing patterns with PySpark
Unit testing multistep transformation pipelines
Identifying representative core of diverging trace set
Heuristic methods to extract a representative core segment from a corridor trace set
Dynamic bytestring-encoded arrays
Using construct-based declarative structure with variable-lengthed arrays
Hierarchical clustering of trip traces
Dynamic resolution of S2 cells to represent trip paths
2019
Convert GTFS to Vector Tiles
Compress delivery size of GTFS route shapes with tippecanoe
Map vs FlatMap
Simple introduction to functional patterns with Map and FlatMap
Geoprocessing of vector tile data
Centroid-based extrusion of a complex geometric reference layer
Leaflet versus Mapbox GL performance
Evaluating the utility of Leaflet in the context of transit feed mapping
Cost estimating synthetic edges
Evaluating performance of network edge leaf node additions
Conveyal custom transit conversion
Representing custom transit in summary graph form
Debugging GeoPandas GeoPackage IO
Steps in evaluating fid drop pattern during GeoPackage read/write
Extracting Uber Movement Data
Navigating extraction issues with CLI tool
On-street Open Parking Data
Exploring Sacramento curb data and map matching with SharedStreets
Migrating to new Mapbox expressions
Documentation on new expression pattern conversion for Mapbox GL
Exploring 2017 NHTS LATCH data
Notes from a quick exploration of the just-published NHTS 2017 Transferability Statistics
2018
Creating multimodal graphs
Combining walk and transit graphs together with peartree and OSMnx
Modeling critical infrastructure shutdowns
Identification and tiered classification of road networks via betweenness centrality
Dynamically costing window scoping and cell grid sizing
Benchmarking variable window scales on clustered cell matrices
Performant spatial analysis via cell clustering
Utilizing numpy mesh grids to vectorize polygon sorting
Exploring San Jose VTA Swiftly Bus Data
Exploratory notes on bus performance data dump
Parallelizing distance matrix calculation
Utilizing Dask for performant mapreduce all-to-all comparisons
Brooklyn Bus Redesign to TransitJSON
Converting proposed KML route to peartrees-consumable data
Convert a GeoDataFrame to a SVG (Part 2)
Utilizing categorical style sheets and svgwrite
Convert a GeoDataFrame to a SVG
Create a grouped SVG that retains DataFrame row attributes
High performance peartree utilizing graph-tool for network analysis
Notes on how to transform a peartree network graph into a graph-tool object
Installation notes for graph-tool
Notes from setting up graph-tool in peartree's development environment
Observed vs. Scheduled Route Performance Notes
Utilizing GTFS-RT analyses to examine discrepancies in AC Transit route 6
Utilizing custom eventData objects in MapboxGL
Passing flags through MapboxGL event to chain conditionals
Transit Network Sketch Analysis Interface Prototype
Rough concept design outline of a interactive network sketch interface
Simple Nested Menu with React
Notes on an example pattern for generating a dynamic nested menu
Complete network analysis for Peartree via SharedStreets
Notes from exploring SharedStreets integration with Peartree network graph
Corridor analysis with GTFS-RT trace data
Coordinate aggregation to estimate route performance consistency
Coalescing Networks for Performant Graph Analysis
Performant spectral clustering leveraging raster like graph clustering
Comparative Acyclic Route Graphs
Some notes from early hyperpath exploration with Peartree
Geoprocessing Parcels to Estimate Street Widths
A minimal-data approach to estimate street widths surrounding target parcels
Computing Variation in Peak Hour Spreads
Application of weighted job scheduling optimization algorithm to find max peak service hours count
2017
Better Rendering of Isochrones from Network Graphs
In which I propose an updated, but slower, method of generating isolines from ego graphs
Calculating Betweenness Centrality with GTFS
Brief walkthrough of how Peartree enables graph algorithms to be performed on GTFS data
OSM Graph Data to HPGL
Converting OSM network graph edges to efficient HPGL plot paths
Scenario Opportunity Costing via Network Accessibility
Running a scenario comparison against alignment alternatives
Street Grade and Walk Accessibility
Exploring how grade limits walk access in suburban North San Diego
Notes on Geopandas Cythonization Effort
Exploratory results from variable buffer operations on a Cythonized GeoDataFrame
Identifying urban zones with spectral clustering
Utilizing clustering on a weighted Laplacian to segment OSM walk network data
Introduction to Transit.Land API with GeoPandas
Simple query and visualization methods for exploring the Transit.Land API
Tethering Schedules to Routes via Trace Data
From Trace to GTFS - Proposed operations structure for generative Flocktracker GTFS, Part 2
Programmatic Geometry Manipulation to Auto-generate Route Splines
From Trace to GTFS - Proposed operations structure for generative Flocktracker GTFS, Part 1
Synthesizing Multiple Route Trace Point Clouds
Merging multiple trip traces to impute a single route spline
Abstracting Complex Geometries as Points
Utilizing Delaunay triangulation to represent complex geometries in a network graph
Summary Notes on Flocktracker Bogota Dataset
Recording summary findings and methods involved in cleaning Flocktracker data from Bogota, Colombia
Point of Interest Accessibility
Embedding Points of Interest in a Network Graph with Pandana 4.0
Examining Bus Headway Distribution
Assessing Differences by Hour in Mean and Median Route-Stop Headways
Calculating Route Straightness
Measuring Systemwide Route Straightness via Cumulative Path Bearing
Trimming Disconnected Network Subgraphs
Identifying and managing weakly linked and disconnected subgraphs in OSM network graphs
Bounds Vectorization vs. R-Tree
Benchmarking performance of filtering vectorized bound attributes vs. a spatial index
Network Accessibility Analysis
Roll your own accessibility analysis tool on a custom network
Parallelizing Geoprocesses
Utilizing Dask to speedup distance matrix calculation
2016
Salt Lake County Budget Viz
Exploring Open Utah's Socrata portal and Salt Lake County's 2014 budget expenditures
Copying a Remote Database
Pulling down a remote database and loading it locally
Shipping as Stakeholder Engagement
Deploying small tools as a method of securing buy-in and expanding perceived potential
Jail Overcrowding and Conway's Law
Rapid development to capture lost CJS clients
Simple SMS Mock Up Tool
A simple device for making mock-ups of SMS interfaces that conveys non-smartphone use
Initial foray into CitySDK
Creating simple client side interface that interacts with JSON API of PIF tool CitySDK
2015
Announcing NYC Bus Data API
The "official" release of my bus data and performance portal
Calculating distance along route
Acquiring bus stop distance from route start by leveraging route shapefiles
Simple visualization using MTA Bustime Monitor
Plotting late and early bus counts by day
Frontline dispatch, using Node for data munging
TL;DR I should have stuck with Python
Follow-up on Bustime API latency tests
Final results on testing for optimum 30 second setTimeout
Bustime API latency and cached returns
Analyzing rate limitations on Bustime API
Undocumented MTA API capabilities
Explorations into the Bustime site's API calls
MTA bus line route shapefiles
Update on oba-path-extractor completion
MTA bus route shapefiles via Bustime site
Utilizing the One Bus Away toolkit to decode polyline strings from MTA web data
Improving path-creator tool
Sometimes simpler and slower is better
Crawling MTA bus traces
Creating a method for inferring bus routes from unsorted geospatial data
Setting up an Azure SQL Server and CLI tools
Outlining the steps involved in establishing a SQL Server with Azure Cloud Services
Obtaining and drawing clean MTA bus lines
Brief comments on inconsistencies in the MTA's GPS output for buses
Extracting data from traffic cameras
Notes on early process of obtaining and processing NYC DOT traffic camera image streams
Crafting a Cohesive Vision for Flocktracker
Observations on maintaining a contextual overview of a project when deep in product development
A fresh personal site
Converting from old site to a new, Jekyll-managed theme.
I won!
Well, sort of...
Sense your city
A digital design contest entry
State of things
An update since Hacker School
2014
Mongoose configuration
Early excercises with Mongoose ORM
Gulp and Mocha
Trying to understand the workflow through self-explanation
Ray tracing
Spinning planets and simulating points in space
Super Simple Asteroids Game
450 lines of code to shoot rocks
Initial foray into Leaflet with D3
Creating a Voronoi diagram with CitiBike station information
Node notes
Thoughts as I started Node for the first time
Further sloppiness
A pre-Jekyll foray into creating an easy-to-add-to blog system via Github (part 2)
Success and sloppiness
A pre-Jekyll foray into creating an easy-to-add-to blog system via Github