Skip to content →

diego.org Posts

Why Are There So Many Toyota Priuses in Mongolia?

One of the first things I noticed in Ulaanbaatar was the number of Toyota Priuses.

They were everywhere: parked along side streets, inching through traffic, working as taxis, and heading out of the city. Mostly second- and third-generation models, they seemed almost as common as the pickup trucks and rugged four-wheel-drive vehicles I had expected to see.

A low-slung Japanese hybrid might seem like an unlikely national car for a country known for bitter winters, rough roads, and enormous distances. But the more I learned—and the farther we traveled—the more Mongolia’s affection for the Prius made sense.

Almost half of recent imports

The numbers are remarkable.

Between January 1 and March 25, 2024, Toyota Priuses imported from Japan accounted for 47 percent of the vehicles Mongolia imported.

In April 2026, CNA reported that, according to Mongolia’s Ministry of Road and Transport Development, hybrids represented about 45 percent of the country’s roughly 1.5 million vehicles. The vast majority of those hybrids were Priuses.

This is not simply a case of one model selling particularly well. Mongolia has built an entire automotive ecosystem around the Prius.

Why Japan sells so many used cars

It is sometimes said that cars in Japan must be taken off the road after a certain number of years. That is not quite true.

Japan does not impose a maximum age on cars. Owners can keep a vehicle indefinitely as long as it remains registered, properly maintained, and able to pass the country’s vehicle-inspection system, known as shaken.

A new private passenger car receives an inspection certificate valid for three years. After that, it must be renewed every two years. Renewal involves the inspection itself, compulsory insurance, weight tax, and any maintenance or repairs required for the car to pass.

The inspection does not automatically condemn an older car. The issue is economic. As a car ages, its resale value falls while the cost of keeping it registered can rise. An OECD report found that Japanese ownership costs for conventional vehicles increase after 13 years, with higher road and inspection-related charges intended partly to encourage the adoption of newer, more efficient cars.

At some point, an owner may be facing a new round of inspection fees and repairs on a car worth relatively little in Japan. Replacing it often makes more financial sense than keeping it.

That does not mean the car has reached the end of its useful life. It has simply reached the end of its economically attractive life in Japan.

Japan consequently has an enormous used-car export industry. In 2025, it exported approximately 1.49 million used passenger vehicles to countries around the world. Mongolia receives only a portion of them, but it has become an especially important destination for used Priuses.

From a Japanese auction to Mongolia

Many of Mongolia’s Priuses are purchased through Japan’s large vehicle-auction system.

A World Bank-supported study of transportation in Mongolia describes a surprisingly complicated journey. Importers buy cars at physical or online auctions in Japan. Logistics companies move them to a Japanese seaport, where they are loaded into shipping containers—often four or five cars at a time.

The containers travel by sea to Tianjin, China. After being processed there, they continue by rail to the Mongolian border at Zamiin-Uud and eventually make their way to Ulaanbaatar and dealers around the country.

The Prius trade is large enough to include mass wholesalers importing thousands of cars per year. By the time one appears for sale in Mongolia, it may have passed through a Japanese auction house, a port, a container ship, Chinese customs, and a transcontinental railway journey.

Why the economics work in Mongolia

Fuel economy is a major part of the appeal.

Fuel costs are a major part of the appeal, and Ulaanbaatar traffic provides exactly the kind of slow, stop-and-go driving in which a hybrid works well. A recent study of electric mobility in Mongolia estimated fuel consumption of about 5.7 liters per 100 kilometers for a Prius 20-series—the second-generation model—compared with approximately 11 liters for the conventional Toyota Corolla used in the same comparison.

For years, Mongolia’s tax policies also favored hybrids over comparable gasoline-powered cars. Although some of the original exemptions have since been reduced, importing a small-engine hybrid remains relatively attractive.

The cars themselves are inexpensive because they arrive used. And because there are so many Priuses in Mongolia, parts are widely available and mechanics have become highly experienced at repairing them—including diagnosing and rebuilding their aging battery packs.

That creates a cycle: a common car is easier and cheaper to repair, which makes it more attractive to the next buyer, which puts even more of them on the road.

Adapted for Mongolian roads

A surprising number of the Priuses we saw appeared to have been modified for Mongolia.

Many sat noticeably higher than a stock Prius. Others had larger or more aggressive-looking tires, presumably to gain a little more ground clearance and traction on dirt roads. Some carried roof racks, spare tires, or other equipment that would have looked more natural on an SUV.

I couldn’t find any statistics showing how many Mongolian Priuses are modified, but it was common enough to be noticeable.

Lifting one of the second- or third-generation Priuses common in Mongolia does not turn it into a four-wheel-drive vehicle. Those models remain front-wheel-drive cars with limited suspension travel and vulnerable components underneath. Larger tires and extra ground clearance can nevertheless make them more practical on rutted roads, where the biggest problem may be avoiding rocks or keeping the center of the road from scraping the bottom of the car.

Owners seem to adapt the Prius just enough to make it work.

The Prius that joined a four-wheel-drive caravan

One day while we were camping, a large caravan of vehicles came through. Nearly all of them were four-wheel drives—the kind of vehicles you would expect to see traveling through that terrain.

But there was also a Prius.

The route included a steep, technical section covered in large rocks. Even the four-wheel-drive vehicles had a difficult time getting through it. Then it was the Prius’s turn.

It obviously could not make the climb on its first attempt. But the driver kept trying.

For close to 30 minutes, the Prius attempted different lines up the rocky section. It would move forward, lose traction or run out of clearance, and try again. Eventually, all of us walked over to help.

With a group of people pushing—and presumably with the driver wondering whether bringing a Prius had been a good idea—we managed to get it up and over the rocks.

The remarkable part was not that the Prius struggled. The obstacle had challenged actual four-wheel-drive vehicles. The remarkable part was that the Prius was there at all—and that its driver fully expected it to try.

By that point in the trip, perhaps we should not have been surprised. In Mongolia, a Prius is apparently allowed to join the caravan.

More capable than it looks

The Prius was designed as an efficient city car, not an off-road vehicle. Mongolia does not appear to have received that message.

Priuses can be found far beyond Ulaanbaatar, traveling roads that would make many owners elsewhere turn around. They are not substitutes for the Land Cruisers, Russian vans, and other four-wheel-drive vehicles used for the most difficult terrain.

But the Prius is cheap enough, efficient enough, and apparently tough enough to go much farther than its designers probably imagined.

Its popularity also gives owners a certain freedom to experiment. If parts and knowledgeable mechanics are available almost everywhere, taking an old Prius down a rough road becomes less intimidating than doing the same thing in a rare or expensive vehicle.

A Prius does not qualify as an EV in Mongolia

As I mentioned in my post about Mongolia’s different license-plate colors, Mongolia now uses green plates for qualifying electric vehicles.

Under the current policy, green plates are reserved for battery-electric vehicles and range-extended electric vehicles. An ordinary Prius is a gasoline-electric hybrid, not a battery-electric vehicle, and does not qualify. Plug-in hybrids are also excluded and continue to receive regular white plates.

With so many Priuses on the road, a green plate is a useful distinction. It identifies a vehicle in Mongolia’s electric category, not simply one of its hundreds of thousands of hybrids.

The battery problem

The Prius boom also has a downside.

Many cars arrive in Mongolia after years of use in Japan. Some are sold after their original battery warranty or service coverage has expired, when replacing a complete battery pack would be difficult to justify in the Japanese market.

Mongolia’s repair industry has become remarkably resourceful. Mechanics open the nickel-metal-hydride battery packs, test their individual modules, and replace the ones that have failed. Usable modules from several old batteries can be combined to keep another Prius on the road.

Eventually, however, the modules can no longer be reused.

My daughter had heard that there was a large warehouse full of discarded Prius batteries in Ulaanbaatar. A recent investigation suggests that story was substantially true—although “warehouse” may be too formal a word for it.

In April 2026, CNA visited an anonymous vehicle-repair garage on the outskirts of the city that had become an unofficial center of Mongolia’s depleted Prius-battery network. The owner, whose name was withheld, claimed that he collected nearly every dead Prius battery from Ulaanbaatar and beyond.

At the time of CNA’s visit, the owner said he was storing approximately 50,000 depleted Prius battery packs, reportedly accumulated since the beginning of 2025.

The number is the owner’s estimate rather than a verified government count. But researchers have independently documented an informal network of collection points around Ulaanbaatar where end-of-life automotive batteries are bought and stored. There are no national standards governing how hybrid batteries should be inspected, stored, or processed.

The garage owner had previously collected batteries for export and recycling in Japan. According to CNA, that route became blocked in early 2025 by new legal restrictions and rules preventing hazardous material from being transported through Mongolia’s neighboring countries. The batteries continued arriving, but they could no longer leave.

Mongolia opened its first dedicated lead-acid battery recycling plant in 2024. That is useful for the conventional 12-volt batteries found in nearly every car, but the plant cannot process the high-voltage nickel-metal-hydride packs used by older Priuses. Those require different equipment and procedures.

The reported stockpile is therefore not a recycling facility. It is the physical result of a system with a way to import hybrid cars, repair their batteries, and collect the depleted parts—but no completed final step.

The Prius helped make fuel-efficient transportation affordable in Mongolia. But when Japan exports the useful second life of a hybrid car, responsibility for the end of that life travels with it. Mongolia receives both the car and the battery that will eventually need somewhere to go.

Mongolia’s unofficial national car

Before visiting Mongolia, I associated the Prius with commuting, paved streets, and carefully calculated fuel economy.

Now I also associate it with Ulaanbaatar traffic, Japanese auction stickers, raised suspensions, oversized tires, dusty tracks—and a group of people pushing one over rocks while a convoy of four-wheel-drive vehicles waited.

The Toyota Prius may not be Mongolia’s official national car. But judging by the roads, it has a convincing claim to the title.

Sources

Comments closed

SwiftTip 1.5 is Now Available

SwiftTip 1.5 is now available on the App Store for free.

What’s new in SwiftTip 1.5

  • Customize up to seven quick tip percentages, or enter any custom tip from 0% to 100%.
  • Choose Exact, Round Tip, or Round Total with clearer controls.
  • Split bills between up to 20 people while keeping the full tip and total visible.
  • See refreshed themes, stronger contrast, and a redesigned Settings experience.
  • Use improved support for larger text and VoiceOver, along with more reliable currency calculations.

I originally created SwiftTip in 2015 for two reasons—and both are in its name.

First, I wanted a quick, free way to calculate a tip. Most tip calculators felt clunky and slow, so I built one designed for just a few taps and swipes. The goal was to calculate a tip swiftly and get back to your meal.

Second, SwiftTip was one of my first chances to build something with Apple’s new Swift programming language. It was a practical way to learn the language while making an app I would actually use.

Over the years, SwiftTip has remained both a useful utility and a small experiment. I’ve updated it to try new Apple APIs, Swift language features, operating-system capabilities, and evolving iOS design patterns.

This release continues that dual purpose: a modern, fast tip calculator—and a chance to keep exploring what’s new in Swift and iOS.

Learn more about SwiftTip or download it for free from the App Store.

Comments closed

Me 3.1: Share Your Contact, Your Way

Me 3.1 is now available for free. This release makes it easier to keep your contact details close at hand—and more importantly, to share the right version of them with the right person.

What’s new in Me 3.1

  • Saved sharing profiles let you create reusable choices such as Personal, Work, or Networking.
  • QR contact cards let anyone scan your selected details, including people using Android.
  • Send to Myself adds a Share Sheet extension for quickly moving files into a new email to yourself.
  • Widgets, Siri, and Shortcuts put your preferred contact details one tap—or one voice request—away.
  • A refreshed sharing flow, onboarding experience, and new app icon round out the update.

A small app with a long history

I first created Me in 2009. At the time, its purpose was simple: I wanted a fast way to pull up my own contact information whenever I needed it. No digging through Contacts to find my phone number, email address, or mailing address.

Over time, Me became more useful as a way to share my contact information. My contact card has a lot of data, and I do not always want to give all of it to every person I meet. Me made it possible to share only the specific fields I wanted: perhaps a work email address and phone number, but not a home address or other personal details.

Apple has since brought selective contact sharing into iOS, which is genuinely useful. In a sense, Apple “Sherlocked” one of Me’s best features. But sharing is still contextual, and Me 3.1 improves on that idea with saved sharing profiles. I can now set up a Personal profile, a Work profile, or any other combination of contact details, then choose the appropriate one without rebuilding the selection each time.

Beyond AirDrop

AirDrop is a great way to share a contact between Apple devices, but it does not help when the person standing in front of you uses Android. Me 3.1 adds QR contact cards so you can share your selected details with anyone who has a QR code reader. They scan the code, add the contact, and you stay in control of what was included.

The underlying idea has not changed since 2009: your contact information should be easy to reach and easy to share. Me 3.1 simply gives that idea more useful, more private, and more flexible ways to work.

Lean more about Me or Download Me for free on the App Store.

Comments closed

What Mongolia’s Different License Plate Colors Mean

One of the small things I started noticing while traveling around Mongolia was that vehicle license plates came in several different colors. Most were white, but we also passed cars and buses with yellow, dark blue, red, green, and black plates.

The colors are not decorative. In Mongolia, the background color tells you what kind of vehicle you are looking at—or who owns it.

The quick guide

Plate colorWhat it means
WhiteRegular vehicles
🟡 YellowPublic passenger transportation, including buses and taxis
🔵 Dark blueVehicles owned by the national or local government
🔴 RedDiplomatic vehicles
🟢 GreenQualifying electric vehicles
BlackSpecialized technological-purpose vehicles

White: regular vehicles

White plates with black characters are the standard plates seen on most cars, motorcycles, and trailers. Calling these “private” plates is close, but “regular” is more accurate: the category covers ordinary vehicles that do not belong to one of the special groups.

A typical plate contains four numbers followed by three Cyrillic letters. On the plates we saw, the first two letters identified the registration area. Several combinations—including УБ, УН, УА, УЕ, and УК—were used for Ulaanbaatar. БӨ identified Bayan-Ölgii, ХӨ Khövsgöl, and ӨМ Ömnögovi.

Modern plates also carry two small national identifiers: Mongolia’s red Soyombo symbol on the left and an oval MNG mark between the numbers and letters.

Yellow: buses and taxis

Yellow plates with black characters identify vehicles used for public passenger transportation. That includes city and intercity buses as well as licensed taxis.

The distinction is narrower than simply “commercial vehicle.” A business-owned car or an ordinary cargo truck does not automatically receive a yellow plate merely because it is used commercially.

Mongolia’s vehicle-registration rules even account for a vehicle entering or leaving public passenger service: it can keep the same number and letter sequence while exchanging the yellow plate for a regular one.

Dark blue: government-owned vehicles

Dark blue plates with white characters identify vehicles registered as property of the national or a local government.

Mongolia began changing these vehicles to dark blue plates in 2023. The stated idea was to make publicly owned vehicles easier for everyone to recognize, discourage their use for personal errands, and improve public oversight.

This makes the color more than an administrative classification. It lets anyone standing on a street see when a vehicle belongs to the government.

Red: diplomatic vehicles

Red plates with white characters belong to diplomatic missions and qualifying diplomatic personnel. These plates use the Cyrillic prefix ДК, followed by four numbers.

The first pair of numbers can identify the country or organization. For example, published lists have used 19 for the United States and 32 for the European Union.

Green: electric vehicles

Green plates with white characters identify qualifying electric vehicles.

This category was particularly timely during our trip. In May 2026, Mongolia’s Ministry of Road and Transport clarified that green plates would be issued to battery-electric vehicles and range-extended electric vehicles. Conventional hybrids and plug-in hybrids do not qualify under that policy. The ministry specifically named common Japanese imports such as the Toyota Prius and Aqua as vehicles that would not receive green plates merely for being hybrids.

Qualifying green-plate vehicles are also exempt from Ulaanbaatar’s license-plate-based driving restrictions, giving drivers another reason to choose an electric vehicle.

Black: technological-purpose vehicles

Black plates with white characters are used for specialized technological-purpose vehicles and machinery.

Some informal explanations describe every black Mongolian plate as military, but that is not accurate. Mongolia’s civilian plate standard assigns black to the technological category, while vehicles used by the armed forces, border troops, and internal troops are governed separately.

A small system hiding in plain sight

Before learning what the colors meant, I saw them as just another unfamiliar detail. Once I understood the system, traffic became a little more readable. A yellow plate was carrying passengers. A dark blue plate belonged to the government. A red one was connected to a diplomatic mission. A green one was in the qualifying electric-vehicle category—not just one of Ulaanbaatar’s many imported Priuses.

It is a simple visual language, and once you know it is there, you start reading it everywhere you go.

Sources

Comments closed

Batch Renaming Files in DEVONthink Pro with Batch Process

If you’ve been using DEVONthink Pro for a while, chances are you’ve accumulated thousands of documents with a naming convention you’d now like to change. I recently found myself in this exact situation, and DEVONthink’s built-in Batch Process tool saved me hours of manual renaming.

My Use Case: Switching to ISO Date Format

For years, I named all my notes and documents using the format YYYYMMdd-title, like 20250101-notes. It worked fine, but I eventually decided to switch to the ISO 8601 standard format: YYYY-MM-dd-title (e.g., 2025-01-01-notes). The hyphens between date components make it much easier to read at a glance.

The problem? I had thousands of documents in the old format.

Why Not Use Name Mangler?

On macOS, I typically use Name Mangler for batch renaming files in Finder. It’s a fantastic tool for filesystem operations. However, DEVONthink manages its own database, and renaming files through Finder doesn’t work the same way. I needed a solution that worked directly within DEVONthink.

Enter Batch Process.

What is Batch Process?

Batch Process is a powerful built-in tool in DEVONthink Pro that lets you apply a sequence of actions to multiple selected items. You can create reusable configurations for tasks you perform frequently, including renaming files using regular expressions.

Creating a Batch Process Configuration

Here’s how I set up a configuration to convert my date format:

Step 1: Select Files and Open Batch Process

  1. Select one or more files in DEVONthink that you want to rename
  2. From the menu, choose Tools > Batch Process > Batch Process…

Step 2: Create a New Configuration

  1. In the Batch Process dialog, click the + button at the bottom left to create a new configuration
  2. Give it a descriptive name (I called mine “ISO Date”)

Step 3: Configure the Actions

You’ll need two actions to perform the rename:

Action 1 – Scan the filename: – Set the first dropdown to Scan Name – Set the second dropdown to Regular Expression – Enter the regex pattern: ^(\d{4})(\d{2})(\d{2})(.*)$

Action 2 – Change the filename: – Set the dropdown to Change Name – In the “to” field, enter: \1-\2-\3\4

Understanding the Regular Expression

Let me break down how this regex works:

PatternMeaning
^Start of the filename
(\d{4})Capture group 1: exactly 4 digits (year)
(\d{2})Capture group 2: exactly 2 digits (month)
(\d{2})Capture group 3: exactly 2 digits (day)
(.*)Capture group 4: everything else (the title)
$End of the filename

The replacement pattern \1-\2-\3\4 then reconstructs the filename: – \1 = the year (2025) – - = literal hyphen – \2 = the month (01) – - = literal hyphen – \3 = the day (01) – \4 = the rest of the filename (-notes)

So 20250101-notes becomes 2025-01-01-notes.

Running the Batch Process

Once your configuration is saved, using it is simple:

Step 1: Select Files to Rename

Select the files you want to convert. You can select multiple files, an entire folder’s contents, or use DEVONthink’s smart groups to find all files matching your old naming pattern.

Step 2: Apply the Configuration

From the menu, select Tools > Batch Process > ISO Date (or whatever you named your configuration).

DEVONthink will process all selected files instantly.

Tips for Using Batch Process

  • Test first: Always test your configuration on a few files before running it on your entire library
  • Use Smart Groups: Create a smart group that matches files with the old naming pattern to easily find all files that need conversion
  • Backup: While DEVONthink’s undo usually works, having a backup before major batch operations is always a good idea
  • Reuse configurations: Your configurations are saved and appear in the Tools > Batch Process menu for quick access

Conclusion

DEVONthink’s Batch Process tool is incredibly powerful for bulk operations. What would have taken hours of manual renaming was accomplished in seconds. If you’re managing a large document library and need to make systematic changes, Batch Process is worth learning.

The combination of regular expression matching and sequential actions makes it flexible enough to handle complex renaming scenarios while remaining accessible through a graphical interface.

Comments closed

Syncing Book Tracker with Goodreads

I recently put together a Python script to sync my reading history between Book Tracker and Goodreads.

I use Book Tracker as my primary reading tracker. It’s a great app for cataloging books and tracking progress. But I also like to keep my Goodreads profile up to date. Books I read on my Kindle automatically show up in Goodreads, but audiobooks I listen to through Libby don’t. Since Goodreads doesn’t have a public API, the only way to sync is through CSV exports.

This script compares exports from both apps, figures out which books are missing from each, and generates properly formatted import files. It handles the tricky parts like matching different editions of the same book (which have different ISBNs) and normalizing titles that vary between platforms.

You can check out the code here:

👉 https://github.com/dougdiego/goodreads-book-tracker-sync

Setup and usage instructions are in the README.

Comments closed

Books read in 2025

Comments closed

California State Parks is changing how camping cancellations work — and it could mean more last-minute availability (earlier)

If you’ve ever tried to snag a popular California State Parks campsite, you know the frustration: spots get booked months ahead, and then a bunch of them open up only one day before the weekend. That makes it tough to plan, and it leaves campsites sitting unused longer than they need to.

California State Parks is trying to fix that with an updated cancellation and refund policy for reservations made through ReserveCalifornia with arrival dates on and after July 1, 2026.  

The key change: refunds now reward earlier cancellations

Here’s the refund schedule the policy spells out (shared exactly so it’s easy to read):

  • 7 or more days before your reservation starts: You get all site fees back, minus the cancellation fee.  
  • 2–6 days before: You lose the first night’s site fee, and the rest is refunded (minus the cancellation fee).  
  • Less than 2 days before (or no-show): No refund — all fees are forfeited.  

A couple important details people will miss if they don’t read closely:

  • There’s an $8.25 cancellation fee, and the reservation fee paid at booking is non-refundable.  
  • “Reservation start” is defined as 12:00 PM on the arrival date (not the campground’s check-in time). To qualify for the “7+ days” full refund tier, you need to cancel by 12:00 PM exactly one week before.  

Why this is a good idea

This setup gives people a real reason to cancel earlier if they’re not going to use the site. Instead of waiting until the last minute (when plans change or weather looks bad), the best financial move is to decide at least a week out — which should help campsites reopen sooner for everyone else.

What this means if you’re hunting for a campsite

If you’re hoping to catch someone else’s cancellation, the sweet spot is starting about 7 days before the date you want to go. That’s the point where many people will be motivated to cancel to avoid losing bigger chunks of their payment.

So if you want a Friday night site, start checking the Friday a week before, and keep an eye on openings through the week.

(And if you’re the one holding a reservation you might not use: canceling sooner doesn’t just help your wallet — it helps someone else actually get outside.)

Comments closed

The $12 Bike Tool That Can Save You Hundreds: Why You Need a Chain Wear Indicator

If you ride your bike a lot—commuting, gravel, road, or mountain—your drivetrain is quietly wearing out beneath you. Most of that wear starts with one part: the chain.

The good news? There’s a cheap little tool that can dramatically cut your maintenance costs:

👉 Park Tool CC-3.2 Chain Wear Indicator Amazon

It usually sells for around $11–$16 depending on the shop.  

And used right, it can easily save you hundreds of dollars over the life of a bike.

Why “Chain Stretch” Matters (and Why It’s Not Really Stretch)

Chains don’t literally stretch like rubber bands. The pins and rollers wear down over time, which makes the distance between links slightly longer. That tiny elongation means:

  • The chain no longer meshes perfectly with the teeth on your cassette and chainring.
  • Load gets concentrated on the leading edges of teeth instead of spread evenly.
  • Over time, the cassette and chainring teeth get “shark-finned” and worn out.

worn chain is cheap to replace.

worn cassette and chainring? Not so much.

Meet the Park Tool CC-3.2

The Park Tool CC-3.2 is a simple “go/no-go” gauge:

  • One side measures 0.5% elongation
  • The other side measures 0.75% elongation  

For modern 11–12 speed drivetrains (like SRAM GX Eagle), most mechanics recommend replacing the chain around 0.5% wear to protect your cassette. Older 8–10 speed systems can usually go a bit further, up to around 0.75%.

How it works:

  1. Hook one end of the tool into a link.
  2. Try to drop the opposite end into the chain.
  3. If the 0.5% side drops in cleanly on an 11/12-speed chain → time to think about a new chain.
  4. If the 0.75% side also drops in → you’ve waited too long; the cassette is probably already wearing.

That’s it. No math. No measuring. Just “keep” or “replace.”

The Economics: SRAM GX Eagle Example

Let’s put some real numbers on this using a SRAM GX Eagle 12-speed drivetrain, a super common “mid-pack” group set.

Approximate street prices (US):

PartApprox. Price (USD)
Park Tool CC-3.2 chain checker$12–$16
SRAM GX Eagle 12-speed chain$35–$45
SRAM GX Eagle XG-1275 cassette$220–$255
SRAM GX Eagle direct-mount chainring$40–$50

(Of course, prices vary by shop, sale, and region—but these numbers are a realistic ballpark.)

Now let’s look at two riders over 3,000 miles of riding.

Rider A: Uses a Chain Checker, Replaces Chains Early

Rider A checks their chain regularly. On a modern 12-speed drivetrain, a chain can often go roughly 1,000 miles (give or take—conditions matter) before hitting 0.5% wear if it’s cleaned and lubed reasonably well.

So over 3,000 miles, Rider A might use:

  • 3 chains × ~$40 each ≈ $120

Because the chains were replaced before they got too worn, the cassette and chainring stay in good shape and don’t need replacing yet.

Total drivetrain wear cost for 3,000 miles: ~$120

Cost per mile:

  • 120 ÷ 3000 = 0.04 → about 4¢ per mile

Rider B: Never Checks Chain Wear, Waits Until It Skips

Rider B just rides. No checking. Eventually, the chain gets so long that:

  • Shifting starts to feel rough
  • The chain skips under load
  • The cassette teeth are visibly hooked

At that point, you usually can’t just slap on a fresh chain—

the cassette is worn to match the old chain, and a new chain will skip.

So Rider B ends up needing:

  • 1 new chain ≈ $40
  • 1 new cassette (XG-1275) ≈ $240
  • Possibly 1 new chainring ≈ $45

Total: ~$325

Now do the same cost-per-mile math over those 3,000 miles:

  • 325 ÷ 3000 ≈ 0.108 → about 11¢ per mile

The Bottom Line: 4¢ vs 11¢ per Mile

  • Rider A (with a $12–$16 chain checker): ~4¢ per mile in wear parts
  • Rider B (no checker, just rides it into the ground): ~11¢ per mile

There is also a higher likelihood that the chain will break before the 3000 miles, causing this expense earlier.

Even if the exact numbers shift a bit for your terrain, weight, and riding style, the pattern is clear:

Replacing chains early is dramatically cheaper than replacing chains + cassette + chainring later.

And that $12–$16 Park Tool CC-3.2 pays for itself the first time it saves your cassette. After that, it’s just making you money.

How to Use This Tool in Your Routine

You don’t need to obsessively measure your chain every ride. But building a simple habit makes a big difference:

  • If you ride a lot (3–5x per week):Check every 2–3 weeks or roughly every 300–500 miles.
  • If you’re an occasional rider:Check once a month or after a few big rides.
  • If you ride in mud, rain, or dust:Check more frequently; grit accelerates wear.

A quick routine:

  1. Wipe down the chain (cleaner chain = more accurate reading).
  2. Drop in the CC-3.2 on the 0.5% side.
  3. Read the tool
    • If it doesn’t quite drop all the way in → keep riding.
    • If it drops in easily on a GX Eagle → order a new chain.
  4. Swap the chain before it reaches 0.75% wear.

Comments closed

How to Build a DeskHog

Want to build your own DeskHog but found the official project page lacking in instructions? I did too. Here’s the step-by-step guide I wish I had when I started—complete with photos, links, and tips.

Hardware & Files You’ll Need

From the project README:

  • ESP32‑S3 Reverse TFT Feather (Adafruit 5691)
  • (Optional) PKCell 552035 LiPo battery (350 mAh) Adafruit
  • 3D-printed enclosure, print: 3mf file

Printing the Case

I downloaded the .3mf file and imported it into my 3D printer software. The slicer recommended adding supports, which I did.

I used PLA+ at 0.2mm layer height

Here is what the print looked like:

The print includes 3 pieces:

  1. Bottom case
  2. Top case
  3. Keypad

After printing, I removed the supports and cleaned things up with a knife and sandpaper. The hardest part was getting the keypad to fit cleanly into the top case.

Here’s the final result after cleanup.


Assembling the Hardware


Attach the LiPo battery to the board.


Place both inside the bottom case.


Snap the top case on.


Connect the DeskHog to your computer via USB-C.

Setting Up the Firmware

1. Clone the repo:

git clone https://github.com/PostHog/DeskHog.git
cd DeskHog

2. Install the UV Package Manager (if you don’t have it)

I’m using UV package manager to make this process easier. If you don’t have uv install, here is how:

Install uv

curl -Ls https://astral.sh/uv/install.sh | sh

Or use Homebrew (macOS):

brew install astral-sh/uv/uv

Make sure it’s working:

uv --version


3. Create a Virtual Environment

uv venv
source .venv/bin/activate # macOS/Linux
python -m ensurepip

This creates and activates a fast Python virtual environment.

4. Install PlatformIO, which the project uses to build and flash the firmware:

uv pip install platformio

5. Flash the Firmware

Make sure you’re in the root project folder (where platformio.ini lives), then:

platformio run --target upload

This builds and uploads the firmware using USB (with Auto-DFU support).


6. Power and charge:

To power off: Hold the ● + ▼ buttons.

To power on: Press the reset pad.

Charging is automatic when plugged into USB-C.

What It Does Out of the Box

Once booted, you’ll see:

  • ProvisioningCard: Shows a QR code for Wi‑Fi setup
  • InsightCard: Displays PostHog data
  • FriendCard: A sweet ‘encouragement’ screen featuring Max the hedgehog

Connecting to Wi-Fi

Once powered on, the DeskHog shows a QR code for Wi-Fi setup. Scan it to connect to your network—just pick your SSID and enter the password.

From here you can select your network and enter your password. Once connected you’ll see 2 screens. A screen with: WiFi, IP, Signal, Version and API. And a FriendCard

Add PostHog Insights


Go to the IP address displayed on your DeskHog.


You’ll see the configuration page.


Enter your PostHog Team ID (or Project ID) and a read-only API key.


Add the Insights you want to display.

And you’re done! You now have your own fully functional DeskHog.

Final Thoughts

This was a fun weekend project. If you’re already using PostHog, it’s a nice little dashboard for your desk—and a conversation starter too.


Comments closed