Posts for May 2026

Publishing blog posts from Obsidian

Obsidian Blog Publish Plugin

I've been publishing blog posts from an authenticated /admin page on this site using GitHub credentials to authenticate myself. This has always been concerning to me as a security vulnerability. I wrote the C# auth handler myself but I'm no security expert especially when it comes to OAuth. I've had a lot of exposure to it but have never considered myself an expert on it.

The second issue with the admin page is that it has been eating my blog posts lately. I would author a post in the admin page and when I hit submit, the form would submit and the post would just get silently dropped. I tried debugging it for a while but decided the complexity and security of the admin page wasn't worth it anymore.

In the spirit of simplifying the hosting (removing postgres and migrating to fly.io), I decided I could author posts in Obsidian instead and write a plugin to publish directly to the blog's storage blob store (using Azure blob storage). This is the first post being written in Obsidian!

I'm now realizing that I'm back to where I started back in 2023 when I first used Obsidian Publish to host a small blog. I rarely posted on it (even less often than this blog) and shut it down eventually.

One annoying thing with creating the obsidian plugin was that I wanted to use the official Azure JavaScript SDK for the blob storage uploads, but it thinks that Obsidian is a browser and blocks using a shared credential key as the authentication mechanism. It only allows it in NPM runtime environments. I understand why they have to add this check, but it did force me to write my own slim blob store SDK.

With this change, I used AI way less than in the past. Partly because I cancelled my Claude Pro subscription last month and partly because I wanted to learn and understand the Obsidian plugin API and TypeScript development. I originally started this blog to learn and that was happening less and less as I was relying on AI more. I didn't completely abstain however. I used OpenCode and OpenRouter for some parts such as the blob store sdk. I've written my own Blob Store SDKs in C# before and it's just tedious to set up the auth correctly. It was nice to use open router as it allowed me to try out different models, such as DeepSeek V4 and Kimi 2.5. However, there is a reason people flock to Opus and GPT5.5. DeepSeek was very disappointing, it actually felt like GPT 3.5 days in some ways. It would just quite in the middle of work with no notification. I ended up going back to Sonnet 4.6 to finish up some work and the increase in capability was so immediately clear.

I'm glad I got to try out some different tools. At work I use Copilot CLI and can choose between several different models. I tend to use GPT5.5 for planning and Opus 4.7 for executing the implementation specs as it plays to their strengths. I was using Claude Code at work until the licenses were cancelled.

note: I don't use AI to write posts and I don't ever plan to. Writing is sacred to me and helps me think. The point of authoring posts manually is to help me clarify my own thoughts.

How I wrote this post

# / 2026 / 05 / 30

Last.fm is now independent

Forum Post

The last.fm staff posted a small announcement that they are now independent. I've been on last.fm since 2008 and didn't realize they were owned by the CBS corporation that entire time. Apparently CBS bought last.fm in 2007. In that post about the acquisition is this line

CBS understands the Last.fm vision, the importance we place on putting the listener in charge, the vibrant and vocal community, the obsession with music stats, and our determination to offer every song ever recorded.

I imagine last.fm had huge ambitions in their early days. There was no Spotify or major streaming services at that time, so they were in a potential position to become the central place where people came to listen to and discover music.

Looking back at my own music habits at that time, I was either spending money in iTunes to buy albums or individual tracks for $0.99, but that was also locking me into the Apple ecosystem because all music on iTunes was protected with DRM (they later introduced music without DRM and thus increased the price to $1.29, which is still the price to this day). I remember signing up for last.fm for the ability to internet radio streaming and discovering music. It was pretty unimpressive looking back, but at the time it felt amazing.

I haven't used last.fm much since then, I had a brief time from 2014-2016 where I had scrobbling set up with Spotify, but something broke and I never noticed or bothered to fix it. With this announcement of them becoming independent, it's reignited my interest in scrobbling and tracking the music I'm listening to. I've also been working on moving away from Spotify and going back to manually managing my music like its the year 2006.

Here is my last.fm profile: https://www.last.fm/user/jmanator

# / 2026 / 05 / 29

In-browser Indoor Cycling Training App

BullWatt

I cancelled my Zwift subscription recently. It's not that Zwift is bad, I just don't use it often enough to justify the monthly price. I've been looking for a free alternative that I can use whenever I feel like riding inside (very rare these days).

But then I found BullWatt in a Reddit thread. It's exactly what I want, even though I didn't realize it at first. It runs locally in your browser and uses the Bluetooth API to connect to your trainer. Unfortunately, it appears that only Google Chrome has any decent support for this API so I had to install that first, which pains me to see it next to Firefox.

The best part is that because it runs locally in the browser, there are no accounts or sign ups. You can just start using it immediately. Absolute cinema.

I just finished a 25 minute session and it did exactly what it advertised. It let me pick a workout and set my FTP, and then it used the ERG mode of my trainer to automatically set the resistance.

The source is on GitHub. I'm going to poke around there later to see how it works in more detail.

# / 2026 / 05 / 13