Trail des Calades

Last Sunday, the 16th, I ran in the 3rd edition of Trail des Calades, a 16.5 km trail run in the hills north of Montpellier. I downloaded my track from Runkeeper, converted it to GeoJSON, uploaded it to my Mapbox account (disclaimer: I work for Mapbox), and styled it in Studio for the map below. It's fun to see how much has changed since the last time I blogged a running map. It's all WebGL now, with changeable perspective, and the style editing is super slick. I particularly appreciated how the Mapbox editor suggests reuse of elements that already exist in the Outdoors style.

Montpellier is on the interior edge of the coastal plain. The countryside north of the city is rolling hills dotted with limestone outcrops, all of it covered with live oak woodlands or vineyards. The Trail des Calades made a rugged loop through this landscape, starting and finishing in the town of Saint-Jean-de-Cuculles. There was a short triangular loop through the cobbled streets of town after the start, in order to settle the pack, and then it was singletrack or jeep roads the rest of the way, counter-clockwise from the town up to the base of the Pic Saint-Loup prominence, and back. I'm not in great running form yet and didn't want to risk breaking an ankle or anything else with my 20k 4 weeks away, so I took it fairly easy, even stopping to take some photos. My time was 2:08:01. The winning time was 1:22:36!

Parking at the entrance of the town

The weather was overcast and cool, but not cold. I went with no jacket and no water, planning to drink 2 cups at the mid-way station, and this worked out very well. In hotter or colder weather I might have geared up more like my fellow runners.

At the départ

Something like 320 people signed up for the race and 291 of us finished. The race was very well organized and staffed. There were bathrooms, and coffee! Course marshals, many of them pompiers (firefighters), were out at trail crossroads. We had a moment of silence before the start in memory of Jérémy Beier, one of their comrades who died fighting a wildfire in August.

En route

I stopped to take a photo at a mellow, wooded spot in the second half of the course, which was generally very steep and rocky or muddy. It was a very challenging and fun course, part scramble and part run. I'm looking forward to another race like this one.

Blog Makeover

The feature I need most in a static site generator right now is incremental builds. Regenerating the hundreds of existing posts on my site has become a barrier to posting often. I'm trying Nikola and am satisfied so far. With each new post there are still a number of files to be regenerated – the index page and feed, pages and feeds for tags I've used – but the write, preview, publish cycle feels much faster.

Syndication feeds for the tags I use is a feature I gave up in 2013 when I quit blogging on Zope, but they're back thanks to Nikola. See and for example.

I'm using "work" and "life" tags to make it easier to subscribe to posts that are mainly about programming and spatial data processing or posts that are mainly about food, running, and being a temporary resident of France. This doesn't mean that I'm making my work feed a safe space for people who don't want to hear about workplace diversity, climate change, and politics or that there won't be any posts about maps and computing in my lifestyle feed.

Thanks for reading my blog. I hope the changes work for you, too.

Running in Montpellier

Cooler and wetter weather has returned to Montpellier. City forests and natural areas which have been closed all summer because of fire danger have reopened. This steel door at the southwest corner of Montpellier's Zoo Lunaret has been shut all summer, but is now open from 9 to 19.

Emergency exit no. 11

I took the photos for this post with my G4 on a morning run around the Zoo at the end of September.

Bois de Montmaur, the wooded park on the outcrop west of the Zoo is open for business. It's a great place to go for short hill repeats and is just big enough (27 hectares, or 66 acres) to provide the illusion of being in the oak woodland (called the garrigue here) outside the city.

Bois de Montmaur

Directly north of the bois and zoo is the Agropolis International campus. Behind its cluster of buildings, next to the Lez (Montpellier's primary river), is a stretch of pleasantly quiet and shady foot trail.

Agropolis single track

Beyond a canoe and kayak park the trail enters the Réserve Naturelle de Lunaret and tiptoes along a section of short cliffs above the river. The cable hints at how slippery the mossy limestone can be during the rainy season, and while the Lez is low now, you wouldn't want to fall in after one of the episodes (cévenols) of torrential rain that can happen in fall.

Réserve Naturelle de Lunaret

After a kilometer of rough conditions, the trail opens up again near the southwest corner of the zoo. These parasol pines (Pinus pinea, the tree that gives pine nuts) are just on the other side of the green steel door I showed at the top of this post.

Parasol pines

I've been enjoying running the streets and paths of Montpellier, but I'm very happy to have easy access to dirt trails and nature again. I'm not alone in this feeling; I shared every stretch of this loop with other runners, some of them obviously radiating with pleasure.

On October 16 I'm going to do the Trail des Calades, a 16km trail run at the foot of the Pic St-Loup. It's the 3rd edition of this event and looks like it'll be a bit like the Black Squirrel, but shorter and steeper. There are one or two races like this within an hour's drive of Montpellier almost every weekend. I'm using it as training for the 20km road race in Montpellier on November 27 and don't have any ambitions other than to finish without getting injured and enjoy some fresh air and good company.

Benjamin Gerard Gillies (1976-2016)

My brother Ben died on August 25 after being seriously ill for most of the summer. I got the news that life supporting measures were no longer helping while I was in Germany and was able to get back to Denver to be with him, his partner, and family at the end. He was just 40 years old.

Ben was a bookseller, he worked at the Hungry Minds (later, Ruminator) and Subtext bookstores in St. Paul, Minnesota and in 2015 opened a store, City Stacks, on Denver's Wazee Street. City Stacks had a memorial on September 2nd. If you've come to this page via a search for news about Ben, I recommend going to that Facebook page. I was touched by the kind words of his friends and customers.

Ben was in the bookselling business to be close to the things he loved most: books and readers. I don't think there is any aspect of the trade, from printing to distribution to customer service, that he didn't appreciate and enjoy. I'm sorry he didn't get to keep selling, trading, and talking about books any longer.

Bye, Ben. I love you. Rest in peace.

Instants and intervals for event-like GeoJSON features

Now that RFC 7946 has been published, I'm returning to my work on describing event-like GeoJSON features at My goal is to come up with a representation for instants and intervals of time that does for "when" what GeoJSON has already done for "where." Applications like the USGS earthquake feeds are what I have in mind for this GeoJSON extension; geojson-events is not suited for GPS tracks or telemetry of moving objects, these kind of measurements require a different model.

I would be grateful for your comments on geojson-events. Please check out the project repository and let me know if this GeoJSON extension is or isn't useful to you.

RFC 7946, the GeoJSON format

Hello, RFC 7946. Congratulations to everybody involved! I'm very satisfied with it. Taking off my editor hat, I'd like to add some personal commentary on the RFC and the process that produced it.

The results

GeoJSON is already well adopted. What did we accomplish by making it an IETF standard?

  • We've made a standard for encoding geographic data in internet messages that isn't just for GIS or web mapping developers and is more likely to be used in network applications like WebRTC.
  • GeoJSON is more precisely defined than ever. Bugs in the spec have been fixed. My job at Mapbox involves services that accept GeoJSON uploads and I'm looking forward to more standardized GeoJSON as time goes on.
  • At last we can check off the "standards" box when selling GeoJSON services to customers that are required to use formal standards.


RFC 7946 is the product of the IETF GeoJSON Working Group (WG) formed in October 2015. All the original authors of the GeoJSON spec participated in the WG: Howard Butler, Martin Daly, Allan Doyle, Sean Gillies (me), Tim Schaub, and Christopher Schmidt.

I scraped the WG email list and the geojson/draft-geojson GitHub repo for the names of other WG participants: Vladimir Agafonkin, Richard Barnes, Ben Campbell, Jose Manuel Cantera Fonseca, Micah Cochran, Simon Cox, Sergey Fedoseev, Atle Sveen Frenvik, Jérôme Gasperi, Pedro Goncalves, Blake Grotewold, Max Hartmann Friedrich, Chris Hills, Tõnis Kärdi, Éric Lemoine, Chris Little, Alexey Melnikov, Calvin Metcalf, Volker Mische, Matthias Müller, David Neufeld, George Percivall, Alexandre Petrescu, Paul Ramsey, Carl Reed, Maik Riechert, Peter Rushforth, James Seppi, Andrew Sheppard, Jerry Sievert, Scott Simmons, Raj Singh, Sergey Tolstov, Dirk-Willem van Gulik, Peter Vretanos, Christine Waigl, James Winterbottom, Jeff Yutzler, and Mohammed Zia. Two participants are identified only by their GitHub user names: breynolds, and roomthily. All these folks helped shape the RFC.

GeoJSON was also shaped by people playing specific IETF roles. The WG chairs, Martin Thomson and Erik Wilde, did a fine job of keeping the draft on track. Our Area Director, Alissa Cooper, was the first IETF member I talked to about chartering a working group and was a super guide throughout the entire process. IESG reviewers Ben Campbell, Stephen Farrell, Suresh Krishnan, Alexey Melnikov, and Kathleen Moriarty asked questions and made suggestions that greatly improved the final draft. I'm grateful to Mary Barnes and Cullen Jennings, the Dispatch WG chairs, for explaining how dispatch works at the IETF and inviting me to present remotely at IETF 92.

I'm grateful to Tom MacWright for all the GeoJSON explainers on his blog and for his rhetorical support. Tom regularly reminded the web – and me – why a GeoJSON I-D was worth the effort.

Stefan Drees was the one who really got this ball rolling with the first commits creating the technical framework for authoring the draft. Thanks, Stefan.

I did much of the draft editing at work and Mapbox paid for my attendance at IETF 93, where the proposal was dispatched and the working group charter was launched. I'm proud to work for a company that's committed to making the internet work better.


The changes from the Pre-IETF GeoJSON Format Specification published in 2008 at are listed at

To summarize:

  • Coordinate reference systems are no longer in the core of the specification; use CRS84 longitude and latitude with GeoJSON from now on.
  • Don't extend coordinate arrays with linear referencing measure, timestamps, or other variables.
  • Follow the math and physics right-hand rule (not the surveyor's right-hand rule) when forming polygon rings.
  • Construct bounding boxes so they are not ambiguous at the Earth's poles and antimeridian.
  • Do extend GeoJSON, but don't change its semantics.
  • Don't write longitude and latitude values with more than 7 decimal places of precision.
  • Avoid using GeometryCollection when possible.
  • Reference RFC 7946 from now on instead of

One change that we glossed over in that appendix is that the set of GeoJSON types is closed. Extensions can't, for example, add a "Circle" type. That doesn't mean that there will never be GeoJSON circles, ellipses, and curves, but that they must be added to the core by a future RFC.

Here's an important point that may be obscured by formalities: RFC 7946 does not define a "GeoJSON 2.0." This is "GeoJSON." If you need to be more specific, e.g., in describing support for deprecated features like "crs", you should refer to "2008 GeoJSON" vs. "RFC 7946 GeoJSON" or "application/geo+json GeoJSON." There is no "GeoJSON 2.0."

IETF process and people

I'm pleased to report that the IETF process works pretty much as described at Whenever I got baffled, I found helpful and generous people to point me in the right direction. I'm going to stay involved in the IETF in one way or another.

Bonjour, Montpellier

I woke up yesterday morning in Montpellier, France, my home for the next 12 months. Here is the view of our neighborhood from the roof.

I'm happy to be here, with the last week of house cleaning and travel preparation far behind me. The trip itself, except for delays, was easy. My kids and I (Ruth and our dog went 4 days earlier to save money) wrangled our bags through many halls, stood in many lines, sat in many seats, and emerged into sunshine just as our patience was about to end.

I haven't left the house except to run with my dog across the river to Castelnau-le-Lez, the village next door, and to walk around the neighborhood with my family after dark to enjoy the silence of vacation season, see the stars, and spot geckos hunting for insects under the street lights. Friends have come by to welcome us back and I've unpacked and stashed our empty luggage. In a few minutes I'm going to log in and begin to catch up on projects and look forward to going out to visit friends this evening. There are a bunch of tasks ahead of us this week: getting new phone service and bank accounts, school registration, meeting with a French tutor, and shopping for home and office supplies, but I'm going to put these off for a few more hours and enjoy a break from lines and service counters.

Crazy Legs 10K 2016

Yesterday morning I got out of bed at 5:00 a.m. to eat a bowl of cereal and a banana, drink a cup of coffee and a quart of water, and drive down Taft Hill Rd to Devil's Backbone Open Space for this year's edition of the Crazy Legs 10K trail run. Like last year, the weather was beautiful, the trail dry, the greenery very green. During the drive, I saw our Moon appear to go down directly behind Longs Peak. It is, of course, the other way around: the Moon, the horizon, and Longs Peak each move eastward relative to the stars, but the mountain's apparent velocity is 27 times faster.

I ran the steep and rocky course in 1:04 (unofficially), one minute faster than last year, and finished in 17th place (up 7 spots). Best of all, I did not fall on the trail's notorious rocks the one time I stumbled.

In my race packet, I found this.

A handwritten thank you note from the organizer to every entrant. A classy detail of a thoroughly classy event.

Colorado Marathon 2016

Sunday, the 1st of May, I started and finished my first Marathon.

The only thing I don't like about this race is the godawful early start. I know that the first weekend in May can be uncomfortably warm here and understand that an early start makes restricting traffic on CO-14 more feasible, but in order to eat and begin to digest an adequately sized blob of oatmeal before the 6:30am start I had to set my alarm for 3:30. At 4:30 Ruth and I were headed to a parking garage downtown and at 5:00 we were on buses to the starting line.

It was cloudy and dry downtown, but a little more wet in the canyon and about 14 miles up we reached the snow line. At the Stevens Gulch trailhead I saw about 4 inches of wet snow on unpaved surfaces. It was 34° F (1° C).

At the last minute before leaving the house, I had switched to a long-sleeved shirt under my ultralight wind/rain jacket and was glad I had when we arrived. I'd already committed to wearing tights, hat, and light gloves and found this to be just about right for the conditions. A more breathable jacket would have been better: I ended up slightly wet from the inside due to condensation and fairly cold between finishing my gel packs at mile 16 and reaching "Bagel Hill" at mile 19.

I had a hard time finishing. My hamstrings threatened to cramp up as I sped up on the last steeper downhill stretch around mile 12, but I survived that and was feeling pretty good until mile 18 when the quadricepds muscles in each of my legs began to cramp. I battled quad cramps of increasing frequency and duration the rest of the way in. The 3:45 flag that I'd been closing in on for an hour got away from me and the 4:00 flag passed me at about 20 miles. The final 6 miles were brutal: miles 20-23 were the worst, but once I crossed Taft Hill onto sections of the Poudre Trail I've run for almost 20 years, I regained enough confidence and energy and a sense of too-close-to-fail to put in a very modest kick at the end. My time was 4:24, which was just in the second half of all finishers.

I don't understand the cause of the cramps, but can think of a few factors which might be implicated. The course, while never steep, descended much more than any of my training runs, about 300 meters. It wouldn't surprise me if I wasn't quite in the stride that I'd been training for. Also, while I'd run farther than 18 miles in training, I hadn't done so at race pace. I was confident that I'd be able to go a bit harder/longer than I had in training without breaking down, but found I could not. I'm going to train a little more for the next one. Lastly, the week before the race was super hectic. I was fighting fires all day long and sleeping poorly at night, and wasn't as rested as I'd hoped to be.

Friends have been reminding me that it's super cool to finish my first marathon and I really appreciate this perspective: it was harder than I can expected and I'm satisfied to have been able to fight through a bit of adversity and finish.

Ruth's race went better. She had just returned from a speaking tour on April 30 and briefly considered bailing on the half-marathon to catch up on sleep and nurse our ailing dog, but ended up running very well with a personal best time of 2:00:12.