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.
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.
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.)
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:
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.
A worn chain is cheap to replace.
A 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:
Hook one end of the tool into a link.
Try to drop the opposite end into the chain.
If the 0.5% side drops in cleanly on an 11/12-speed chain → time to think about a new chain.
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):
Part
Approx. 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:
Wipe down the chain (cleaner chain = more accurate reading).
Drop in the CC-3.2 on the 0.5% side.
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.
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.
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:
Bottom case
Top case
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:
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.
I recently put together a small Python script to automate downloading all the available Kensington Outlook newsletters from the Kensington Community Council website.
I wrote it because I enjoy reading the Outlook on my iPad. Until now, I had to go through the site and manually download each PDF. This script fetches all the PDF links from the site, downloads them to a folder on my Mac, and skips any files that are already downloaded. That folder is synced to my iPad, so I can easily read the latest issues offline.
Have you ever encountered this pop-up when trying to change a file extension?
Are you sure you want to change the extension from “.txt” to “.md”?
If you make this change, your document may open in a different application.
This warning can be helpful, but if you frequently change file extensions and find it unnecessary, you can easily disable it. There are two ways to do this: via the GUI (Graphical User Interface) or the CLI (Command Line Interface).
Disable via GUI
Open the Finder
In the menu bar, go to Finder > Settings…
Click on the Advanced tab.
Uncheck “Show warning before changing an extension“
Disable via CLI (Terminal)
If you prefer using the command line, you can disable the warning using Terminal commands.
Disable the Warning
defaults write com.apple.finder "FXEnableExtensionChangeWarning" -bool "true" && killall Finder
Enable the Warning Again
defaults write com.apple.finder "FXEnableExtensionChangeWarning" -bool "true" && killall Finder
The fuel door on our 2021 Ford Transit broke. Unfortunately, it’s held together by a flimsy plastic piece, which makes it prone to damage.
When I took the van in for a routine service at the Ford dealership, I asked for a quote to fix the fuel door. They quoted me over $600, which included the cost of the door and painting it to match the van. Needless to say, I decided not to get it fixed there.
Later, I did some research online and found that replacement fuel doors could be purchased for around $50. I also came across an excellent video tutorial on YouTube Ford Transit Fuel Door Replacement – YouTube that showed exactly how to replace it.
Using the tools, I first unscrewed the T25 Torx screws holding the fuel door and surrounding panels in place. Then, I carefully used the trim removal tools to pop the panels off. The process was straightforward, and none of the clips broke during removal.
I positioned the new fuel door assembly in place, secured it with the Torx screws, and snapped the panels back on. It was a seamless fit, and everything went back together smoothly.
And screwed it in and snapped the panels back into place. The final result:
For those who prefer a seamless look, it’s possible to transfer the painted panel from the old fuel door to the new one. However, I liked the sleek black look of the replacement door and decided to keep it as is. I saved the painted panel in case I change my mind in the future.
The entire replacement process took just 10 minutes. By doing the repair myself, I saved over $550 compared to the dealership’s quote. If you’re dealing with a broken Ford Transit fuel door, I highly recommend tackling this repair yourself. It’s quick, easy, and cost-effective.
I’ve owned and used a Fellow Stagg Gooseneck Kettle for about 5 years now. It’s been a great kettle. Recently I wanted a kettle for my home office, so I could make tea while working. I didn’t want to spent $165. on a Fellow and started looking around. I was drawn to the DmofwHi Gooseneck Electric Kettle in Green. It was simple and beautiful. I spent some time researching it before buying for $39.99. Below are some thoughts on the two kettles.
This has been a great kettle. It has lasted over 5 years with no problems. It boils quickly and pours precisely.
The spout size on the Fellow is way too narrow. You need super patience when pouring. This is OK when pouring a drip coffee and you want to be precise, but frustrating when pouring tea. I often find myself tilting too far and water comes out the top. I have to tell myself slow down.
It has features I never use through. I don’t ever change the temperature, expect by accident. At which point I need to find the manual to set it back to what is was. But others may want to dial in exactly the temperature.
DmofwHi
I’ve only been using the DmofwHi for about a month, but love it already. It boils quickly. At 1000 Watts, it will be slower than the Fellow. But I’ve never noticed.
I love how quickly it pours. And I’ve never spilt water out the top while pouring.
And I’d assume that being less complicated, there are less things to break over time.
Summary
The Fellow has been a great kettle. But the DmofwHi at a fraction of the price gives me everything I need. I would happily buy the DmofwHi again or give it as a gift.