Turning the clock back to 2012, when volunteering with CRAMBA I worked with my friend Kristi and developed the Ride Dirt Trails, Not Mud Trails signage. Originally hosted on the CRAMBA page (Internet Archive) this has fallen prey to link rot, so I’m re-posting / re-hosting it here.
Back when this was released we very intentionally made it available it under the CC BY-SA 3.0 license along with an Adobe In Design template so anyone else could reuse the work and help spread the message to avoid trails when they are wet enough to be damaged via use.
Since then I’ve seen some variant of this used all across the country, from SE Michigan’s more mult-user friendly Muddy Day? Don’t Play! take to just-logo-swapped signage in Arkansas and Missouri Ohio to the text reused on signs at Knoxville’s flagship Baker Creek Preserve.
I love seeing this reuse because the whole point of the open licensing was to make it so others could build on our work. And here we are, twelve years later, and it’s still going strong.
Kristen and I have been spending a good deal of time in the Ishpeming and Negaunee area this year, and I’ve made it a personal goal to become more familiar the local trails — both RAMBA-supported and otherwise — and get them documented OpenStreetMap (OSM). Having these trails in OSM provides two big benefits: they appear in other mapping tools (such as OsmAnd, GaiaGPS, Strava, MapMyRide/MapMyRun) and the trail data can be freely used to build other tools.
Over the years of making trail maps with OpenStreetMap I’ve mostly produced PDFs for printing, leaving mobile and online mapping to other apps. These work well, but have the big downside of rendering routes with their style. That is, online maps via these tools’ show the routes, but look quite different from print maps, even if all the data for them to display more data (such as colour=* tags on relations) is in OSM.
While these apps work pretty well, and I use them myself routinely for navigation, I got the itch to see if I could make a web-based map that looked more like locally produced print maps than app-based renderings. It seemed like a good project, a good way to learn some basics of modern web development, and maybe make something useful.
What I ended up with was a slippy map of showing the RAMBA trails that uses layers of pre-rendered tiles to show the different official trail routes, placed over a background map. The map viewer is client-side JavaScript that loads static tiles from a basic web server, making this a very simple app to host (just a bunch of static files on a site).
In this post I intend to document the major steps of how I made this map, why I used the tools I did, and share the code to reproduce (and update) this build. Hopefully this’ll allow others to get their head around these map presentation basics, perhaps even reusing this work to make and host another map.
Update OSM Data
Mostly outside the scope of this article but worth a mention, a significant amount of time was spent ensuring that the RAMBA area trails are accurately listed in OSM. Without good data it would not be possible to go further, as the OSM data is the base data used to create other maps.
By combining information from a bunch of sources, and doing some personal surveying of trails while riding and hiking, I was able to get all of the official RAMBA trails documented, along with numerous other paths and tracks in the area. This building a complete picture of the usable trails in the area.
Information used to get the RAMBA trails in OSM included:
Hand-annotated map from Danny Hill listing local trail names.
These sources were combined in JOSM, cross-referenced, ways drawn and tagged, relations built out, and before long a complete picture of the RAMBA-area trails — official and otherwise — were in OpenStreetMap.
Most importantly, beyond documenting the trail locations, trails were grouped into route relations to show each official route, and then all the official routes were grouped into a superroute for all the RAMBA trails. As of time of writing, relation RAMBA Trails (12425503) is the superroute that aggregates the individual trail routes such as Epic Loop (8467869) and Malton Loop (8468010).
The result of this is accurate trail data that’s easy to query for and style using other tools.
Rendering Tiles with Maperitive
There are myriad ways to render tiles from OSM data, with most of these involving setting up a database server and a toolchain which’ll generate, cache, and serve tiles on demand. For most large data sets this makes a lot of sense, but for a small trail system I really wanted to use static tiles I could serve from a simple webserver.
Eventually I came across Maperitive, a desktop application for Windows that takes GIS data (including OSM), stylizes it with a relatively simple ruleset, and can generate tiles in the standard XYZ format for use elsewhere. It can also be scripted, which meant I could use it as part of an automated workflow to generate new tiles as the OSM data changes. This seemed like a good solution, so I set about writing some rulesets that would reasonably show the RAMBA trail routes and some automation around it all.
After a lot of experimenting I settled on a having separate tile set for each of the official loops, an overview of all trails, and a base map. The base map would always be shown, and a user can toggle between layers which highlight all the trails or individual loops.
After a few iterations of custom rules, I settled on a simplified set based on the Default.mrules file which comes with Maperitive for rendering the base map. The only modification was changing the font to Michael Adams’ Roadgeek 2005 Transport Medium font, as it looks nicer than the default, Verdana. For the overview and route layers I created simple rules based on the the default rendering of highway=path, using the Heavy version of the font. The rule for each trail route (relation) selects the trails in a given relation then colors them accordingly.
Creating these rules took a bit of fiddling, as Maperitive is both a bit of a dead project, not completely documented, and (in the latest Beta) sort-of buggy where sometimes the map display would stop updating. Still, even though I’m not great at making attractive things, I was able to come up with something that worked well enough.
Conveniently, Maperitive also comes with a command line version (Maperitive.Console.exe). After settling on rendering rules and a tile generation script, I used this as part of an automated workflow which downloaded OSM data directly then rendered each of the tile sets.
After tile generation I used a Windows binary of OptiPNG to losslessly compress the tiles, resulting in a ~62% space savings (original: 746MB, optimized: 286MB) which’ll reduce storage and bandwidth overhead.
The Front End
With tiles generated I needed a way to display them. It turns out that OpenLayers was easy to use and it all ran as simple client side application in a browser. By using npm and parcel, with Visual Studio Code for editing, it was quite easy to get the site developed, tested, and bundled up for deployment. The only component I had to add was ol-layerswitcher control, which provides an easy way to toggle between layers.
Prior to this I had very little experience with modern web development, with my exposure to JavaScript pretty much limited to reading others’ code to figure out what it’s doing. After a bit of confusion (and having to accept the hidden complexity of using an application bundler), I was able to focus solely on writing a single main.js file with a basic index.html that together do what I wanted:
Run full screen by default.
Show all trails by default, with toggles for the defined routes (layers of the map).
Show an attractive background map below the routes to show the rest of the area.
Offer controls to use geolocation to showing one’s location on the map and reset the view to the original map extents.
Look sane on desktop and mobile devices.
This ended up being much easier than I thought, and between the OpenLayers Examples and just some basic programming I was able to get something I’m happy with. Far more time was spent designing the tiles and thinking about what I wanted it to do than writing the code to display it all.
Tile Hosting
The actual map tiles are a number of small PNG files, and a typical session of viewing and panning around the map can result in hundreds of image loads. This was seeming a bit slow when being served from nuxx.net via HTTP/1.1, so I looked into using HTTP/2 to improve performance.
Unfortunately, it was not simple to turn on HTTP/2 here at nuxx.net as I’m using PHP for WordPress, which in turn requires MPM prefork, which precludes mod_http2. I could have set up another web server and such, but for now I’m hosting the tiles in AWS, with the tiles uploaded to an S3 bucket and served via CloudFront.
This should allow for better tile download performance than what I can do from my server. Despite potentially incurring a bit of a financial cost it is a good experiment in hosting tiles in the cloud. I may change this in the future, particularly if it becomes cost prohibitive, but for now it’s working well.
Follow Along At Home
If you would like to generate this same map, start by downloading this ZIP file: ramba_trails_map_code_1.0.zip. It contains the scripts and rules needed to generate the map tiles (ramba.mscript and the .mrules files), the index.html, main.js, and package.json for the OpenLayers-based front end, the .osm file used to generate the first release of the map, and a few batch files that tie it all together.
These batch files are included to will help you out, but may need some editing to fit on your environment:
fetch_osm.bat: Uses curl to download all OSM data within a bounding box that encompasses the Ishpeming/Negaunee area.
generate_tiles.bat: Runs ramba.mscript via Maperitive.Console.exe to generate the tiles.
optimize_tiles.bat: Copies the unoptimized tiles from the .../tile_output/raw output directory to the .../tile_output/optimized directory, then runs OptiPNG against the tiles to optimize them in place.
To build the web app you’ll need to install npm, parcel, create a new OpenLayers app as per the directions here. Then install ol-layerswitcher (npm install ol-layerswitcher), replace the default index.html, main.js, and package.json with the ones I provided, and you should be ready to go.
Updating the Map
As you can see, the map is two major pieces: the front end and the tiles. Whenever the map data changes in OSM the tiles can be regenerated to update those layers. The code for the front end web app only needs to change if the storage location changes, features are going to be added, etc.
Conclusion
This map has worked out rather well and I’m happy calling it v1.0. It’s been a great learning experience, and I’ve even managed to produce something useful that didn’t exist before: an interactive map of some of the most rugged single track trails in Michigan; one of my favorite places to ride mountain bikes.
It’s far from perfect, and there are some things I could do differently, but for now, I’m considering it a success. When in Negaunee for vacation last week I successfully used development versions of this map to find my way around, so I know it’s better than nothing.
If you find any quirks in the map data — such as trails with wrong names or in the wrong location — please take a screenshot and show me what’s wrong and email that to steve@nuxx.net. I’ve done my best to ensure the RAMBA trails are accurately mapped, but I’ve certainly missed some things.
Problems
No key or other ancillary information (such as logos) as are normally found on print maps.
No terrain. While 1m DEM elevation data is available from the USGS, I couldn’t figure out how to use it in Maperitive for generating hillshading.
No easy way to add clickable items to show additional info, link to external map apps (eg: for navigation).
Maperitive’s text rendering isn’t the best, resulting in goofy looking text at some zoom levels.
Long trails only have one label placed on the middle. Trails with one name broken into multiple ways will be labeled numerous times.
Due to being run in a browser it’s a sufficient, but not great, mobile experience. Specifically, selecting the geolocation, recenter, and layer controls can be fiddly because they are so small.
Does not work offline, but thankfully most of the RAMBA area now has good mobile data coverage.
Things To Investigate
Keep an eye on AWS cost and performance.
Look at Leaflet for the front end, as it seems a bit more modern.
Consider rendering map tiles with TileMill. This will add a lot of complexity both in setup and styling tiles, but once done should allow a lot more flexibility in styling and overcome most of Maperitive’s problems. mapbox/mbutil should work for getting XYZ PNGs out of MBTiles files.
Consider using a tile server if I don’t want to deal with discrete files.
Look more into using vector tiles with client-side styling. (I passed on this for now, as a GeoJSON file showing each of the route is a large download and had no benefit over raster tiles.)
Maperitive should run under Mono, and OptiPNG is available for many platforms, meaning it should be possible to reproduce this build under macOS or Linux. Note that the GUI for Maperitive will not currently run on macOS due to Windows.Forms currently being based on Carbon, which is not available for 64-bit macOS. So while the CLI should work, the GUI version isn’t currently compatible with macOS 11.5 (Big Sur) and higher.
Mapping trails in OpenStreetMap (OSM), using JOSM, is done by overlaying one or more data sources, then hand-drawing the trail locations using this background data as a guide. While not a default in JOSM, with a little know-how and a paid Strava Subscription the Strava Global Heatmap data for this can be used as well.
While there’s a fair bit of info about doing this scattered across some JOSM tickets (eg: #16100), this post is to document how I make this work for me by creating a custom Imagery provider. Because there isn’t an official (and robust) plugin to authenticate JOSM against Strava it’s a little tricky, but overall isn’t bad.
First, you need to sign into Strava, then go to the Global Heatmap and get the values of the three cookies CloudFront-Key-Pair-ID, CloudFront-Policy, and CloudFront-Signature. These values are essentially saved credentials, and by using them in a custom Imagery providerURL, JOSM will use these to access the Global Heatmap data via your account and make it available as an Imagery layer.
The easiest way to get these cookie values is to use the Developer Tools built into your web browser:
Launch your web browser, either Firefox, Chrome, or Edge.
Go to the Strava Global Heatmap, sign in if needed (check the Remember me checkbox), and be sure it’s properly displaying high resolution data.
Load the developer tools for your browser to show cookie details:
Firefox: Click the Hamburger Menu → Web Developer → Storage Inspector (or press Shift-F9), expand Cookies and click https://www.strava.com.
Chrome: Click the Three Dots Menu → More tools → Developer tools (or press Ctrl-Shift-I), select the Application tab, expand Cookies, then click https://www.strava.com.
Edge: Click the Three Dots Menu → More tools → Developer Tools (or press F12), select the Storage tab, expand Cookies, then click heatmap.
Get the value of three cookies, CloudFront-Key-Pair-ID, CloudFront-Policy, and CloudFront-Signature, and make note of them (in Notepad or such). You’ll need them to build the custom URL. Here’s examples of what the three cookies will look like:
Paste the string from Step 2 into Box 4, Edit generated TMS URL (optional), and then give it a name in Box 5, such as Strava Global Heatmap High-Res.
Click OK twice to return to the main JOSM window, and then try to use this layer over some existing data, just as you would aerial imagery.
If it doesn’t work, double-check your URL and be sure the entered cookie values are right, including the underscores after CloudFront-Policy and CloudFront-Signature. Also be sure you haven’t logged out of Strava, as this will expire the cookies. (If you make changes to the URL in JOSM you will need to delete the existing imagery layer and then re-add it to have the new URL used.)
These cookie values, in particular CloudFront-Signature, will occasionally change as cookies are expired and reset or if you log out of Strava. If things were working and then stopped, you may need to get new cookie values from your browser and update the TMS strings.
By default the TMS URL we started with shows the default heatmap, for all activity types, with Hot coloring. Depending on what other data you are working with it may be useful to show just Ride or Run data, perhaps in different colors. In the TMS URL, the first part after tiles-auth is the type of data, and the second is the color. By using this format, replacing [data] and [color], you can create additional heatmap layers:
Valid values for type of data: all, ride, run, water, winter.
Valid values for heatmap color: hot,blue, purple, gray, bluered.
Creating multiple layers, riding-only and running-only, of different colors was extremely useful when mapping Avalanche Preserve Recreation Area in Boyne City as cyclists tend to stick to the mountain bike trails and runners to the hiking trails. While I had orthorectified maps from both the city and TOMMBA, the separate riding and running heatmaps made the routes much clearer. In the example image above (link) I have the Ride data as color Hot and the Run data as color Blue; perfect for illustrating the mountain bike vs. hiking trails.
If you’d like to see this area as an example load the are around changeset 85690641 or a bounding box with the following values and see for yourself:
Many of the popular, long cycling events — or even just solo rides — require a GPS so that one can follow a route in order to navigate. While most of us have bike computers that will show the route, most folks don’t have a GPS with the kind of detailed base maps that become useful for detours, emergencies, or just as an additional tool… Much less something that works when outside of cellular coverage areas.
For this, I recommend you look at offline maps using OsmAnd.
I have (and love) the Garmin Edge 130 as it’s perfect for my riding and training. It’s been great for displaying recording data and following routes from the unmarked 100 mile versions of The Crusher and Barry-Roubaix, to augmenting signage in Marji Gesick and following a route through remote parts of Batchawana River Provincial Park. But occasionally I need a bit more; something to help find a detour around a flooded road, a quick way back to the car in a rainstorm, or just a sanity-check of which branch to take at a fork on the road.
Sure, I could buy a super-high-end bike computer that features detailed base maps, but I rarely need these and don’t want the physically large computer on my bike. So I use my phone, running OsmAnd, loaded with offline maps that display without requiring a data connection. Coupled with putting one’s phone in Airplane mode (turns off the cellular and WiFi radios and saves battery — yet GPS still works) a modern phone will typically get days of battery life while sleeping, with maps and a route quick to access.
Whenever I actually need to see this map I simply pull it out of my pocket or bag, wake it up, get what I need from the map, and carry on. No screwing around with a small touch screen and funky zooming on a Garmin or Wahoo. (I believe that, to date, neither Garmin nor Wahoo have made map perusal as straightforward as it is on a basic mobile phone.)
This is also a great way to get maps on your phone when traveling somewhere costly for cellular data, like during a day-trip to Canada.
Whether you’re doing Marji Gesick or The Crusher or just following a route found on a cycling club’s website, I recommend augmenting your navigation with offline maps in OsmAnd by doing the following:
Visit the OsmAnd site and follow the links to your phone’s store to install the software.
Get a copy of the GPX file on your phone; for Android phones this is often as simple as visiting the download website and downloading the file.
In OsmAnd‘s menu, pick Download Maps and download maps for the regions you want. I personally have Standard Maps, Contour Lines, and Hillshades for Michigan installed all the time, and then if traveling will install for other states/provinces/countries.
Once the offline maps are installed, pick Configure map from the menu, then Map source, and ensure Offline vector maps are selected. The default, OsmAnd (online tiles), is an online map source that requires data.
To display a particular route, pick GPX files…, Add More…, and then browse your phone to add the downloaded GPX file. Ensure this file is enabled (checked), and then go back to the map screen.
You’ll now see the route overlaid on offline maps, easy to zoom in and out of and find your way around. Try turning on Airplane Mode and see that it all still works.
Once I have everything set up, here’s some tips about how I actually use OsmAnd while out on my bike:
If in an area with minimal or no cellular service, put the phone in airplane mode so the battery doesn’t get used up while it searches for a signal.
Turn off all lock features on my phone (fingerprint / pattern / PIN unlock), so I can wake it up with just a press of the power button.
If I’m at a spot where I’m not quite sure which way to turn (based on the single line on my Edge 130), use the map to figure out which branch to turn on. Even the remotest of fire roads and two track are often mapped.
If I think I might have missed a route sign (say, in Marji Gesick) I’ll use OsmAnd to see if I’m still on route, and to get back if needed.
Look for other nearby roads or trails if I need to detour or shortcut back. I had to do this yesterday during the Founders Fall Fondo as part of the 62 mile Barry-Roubaix route was flooded.
Many small, old, sometimes abandoned, yet somewhat navigable roads are still listed in the OpenStreetMap (OSM) data that OsmAnd uses. While these aren’t great for cars and won’t show up on things like Google or Apple Maps, they are often quite useful when on a bike. Look to these for exploring / finding new routes.
Many trails open to mountain bikes are included in the OSM data. This includes all CRAMBA trails and most trails in the NTN and RAMBA areas. (Note: Trailforks is a better source for discovering MTB trails themselves.)
Periodically update maps to get new OSM data. As roads and trails change, maps get updated.
Pay For OsmAnd+ Live ($5.99/year) to get access to more-frequent, automatic map updates and support the open mapping community.
While this is just a basic overview of using OsmAnd and how I use it when cycling; it does a whole lot more including recording routes, navigation, editing map data, sharing location between contacts, and more. Give the online Help and Features a look for more information.
Back in 2012 I wrote What Do I Carry When Riding My Bicycle? to show what I carry to be prepared for long mountain bike rides with a pack. Six years and some refinement and reduction later, it’s time for an update.
I like to do longer — but single day — rides, summer and winter, on any kind of MTB from XC to trail to fat bikes. My gear tends to stay the same for everything from an endurance race to a long day on dirt roads linking together parks, back country rides during a road trip to the typical after-work roll around a suburban park. None of these require the bike packer-level of supplies, but feeling assured that a surprise situation will be manageable does require a bit of planning. Since water and primary food (typically ERG! Energy bars and Infinit Nutrition mix) varies by ride I won’t be covering it here, but my pack and pockets have plenty of room for extra drink mix and food.
Almost everything I carry is because it was needed at some point in the past, and I like knowing that my gear is consistent between rides. When doing MTB rides I almost always wear a pack, only leaving it behind during shorter races where I’m trying to be competitive or rides where I’m okay with walking out should something happen.
My current pack is an Osprey SYNCRO 10 in Velocity Green color, M/L size. This is a high vis yellow/green that I chose because it both helps me be seen and it stays cool in the sun. Having a thin metal frame and mesh back keeps the pack away from my body which keeps me cooler in summer avoids a sweaty back in winter. A replacement badge from the Sport model Road ID is slipped over the elastic on the upper part of the left strap near my head, providing easily-visible identification and emergency contact info.
While many folks are moving to frame bags and waist packs, I’ve stuck to a pack because it allows me to carry a lot of water, easily transition gear between bikes, and it doesn’t rub on the frame. Frame packs seem like a great option and work out well for many folks, but as of now they just aren’t for me.
Here’s the two setups, summer and winter, tiered to show how things are packed:
Extra gloves, head covering, and jacket, depending on conditions, planned length and effort of ride, location, etc.
This all has worked out well for me, being able to handle situations from cut tire sidewalls to puncture flats, broken chains and derailleurs to detached front brake cables.
I’m not normally one to do a list on all the places I’ve ridden in a given year, but this map from RubiTrack — my preferred offline ride tracking application — changed my mind for this year. In my personal life it’s been quite an interesting year or so, and I took advantage of of that to travel a bit more. Some of these were with my amazing girlfriend Kristen, some with friends, and some by myself. Whatever way, it made for some great riding.
Calculated via Strava, I ended up with 261 rides totaling 5928 miles over 503 hours 22 minutes and climbing 234,394 feet.
Here’s all the different places/trails that I was fortunate enough to ride, broken down by state:
Earlier this year CRAMBA took on a project to install durable trail marking at River Bends Park using fiberglass marking posts and decals from Rockart. After installation a significant lingering issues was the visibility of the decals for the Single Track: Yellow (Main Trail) sections. The stock Rockart decals (eg: 10-124) are a single color printed over a reflective white base, and even with ordering gold color decals (eg: 10-124-10, a darker yellow) the contrast was so low that the arrow was hard to see.
We considered a few different options including custom decals, hand-tracing the arrows with markers, or re-coloring this loop, but settled on retrofitting the existing decals with cut vinyl outlines. One of our volunteers — Ken Markiewicz — made short work of getting us enough cut vinyl to fix up all the signs in the park, and as seen above it’s radically improves the visibility of the decals.
This template contains outlines for both the 10-124 (straight) and 10-125 (diagonal) decals. Outlines are 2.5mm wide with the outer curved square placed evenly over outer colored/white edge and the arrow inset on the white area. We found this provided the best result for keeping the arrow visually separate from the outline.
For years I’ve been pretty enthusiastic about OpenStreetMap (OSM) and using it to map trails (MTB and otherwise). While there are a bunch of other ways to map trails online (Google Maps, MTB Project, Trailforks) I have stayed away from contributing to them because of the one-way nature of submissions; your contributed data gets locked behind their license. While MTB Project and Trailforks both claim to allow some manner of reuse of data, it’s nothing as useful as OSM‘s Creative Commons (CC) based licensing. Effectively being the Wikipedia of GIS makes it extremely useful for those of us who want to both contribute data and build open maps on the larger set.
Then suddenly last night I read this article on Pinkbike discussing how they took OSM data, parsed it to highlight mountain biking routes, and are now using it as the base map for their Trailforks mapping site. They built a tool on top of the open data and made something great.
This is really, truly excellent.
This sort of reuse of public, open data in OSM is the exact reason why I contribute to it. The folks at Pinkbike / Trailforks have taken a useful set of data from all over the world, processed it, and made something good. This would not have been possible with the data locked up in Google, MTB Project, or even the stuff contributed directly to Trailforks.
I look forward to where this’ll go. The Pinkbike article mentions that they’ll be reimporting the data a little different in the future, and talks about how they are going to have another article about tagging to better support Trailforks. While OSM has some minimal standards for MTB tagging (eg: mtb:scale:imba) I look forward to a bit more de-facto standard around this.
A few months back I happened across this page on fat-bike.com about Ken Blakey-Shell and Scott Quiring riding part of the Little O ATV Trail on fat bikes and wanted to try it myself (Video 1 · Video 2). A mutual friend put me in touch with Ken, and within a few days I’d received a boatload of excellent information about where to ride in the area. Ken encouraged me to share the info, so I’m posting it here for public consumption. While I haven’t ridden any of these trails yet myself, the routes sound excellent and something I hope to do in mid-June.
I’m really excited about riding these. Back-country rides like this are something I love, and new trails to explore sound wonderful.
Here are the suggested routes as Ken emailed them to me. I’ve edited these slightly add links, GPX copies of routes, etc, but it’s otherwise his words:
Little O ORV Trail / North Country Trail
The Little O ORV Trail (PDF Map) / North Country Trail (NCT) figure 8 just north of M10 is the easiest and least technical. It is 50% NCT and 50% moto trail with a around half of the moto trail being super good and the other half of it being only ok. The moto trails are fairly sandy and are best on a 4″ tire fat bike setup although 29+ and 26×5″ work OK too. Regular MTB is a no go. The moto trails are wider (4 wheelers use them too) with lots of banked corners and whoops. There are some extended downhills that are super fun. The other half of the ride is on NCT which is awesome in its own right. There is some significant climbs on this loop but it is all pretty gradual and none of the downhills are very sketchy. I normally start and finish on the northern end of the 8 but you could just as easily start at Timber Creek on M10 and ride NCT a little ways to connect up with the figure 8 loop.
This is the shortest route cutting out part of the upper 8. If pressed for time, fitness… this gets all the best parts: Strava · GPX
The other two routes I recommend are between Manistee and Cadillac. One route is north of M55 and the other is south of M55 and both start at the Caberfae Snowmobile Trailhead. Both routes are a combo of moto trail and two tracks. The moto trail is a lot more technical than anything I have seen for MTB trail in the LP – I often describe them as the most non-IMBA approved trails in the world. They go straight up and down hills, have tons of water erosion caused trenching, exposed roots and rocks and are really challenging on both the up hills and down hills. There are tons and tons of whoops and bermed corners. Unlike the Little O which is a wider 2 track type trail, these trails are tight singletrack. Quiring and I find these trails to be the most fun of any trails we have ridden in the state but you have to like a challenge to fall in that camp. 29+ is the ideal setup but 4 or 5″ fat bikes work great too. You may be able to ride a regular MTB but it would be tough. You can combine the two loops if you want into a monster ride but you need to be in top shape (both upper body as well as normal riding shape) because you are going to get worked. Both loops are equally good so it is a coin toss which to do. I normally break people in on the north loop first because you start out on one of the best downhills around as soon as you start riding the ORV trail.
Here’s some heavily annotated map snippets that Ken has graciously provided. The base image for these comes from the National Geographic’s Trails Illustrated maps of the Manistee National Forest: 758 Manisteee National Forest, North Trail Map and 759 Manistee National Forest, South Trail Map. I strongly suggest buying the base maps, as the additional context is necessary to find your way to the trails and for understanding the area. These maps appear to be a great compilation of road, ORV trail, and North Country Trail maps all in one. No other map that I’ve seen as clearly shows how they all overlay; something which is incredibly useful for hikers and mountain bikers alike:
For the first time in my life, I’ve broken a derailleur hanger. Yesterday when riding at Bald Mountain Recreation Area, a few miles from my car which was parked at Addison Oaks, I heard a thunk and looked down to see the derailleur in a rather awkward, unhelpful position (photo). Sunset was coming soon, and while I had lights the Oakland County Police who patrol Addison Oaks† are not fond of those who are in the park after dark, so I had to do some quick thinking to get back to the car.
Along with breaking the derailleur hanger, the derailleur cage itself was twisted, so I figured there was no way to get rolling without making the bike a single speed‡. I removed the derailleur, strapped the cable and housing back, broke the chain, and re-connected the chain in the best gear combination I could identify for decent chain tension. While there were occasional shifts up and down the cassette as the chain bounced, this worked well until I was climbing the final hill before Lake George Road.
With a bang the chain had ridden one cog on the cassette higher than intended, tensioning the whole assembly so tightly that I couldn’t turn the cranks. Opening the quick release rear skewer transferred tension to the skewer, bending it, and making things worse. Since the bike would freewheel my only choice at that point was to walk the bike out, hopping on to coast down hills. Thankfully I was only two miles from the car at this point.
I’m still not exactly sure what happened to cause the break, but I can’t help but suspect that yesterday’s crash had weakened it somewhat. Even though was shifting fine and the derailleur appeared straight, I suppose this could have played some part?
Once I got home I set to fixing the bike, and thanks to having a spare derailleur (leftover from making the El Mariachi a 1×9) and basic parts like a spare derailleur hanger, chain, and cable, I was able to get the bike working nicely again. It also gave me a good reason to wash the bike and clean Orange Seal residue from the tubeless valve stems. When the chain bound one cog on the cassette became slightly bent, so now it makes a bit of noise when riding, but it wasn’t noticeable on a test ride. I’ll try to bend it back when I next have the cassette off the bike.
The photo above shows the broken derailleur hanger, and what I believe to be plastic deformation. I find the stretching of the laser etched “Wheels Mfg Droput-25” logo to be particularly fascinating, as it shows how the aluminum stretched before failing. The thin, torn off sliver is interesting to me as well.
After the work my bike is back in order, and while everything seems in place, I need to give it a shakedown ride before I’m willing to take it out on remote trails. With luck I’ll be able to squeeze this in tomorrow morning.
† It seems that junior / trainee officers are regularly assigned to Addison Oaks, and they seem to take a hard line which makes them less than pleasant to deal with. While a broken bike likely would have been a fine excuse for being in the park after dark, I didn’t want to deal with this.
‡ In retrospect after inspection at home, I probably could have gotten the bike well enough to ride out with a new hanger. I’d have had to deal with a bunch of mis-shifts, but at least I wouldn’t have bound the chain and had to walk. This is what I should have done… Oh well, at least it was a nice day and now I have a story.