{"version":"https://jsonfeed.org/version/1","title":"Jan's Stuff","home_page_url":"https://jan.alphadev.net/","feed_url":"https://jan.alphadev.net/feed.json","items":[{"id":"https://jan.alphadev.net/blog/2026/first-motorcycle-trip","url":"https://jan.alphadev.net/blog/2026/first-motorcycle-trip/","title":"First Motorcycle ride of the year","content_html":"<article class=\"post-content\">\n            <p>The first somewhat ridable days were weeks ago, but I was either gone or didn’t have the time.</p>\n            <p>Today everything serendipitously fell into place: yesterday was warm enough, no frost over night, nice weather on a lazy Saturday afternoon and a buddy of mine was also planning on a short ride.</p>\n            <p>Started the ride at 80% battery, and rode 55 kilometers in total, down to about 50%. We took it slowly on backroads and gradually increased the riding difficulty. We had all kinds of terrain, flat portions and up and down the hills, easy curves, turnpikes. By the end the sun was about to set and the temperatures started to drop from the 17 degrees we had set out at, down to 13 degrees.</p>\n            <p>Compared to my (also electric) winter car, it is noticeable how much better the motor and the BMC performs. Not only in output power but in estimating, recouping and saving power.</p>\n            <p>It was fun every minute of the ride and I’m looking forward to the warmer months, when the conditions are even better and the sun is up for longer.</p>\n          </article>","date_published":"2026-03-07T00:00:00+00:00","date_modified":"2026-03-07T00:00:00+00:00","tags":["motorcycle","zero s 2024"],"author":{"name":"Jan Seeger"}},{"id":"https://jan.alphadev.net/blog/2026/xteink-4","url":"https://jan.alphadev.net/blog/2026/xteink-4/","title":"New e-Reader","content_html":"<article class=\"post-content\">\n            <p>In 2010 I imported a <a href=\"https://en.wikipedia.org/wiki/Barnes_%26_Noble_Nook_1st_Edition\">Barnes &amp; Noble Nook</a> from the U.S. and had devoured tons of books (including Stephen King’s Dark entire <a href=\"https://en.wikipedia.org/wiki/The_Dark_Tower_(series)\">Tower Series</a>) on it. Until the screen broke by accident on a vacation two years later.</p>\n            <p>Since then I had fallen back to reading on Android phones (<a href=\"https://en.wikipedia.org/wiki/Aldiko\">Aldiko Reader</a>) and iBooks on the iPad mini, then the iPad Pro and then my iPhone after that.</p>\n            <p>iBooks had automatic syncing, so I could double click a book on the Mac and it would automatically show up on all the other devices. And Screen Fatigue aside, the iPhone’s high-res, self illuminated display is quite nice at night.</p>\n            <p>Ever since my Nook broke, I had missed the feeling of eInk. But a Kindle device was never an option with their closed-up ecosystem. In the meantime Kobo had released some nice e-Readers (<a href=\"https://gl.kobobooks.com/products/kobo-clara-colour\">even with color displays</a>) and there even were other <a href=\"https://shop.boox.com/products/palma2\">portable options</a>.</p>\n            <p>A full size e-Reader takes up space in your jacket pocket<sup id=\"fnref:1\"><a href=\"#fn:1\" class=\"footnote\" rel=\"footnote\" role=\"doc-noteref\">1</a></sup>. I opted to go for a small, cheap and unilluminated one by <a href=\"https://www.xteink.com/products/xteink-x4\">Xteink</a> with a black &amp; white E-Ink display.</p>\n            <h1 id=\"xteink-x4\">Xteink X4</h1>\n            <h2 id=\"hardware\">Hardware</h2>\n            <p>There’s no Android and thus no support for arbitrary Apps to be installed. For me that is a plus, as it removes unnecessary complexity and saves battery.</p>\n            <p>Speaking of which, the battery holds up well for me, I have to charge it every couple of weeks. And the ubiquitous USB-C makes charging easy, when needed.</p>\n            <p>The device is computationally underwhelming, but given the battery size that is also a good thing. Once a book has been “indexed”<sup id=\"fnref:2\"><a href=\"#fn:2\" class=\"footnote\" rel=\"footnote\" role=\"doc-noteref\">2</a></sup>, page turns themselves are quick and snappy. But navigating the menu and settings will still take a long second.</p>\n            <p>My device came with a FAT32 formatted 32 GB Micro SD card in the box, once I took that out and formatted it as ExFAT the entire interface was loading noticeably quicker.</p>\n            <p><img src=\"https://jan.alphadev.net/assets/2026/xteink-marketing.jpg\" alt=\"Xteink X4 Marketing Material showing it attached to an iPhone (Pro because of the big camera array)\" /></p>\n            <p>I’m still a bit confused, their marketing material shows the device attached to an iPhone via MagSafe. Realistically it only fits Pro Max iPhones and according to the <a href=\"https://www.reddit.com/r/xteinkereader/\">Subreddit</a> only certain Models.</p>\n            <p><img src=\"https://jan.alphadev.net/assets/2026/DSC09388.jpeg\" alt=\"Xteink X4 laying on an iPhone 15 Pro with the camera bump getting in the way\" /></p>\n            <p>Therefore if you are, like me, in the non-Max club, this is going to be a standalone device for you.</p>\n            <h2 id=\"software\">Software</h2>\n            <h3 id=\"stock-firmware\">Stock Firmware</h3>\n            <p>The default fonts are perfectly legible. But if the defaults aren’t your cup of tea, there’s tons of <a href=\"https://www.readme.club\">great resources</a> out there to customize everything to your liking.</p>\n            <p>It only supports ePub, TXT and BMP files, no Markdown, no PDF and no Comic Book formats. Which is fine, but should be known before buying.</p>\n            <p>But even the formats it does support are often broken, For instance there’s stray HTML divs rendered throughout the text. I have yet to try cleaning up the ePub files with a Calibre Plugin to see whether it improves the experience. But coming from the Nook and iBooks I’m used to just copy the Publisher’s ePub files over as-is.</p>\n            <p>Some book covers and images are missing because modern ones come with SVG files that cannot be rendered, which is a bummer but understandable.</p>\n            <h4 id=\"webinterface\">Webinterface</h4>\n            <p>On the plus side, no Internet connection is needed, as there is a Hotspot built-in, that once you connect your phone to it, you can navigate to a barebones web interface and upload ePub files directly there.</p>\n            <p><img src=\"https://jan.alphadev.net/assets/2026/0a976f6d-466e-41f5-bf67-d74333bcccf6.png\" alt=\"Screenshot of the Webinterface\" /></p>\n            <p>But in reality the web interface is janky and you have to acknowledge several error messages, upload the file, close some other error message saying that the upload failed (even though it worked) and then disconnect. File management, as in creating folders, moving or deleting files is present but outright doesn’t work.</p>\n            <h2 id=\"custom-firmware\">Custom Firmware</h2>\n            <p>There is an active community developing tools and mods for it. Including an open source <a href=\"https://github.com/crosspoint-reader/crosspoint-reader\">alternative firmware</a> that can be flashed. CrossPoint Reader’s interface is more barebones, and has less settings. But the text rendering and the reading experience is way better.</p>\n            <p>Plus at the moment there is so much work being done, that a new version with new features is dropped literally every few days.</p>\n            <p>There’s no Hotspot functionality, but once connected to a network<sup id=\"fnref:3\"><a href=\"#fn:3\" class=\"footnote\" rel=\"footnote\" role=\"doc-noteref\">3</a></sup> you can even directly browse Calibre OPDS catalogs without taking out the Storage Card.</p>\n            <p>Another thing of note: The manufacturer doesn’t seem to like the custom Firmware at all, which is why the devs have been forced to move to a <a href=\"https://www.reddit.com/r/xteinkHax/\">Subreddit of their own</a>.</p>\n            <h2 id=\"should-you-get-one\">Should you get one?</h2>\n            <p>I’ve paid 65,48€ including postage and shipping and now have read several books with the Stock Firmware as well as the alternative one and am happy with it.</p>\n            <p>This is still not a purchase recommendation though, but if you think it has a place in your life, even after I described its flaws here, go ahead and buy it.</p>\n            <p>The hardware is cheap and lightweight. Do not get it for the Software. If the MagSafe issue doesn’t bother you, get the Chinese X4 from Ali Express and flash the alternative Firmware:</p>\n            <p>The upcoming X3 will supposedly fix the MagSafe issue, but does have proprietary Pogo Pins instead of USB‑C and it is currently unclear whether it will allow flashing <acronym title=\"Custom Firmware\">CFW</acronym>.</p>\n            <p>Don’t bother with the warranty of the international version — It isn’t worth it for such a cheap device.</p>\n            <p>You do not have to be able to read a single word of Chinese:</p>\n            <ul>\n              <li>Power it up</li>\n              <li>Connect the USB Cable</li>\n              <li>Navigate to the <a href=\"https://xteink.dve.al\">flashing website</a></li>\n              <li>Press the flash button</li>\n              <li>Push the reset button on the side</li>\n              <li>Done</li>\n            </ul>\n            <div class=\"footnotes\" role=\"doc-endnotes\">\n              <ol>\n                <li id=\"fn:1\">\n                  <p>And you have to have it handy, otherwise you’ll end up using it only at home <a href=\"#fnref:1\" class=\"reversefootnote\" role=\"doc-backlink\">&#8617;</a></p>\n                </li>\n                <li id=\"fn:2\">\n                  <p>Indexing is what it says, in reality it converts the ePub into its internal binary format that is computationally better suited for the Hardware. <a href=\"#fnref:2\" class=\"reversefootnote\" role=\"doc-backlink\">&#8617;</a></p>\n                </li>\n                <li id=\"fn:3\">\n                  <p>Yes, Mobile Hotspot also work. <a href=\"#fnref:3\" class=\"reversefootnote\" role=\"doc-backlink\">&#8617;</a></p>\n                </li>\n              </ol>\n            </div>\n          </article>","date_published":"2026-01-22T00:00:00+00:00","date_modified":"2026-03-07T00:00:00+00:00","tags":["reading","eink"],"author":{"name":"Jan Seeger"}},{"id":"https://jan.alphadev.net/blog/2026/ocean-view","url":"https://jan.alphadev.net/blog/2026/ocean-view/","title":"Ocean View","content_html":"<article class=\"post-content\">\n            <center>\n              <figure>\n                <img src=\"https://jan.alphadev.net/assets/2025/429FDC00-127E-4FAC-98BB-8AA9DE360052.jpg\">\n                <figcaption>Ocean View</figcaption>\n              </figure>\n            </center>\n          </article>","date_published":"2026-01-03T00:00:00+00:00","date_modified":"2026-03-07T00:00:00+00:00","tags":["travels","tenerife"],"author":{"name":"Jan Seeger"}},{"id":"https://jan.alphadev.net/blog/2026/40-questions","url":"https://jan.alphadev.net/blog/2026/40-questions/","title":"40 Questions","content_html":"<article class=\"post-content\">\n            <p>For some years now I fill out Steph Ango’s <a href=\"https://stephango.com/40-questions\">40 Questions</a> to reflect over the past year and don’t share it with anybody but store it for future reference for myself.</p>\n            <p>The questions cover a broad enough base, serving as a good starting point to  drill into the year past.</p>\n            <p>Haven’t tried the <a href=\"https://stephango.com/40-questions-decade\">decade one</a> yet, but will also do at some point.</p>\n          </article>","date_published":"2026-01-01T00:00:00+00:00","date_modified":"2026-03-07T00:00:00+00:00","tags":[],"author":{"name":"Jan Seeger"}},{"id":"https://jan.alphadev.net/blog/2025/media-report","url":"https://jan.alphadev.net/blog/2025/media-report/","title":"Media Report 4/2025","content_html":"<article class=\"post-content\">\n            <p>As is <a href=\"https://jan.alphadev.net/blog/2024/media-report-01-2024/\">customary</a>, I’ve been reading a lot during my vacation:</p>\n            <ul>\n              <li>\n                <p><a href=\"https://pragprog.com/titles/kotlinbt/kotlin-brain-teasers/\">Kotlin Brain Teasers</a></p>\n                <p>Found it via <a href=\"https://pragprog.com/\">Lukas Mathis’ recommendation</a> and thoroughly enjoyed it, did even learn something new.<sup id=\"fnref:1\"><a href=\"#fn:1\" class=\"footnote\" rel=\"footnote\" role=\"doc-noteref\">1</a></sup></p>\n                <p>Big fan of <a href=\"https://pragprog.com/\">PragProg</a> as a publisher in general.</p>\n              </li>\n              <li>\n                <p><a href=\"https://qntm.org/ra\">Ra</a></p>\n                <p>qntm’s work is always an interesting read. Started this book <a href=\"https://jan.alphadev.net/blog/2024/media-report-01-2024/\">two years ago</a> and only now found the time to finish it.</p>\n                <p>At the beginning it is weird to read through the setup, as it tries to connect “magic” and “science”, especially with various jumps in times and storylines. But once you are past the “suspension of disbelief” threshold, it gets easier and all these loose threads are masterfully connected to a coherent whole.</p>\n              </li>\n              <li>\n                <p><a href=\"https://www.goodreads.com/book/show/32076670-ball-lightning\">Ball Lightning</a></p>\n                <p>After having read Cixin Liu’s famous masterpiece <a href=\"https://www.goodreads.com/book/show/20518872-the-three-body-problem\">Three Body Problem</a> trilogy way back, I had set out to read some of his other works and had read Ball Lightning. But since the Three Body Problem still occupied my mind at the time, I did read this book but didn’t fully grasp it back then.</p>\n                <p>When I scrolled past it in my library and it said “read” but I couldn’t remember a single thing, I re-read it and it was worth it.</p>\n              </li>\n              <li>\n                <p><a href=\"https://www.goodreads.com/book/show/35018901-head-on\">Head On</a></p>\n                <p>Being a huge fan of Scalzi’s <a href=\"https://jan.alphadev.net/blog/2013/old-mans-war/\">Old Man’s War</a> series, naturally I had to read his other works.</p>\n                <p>I devoured this entire book within a day and a half, attesting to its ability to capture the reader. The story involves a lot of characters and their interactions, but each are distinct enough that they are not confusing.<sup id=\"fnref:2\"><a href=\"#fn:2\" class=\"footnote\" rel=\"footnote\" role=\"doc-noteref\">2</a></sup> And in the end it all resolves neatly.</p>\n              </li>\n              <li>\n                <p><a href=\"https://qntm.org/structure\">Fine Structure</a></p>\n                <p>Classic QNTM, you have to keep at it to be able to keep up with the plot, memetics naturally present. Overall I did enjoy the book, but the end feels a bit rushed for an otherwise good book. It all happens on a few pages, and does not resolve some of the plot strings.</p>\n              </li>\n              <li>\n                <p><a href=\"https://pragprog.com/titles/hwrust/hands-on-rust/\">Hands-on Rust</a></p>\n                <p>Another one I picked up at the PragProg Black Friday sale. Didn’t yet finish, but learning a new language isn’t as easy as finishing a book front to back, so 🤷</p>\n              </li>\n            </ul>\n            <h1 id=\"39c3-talks\">39C3 Talks</h1>\n            <p>Apart from reading I watched a lot of interesting talks from the <a href=\"https://media.ccc.de/c/39c3\">congress</a>. Interesting to me as a potential buyer of a Steam Frame, was the <a href=\"https://media.ccc.de/v/39c3-breaking-architecture-barriers-running-x86-games-and-apps-on-arm\">Fex-Talk</a>. But my pick for the best one so far goes to the <a href=\"https://media.ccc.de/v/39c3-all-my-deutschlandtickets-gone-fraud-at-an-industrial-scale\">Deutschland Ticket</a> one.</p>\n            <h1 id=\"read-before-my-vacation\">Read before my vacation</h1>\n            <p>These I had read before my vacation, during summer or fall but still want to list them somewhere for completeness’ sake:</p>\n            <ul>\n              <li>\n                <p><a href=\"https://www.diewithzerobook.com/\">Die with Zero</a></p>\n                <p>Bill Perkins makes the case from various angles that one should re-evaluate how wealth and posessions are used in ones lifetime. He makes the case using various parables and sheds light from various angles. Worthwhile cause, even if the target group seems to be US citizens. Interesting read nonetheless, though it repeats very often recounting the same concepts.</p>\n              </li>\n              <li>\n                <p><a href=\"https://craphound.com/category/redteamblues/\">Read Team Blues</a></p>\n                <p>Cory Doctorow writes less outlandish SciFi more grounded in the real world, thinking ahead of technalogy that already exists and takes it to new places, diving into the consequences they have for us by telling a compelling story around it.</p>\n                <p>This book is no exception where it delves into Cryptocurrencies and the Silicon Valley. Nice and cozy read.</p>\n              </li>\n            </ul>\n            <div class=\"footnotes\" role=\"doc-endnotes\">\n              <ol>\n                <li id=\"fn:1\">\n                  <p>Most surprisingly: The value of a previously committed return statement can be overridden using a finally statement! <a href=\"#fnref:1\" class=\"reversefootnote\" role=\"doc-backlink\">&#8617;</a></p>\n                </li>\n                <li id=\"fn:2\">\n                  <p>Spoiler: It also helps a bit that many of them won’t live through to the end. <a href=\"#fnref:2\" class=\"reversefootnote\" role=\"doc-backlink\">&#8617;</a></p>\n                </li>\n              </ol>\n            </div>\n          </article>","date_published":"2025-12-29T00:00:00+00:00","date_modified":"2026-03-07T00:00:00+00:00","tags":["reading"],"author":{"name":"Jan Seeger"}},{"id":"https://jan.alphadev.net/blog/2025/power-woes","url":"https://jan.alphadev.net/blog/2025/power-woes/","title":"Power Woes","content_html":"<article class=\"post-content\">\n            <p>Another one of those situations where I wake up to a system alert mail. This time nothing <em>broke</em>, but according to this my <acronym title=\"Uninterruptible Power Supply\">UPS</acronym> caught a power outage and kept the system up for 73 minutes this morning.</p>\n            <p><img src=\"https://jan.alphadev.net/assets/2025/50047418-f807-4b7b-b9e5-168a3d04bf40.jpeg\" alt=\"Screenshot of the Alert\" /></p>\n            <p>Good to know it works.</p>\n          </article>","date_published":"2025-12-23T00:00:00+00:00","date_modified":"2026-03-07T00:00:00+00:00","tags":["ups"],"author":{"name":"Jan Seeger"}},{"id":"https://jan.alphadev.net/blog/2025/docker-cleanup","url":"https://jan.alphadev.net/blog/2025/docker-cleanup/","title":"Docker cleanup","content_html":"<article class=\"post-content\">\n            <p>This is your friendly reminder to run the prune command every once in a while to unclog slow Docker installs:</p>\n            <div class=\"language-shell highlighter-rouge\">\n              <div class=\"highlight\">\n                <pre class=\"highlight\"><code><span class=\"nv\">$ </span>docker image prune\n</code></pre>\n              </div>\n            </div>\n            <p>Especially, if you are using watchtower.</p>\n            <blockquote>\n              <p>Total reclaimed space: 34.47GB</p>\n            </blockquote>\n          </article>","date_published":"2025-12-12T00:00:00+00:00","date_modified":"2026-03-07T00:00:00+00:00","tags":["docker"],"author":{"name":"Jan Seeger"}},{"id":"https://jan.alphadev.net/blog/2025/tool-replacements","url":"https://jan.alphadev.net/blog/2025/tool-replacements/","title":"Tool Replacements","content_html":"<article class=\"post-content\">\n            <h1 id=\"hazel--shortcuts\">Hazel –&gt; Shortcuts</h1>\n            <p>One of the functions the Shortcuts.app that ships with macOS Tahoe gained is native support for Folder Actions:</p>\n            <p><img src=\"https://jan.alphadev.net/assets/2025/200C017D-E819-4677-8125-AE21B3FECCAD.jpg\" alt=\"\" /></p>\n            <p>Hazel did the job perfectly fine, but onboard tools are obviously preferred.</p>\n            <p>This sample rule here that moves Android Emulator screen recordings to Photos.app</p>\n            <p><img src=\"https://jan.alphadev.net/assets/2025/1ADEB4C9-2B54-4E18-AF4B-D1D0FDE6482E.jpg\" alt=\"\" /></p>\n            <p>can be replaced using a simple Shortcut:</p>\n            <p><img src=\"https://jan.alphadev.net/assets/2025/E6A62CB4-50B3-43EE-B11B-FD71D333167E.jpg\" alt=\"\" /></p>\n            <h1 id=\"hiddenbar--ice\">HiddenBar –&gt; Ice</h1>\n            <p>After the <a href=\"https://www.macrumors.com/2024/06/04/bartender-mac-app-new-owner/\">BarTender issues</a> back then I had switched to <a href=\"https://github.com/dwarvesf/hidden\">HiddenBar</a>, which is way simpler  than Bartender and works nicely on external monitors (to hide and show rarely used Menubar icons). But unhiding on the MacBook display often moves the leftmost icons under the notch.</p>\n            <p>Queue <a href=\"https://github.com/jordanbaird/Ice\">Ice</a>, which provides the IceBar (which is an overlay that pops up under the Menubar).</p>\n          </article>","date_published":"2025-11-27T00:00:00+00:00","date_modified":"2026-03-07T00:00:00+00:00","tags":["macos"],"author":{"name":"Jan Seeger"}},{"id":"https://jan.alphadev.net/blog/2025/maven-repo-outage","url":"https://jan.alphadev.net/blog/2025/maven-repo-outage/","title":"Maven repo outage report","content_html":"<article class=\"post-content\">\n            <p>This morning I noticed that several open GitHub PRs failed to build, halfway expected a weird API breakage. But when I decided to look into it, the build runner couldn’t connect to the <a href=\"https://maven.alphadev.net\">Maven Repository</a>:</p>\n            <blockquote>\n              <p>Caused by: java.io.IOException: Unexpected response code for https://maven.alphadev.net/releases/de/sipgate/dachlatten-io/0.0.101/dachlatten-io-0.0.101.pom.sha512. Expected: 200, actual: 502</p>\n            </blockquote>\n            <p>Quick check in the Browser, and I was greeted with the Reverse Proxy landing page of the host, so the service itself was actually down.</p>\n            <p>After logging into the Host, it transpired that the host was automatically restarted for an unattended update, but the Docker daemon was somehow corrupted and never came back up again.</p>\n            <p>The offered “reparation” seemingly entailed reinstalling Docker and restarting with the old data dir, which thankfully wasn’t actually corrupted.</p>\n            <p>Not exactly sure what had happened here. Will keep an eye out for recurring occurrences. Thankfully the data dir is regularly backed up.</p>\n          </article>","date_published":"2025-11-22T00:00:00+00:00","date_modified":"2026-03-07T00:00:00+00:00","tags":["docker"],"author":{"name":"Jan Seeger"}},{"id":"https://jan.alphadev.net/blog/2025/shit-dot-shabaka","url":"https://jan.alphadev.net/blog/2025/shit-dot-shabaka/","title":"About the time I briefly owned the Arabic shit.net domain","content_html":"<article class=\"post-content\">\n            <p>In 2022 on a whim I acquired the Arabic shit <a href=\"https://en.wikipedia.org/wiki/.shabaka\">Shabaka</a> Domain (غائط.شبكة). I had no particular plans for it, and all it ever did was to show a huge poop emoji front and center. But boy was it ever fun to see software and mail validators break.</p>\n            <p>Technically Arabic scripts are valid in domain names using <a href=\"https://en.wikipedia.org/wiki/Punycode\">Punycode</a>. In reality though, having a <acronym title=\"Left to Right\">LTR</acronym> user part and At-sign, followed by the <acronym title=\"Right to Left\">RTL</acronym> domain, followed by the <acronym title=\"Left to Right\">LTR</acronym> dot, followed by the <acronym title=\"Right to Left\">RTL</acronym> <acronym title=\"Top Level Domain\">TLD</acronym> was too much to handle for many mail validators.</p>\n            <p><img src=\"https://jan.alphadev.net/assets/2025/5D2FB78A-E31E-4C43-95D8-91B62D450A3A.jpg\" alt=\"\" /></p>\n            <p>Kudos to Apple’s Mail.app, which had no issues. Neither when setting up the account, nor when using it.</p>\n            <h1 id=\"but-if-it-was-such-fun-why-is-the-domain-free-right-now\">But if it was such fun, why is the domain free right now?</h1>\n            <p>I have never felt as if that domain ever really belonged to me, and have since let it expire. It is now free to grab and for you to have your fun with it.</p>\n          </article>","date_published":"2025-11-13T00:00:00+00:00","date_modified":"2026-03-07T00:00:00+00:00","tags":["dns"],"author":{"name":"Jan Seeger"}},{"id":"https://jan.alphadev.net/blog/2025/hasher","url":"https://jan.alphadev.net/blog/2025/hasher/","title":"Hasher","content_html":"<article class=\"post-content\">\n            <p>Over the years I ran into the same issue again and again, that I found some old files on a hard drive or a directory with files somewhere on a machine and I didn’t remember its purpose or the state it was in.</p>\n            <p>For source code <a href=\"https://git-scm.com\">git</a> solves this problem in a neat fashion, but you wouldn’t typically commit binaries, PSD, large amounts of JPEGs, RAW images or even Video files. I had always longed for a quick and easy way to check the difference between two folders.</p>\n            <p>Last month on a long train ride I tried whether AI could help me solve this with shell scripts and readily available UNIX tools<sup id=\"fnref:1\"><a href=\"#fn:1\" class=\"footnote\" rel=\"footnote\" role=\"doc-noteref\">1</a></sup>. And the initial version did work, but was awfully slow (we’re talking dozens of minutes). And since I wanted to dabble in Rust for quite a while now but have never gotten around to it, I tried vibe coding the thing with Claude.</p>\n            <p>Claude came back with 3 simple files<sup id=\"fnref:2\"><a href=\"#fn:2\" class=\"footnote\" rel=\"footnote\" role=\"doc-noteref\">2</a></sup> that compiled and run without error and now run the same thing that took 20 minutes earlier with the shell script in 34 seconds! This definitely goes into my <code class=\"language-plaintext highlighter-rouge\">$HOME/bin</code> dir.</p>\n            <p>I cleaned it up and <a href=\"https://github.com/janseeger/hasher\">put it on GitHub</a>. As of now I consider it feature complete, and I have successfully  tested it on Linux and macOS.</p>\n            <h1 id=\"considerations\">Considerations</h1>\n            <p>The program uses SHA256 because that is safe and future-proof enough, available just about everywhere and in most cases even hardware-accelerated.</p>\n            <p>When hashing a directory, it will create a sorted listing of its contents, where each of the entries contains its type, name and hash. This makes this safe and comparable.</p>\n            <p>To drill into directories further the -v command can be used to show the hashes of the entries.</p>\n            <div class=\"footnotes\" role=\"doc-endnotes\">\n              <ol>\n                <li id=\"fn:1\">\n                  <p>I was told that AI was super good in writing Shell scripts <a href=\"#fnref:1\" class=\"reversefootnote\" role=\"doc-backlink\">&#8617;</a></p>\n                </li>\n                <li id=\"fn:2\">\n                  <p>Cargo.toml, main.rs, ReadMe.md <a href=\"#fnref:2\" class=\"reversefootnote\" role=\"doc-backlink\">&#8617;</a></p>\n                </li>\n              </ol>\n            </div>\n          </article>","date_published":"2025-10-25T00:00:00+00:00","date_modified":"2026-03-07T00:00:00+00:00","tags":["rust"],"author":{"name":"Jan Seeger"}},{"id":"https://jan.alphadev.net/blog/2025/git-merge-vs-rebase","url":"https://jan.alphadev.net/blog/2025/git-merge-vs-rebase/","title":"Git Merge vs. Rebase","content_html":"<article class=\"post-content\">\n            <p>As a programmer one encounters varying levels of git-prowess. 95% of all use-cases are covered by <em>commit</em>, <em>checkout</em> and <em>merge</em>, and when something goes wrong the occasional arcane shell invocation from Stack Overflow does the rest.</p>\n            <p>Investing the time to understand the tools used on a daily basis is a worthwhile investment. Analogous to Clean Code, keeping a sane git graph makes things faster, easier to parse visually and let’s you see who did what exactly, why and when much more precise.</p>\n            <p>That is why I much prefer the <a href=\"#rebase-flow\">Rebase Flow</a> to the <a href=\"#merge-flow\">Merge Flow</a>. In my opinion unnecessary merges clutter the graph and needlessly mix up unrelated changes.</p>\n            <h1 id=\"sample-scenario\">Sample Scenario</h1>\n            <p><img src=\"https://jan.alphadev.net/assets/2025/rebase-possible.svg\" alt=\"\" />\n              [<a href=\"https://jan.alphadev.net/assets/2025/rebase-possible.mmd\">Source</a>]</p>\n            <p>Suppose we have the following graph: We branched out from main at commit <code class=\"language-plaintext highlighter-rouge\">b</code>, and then did work on <code class=\"language-plaintext highlighter-rouge\">c</code> and <code class=\"language-plaintext highlighter-rouge\">d</code>, while on the main something else was fixed, say a colleague found a bug in commit <code class=\"language-plaintext highlighter-rouge\">b</code> that was fixed in commit <code class=\"language-plaintext highlighter-rouge\">e</code> that is now conflicting with our changes in <code class=\"language-plaintext highlighter-rouge\">c</code>.</p>\n            <h1 id=\"rebase-flow\">Rebase flow</h1>\n            <p>When we now rebase feature on top of main we get something that looks like this:</p>\n            <p><img src=\"https://jan.alphadev.net/assets/2025/after-rebase.svg\" alt=\"\" />\n              [<a href=\"https://jan.alphadev.net/assets/2025/after-rebase.mmd\">Source</a>]</p>\n            <p>We essentially history rewrote the feature branch by changing the branching out point of the feature branch from <code class=\"language-plaintext highlighter-rouge\">b</code> to <code class=\"language-plaintext highlighter-rouge\">f</code> and reapplying the changes of <code class=\"language-plaintext highlighter-rouge\">c</code> and <code class=\"language-plaintext highlighter-rouge\">d</code>.</p>\n            <p>Since our new branching point is <code class=\"language-plaintext highlighter-rouge\">f</code> we automatically get the bugfix from commit <code class=\"language-plaintext highlighter-rouge\">e</code>, but have to fix the conflicts when applying commit <code class=\"language-plaintext highlighter-rouge\">c</code>, making it <code class=\"language-plaintext highlighter-rouge\">c'</code>. And because commit <code class=\"language-plaintext highlighter-rouge\">d</code> was based on <code class=\"language-plaintext highlighter-rouge\">c</code> (<code class=\"language-plaintext highlighter-rouge\">d</code> is a set of changes to be applied to <code class=\"language-plaintext highlighter-rouge\">c</code> to reach the desired state at <code class=\"language-plaintext highlighter-rouge\">d</code>) it now becomes <code class=\"language-plaintext highlighter-rouge\">d'</code>.</p>\n            <p><strong>History Rewriting!</strong> This should only be done on clean branches that aren’t shared between lots of devs, high traffic branches, or semantic branches (like release)!</p>\n            <p>Once the rebase is done, we have two options <a href=\"#fast-forward-merge\">Fast-Forward Merge</a> or <a href=\"#non-fast-forward-merge\">Non Fast-Forward Merge</a>. Different people and teams handle this differently. I use both depending on the shape of the feature branch. If it is only a single commit with few changed lines, I go for the <em>fast-forward</em> variant, otherwise <em>non-fast-forward</em> is always a good option to keep the mainline clean.</p>\n            <h2 id=\"fast-forward-merge\">Fast-Forward Merge</h2>\n            <p><img src=\"https://jan.alphadev.net/assets/2025/merge-after-rebase-ff.svg\" alt=\"\" />\n              [<a href=\"https://jan.alphadev.net/assets/2025/merge-after-rebase-ff.mmd\">Source</a>]</p>\n            <p>Since we rewrote our feature branch to contain the changes of <code class=\"language-plaintext highlighter-rouge\">c</code> and <code class=\"language-plaintext highlighter-rouge\">d</code> but with the conflicts resolved (<code class=\"language-plaintext highlighter-rouge\">c'</code> and <code class=\"language-plaintext highlighter-rouge\">d'</code>) it will cleanly apply on top of <code class=\"language-plaintext highlighter-rouge\">f</code> using a <em>fast-forward merge</em>.</p>\n            <h2 id=\"non-fast-forward-merge\">Non Fast-Forward Merge</h2>\n            <p><img src=\"https://jan.alphadev.net/assets/2025/merge-after-rebase-non-ff.svg\" alt=\"\" />\n              [<a href=\"https://jan.alphadev.net/assets/2025/merge-after-rebase-non-ff.mmd\">Source</a>]</p>\n            <p>Same goes for the <em>non-ff-merge</em>, it will cleanly non-fast-forward merge, but it will now have its own merge commit that allows us to document the feature and some clients, like my beloved <a href=\"https://www.sublimemerge.com\">Sublime Merge</a> do support collapsing of merge commits (and showing the combined diff of the entire branch when selected), which in the best case makes the mainline a series of standalone feature merge commits.</p>\n            <h1 id=\"merge-flow\">Merge Flow</h1>\n            <p>The merge flow also allows us to integrate the bugfix of commit <code class=\"language-plaintext highlighter-rouge\">e</code> into our feature branch. But remember the changes in <code class=\"language-plaintext highlighter-rouge\">e</code> and <code class=\"language-plaintext highlighter-rouge\">d</code> are conflicting. That means we do have to solve the conflicts all the same.</p>\n            <p><img src=\"https://jan.alphadev.net/assets/2025/merge-flow-before.svg\" alt=\"\" />\n              [<a href=\"https://jan.alphadev.net/assets/2025/merge-flow-before.mmd\">Source</a>]</p>\n            <p>Then when it comes to merging the thing back, depending on the complexity of our conflict resolution of <code class=\"language-plaintext highlighter-rouge\">c</code> and <code class=\"language-plaintext highlighter-rouge\">e</code>, we may now have to solve new conflicts that arise from <code class=\"language-plaintext highlighter-rouge\">e</code> already being on the mainline and us trying to <em>merge</em> a modified version of <code class=\"language-plaintext highlighter-rouge\">e</code> (<code class=\"language-plaintext highlighter-rouge\">e</code> plus conflict resolution changes) back into main. These conflicts are easily solved most of the time, mostly preferring using the fixed variant from the feature branch. But not always, code is messy.</p>\n            <p>Oh, and now that we have merged main into the feature branch, this effectively blocks the feature branch from being rebased. It technically is possible, but really painful and hard to get right.</p>\n            <p><img src=\"https://jan.alphadev.net/assets/2025/merge-flow-after.svg\" alt=\"\" />\n              [<a href=\"https://jan.alphadev.net/assets/2025/merge-flow-after.mmd\">Source</a>]</p>\n            <p>After the <em>merge</em> back to main, it looks like this. We now have persisted the conflict and its resolution in full to the mainline.</p>\n            <h1 id=\"observations\">Observations</h1>\n            <p>Comparing the difference in simplicity between the final graphs of the two methods, one rewrote the history to a cleaner state, only keeping what will be of interest in the future (namely that the bugfix happened in <code class=\"language-plaintext highlighter-rouge\">e</code> and that the feature branch contained the commits <code class=\"language-plaintext highlighter-rouge\">c'</code> and <code class=\"language-plaintext highlighter-rouge\">d'</code>, with proper author attribution and commit messages), while the other was more work and left the graph in a messier state.</p>\n          </article>","date_published":"2025-10-03T00:00:00+00:00","date_modified":"2026-03-07T00:00:00+00:00","tags":["git"],"author":{"name":"Jan Seeger"}},{"id":"https://jan.alphadev.net/blog/2025/static-site-search","url":"https://jan.alphadev.net/blog/2025/static-site-search/","title":"Static Site Search","content_html":"<article class=\"post-content\">\n            <p>I partially write this blog for me, for future reference, partially to help others who encounter similar issues and to lesser extent to have a link with well-formed thoughts that I can share instead of having to come up with lengthy explanation in situ.</p>\n            <p>When I needed to refer to an old post I used to do a Google search with the <code class=\"language-plaintext highlighter-rouge\">site:jan.alphadev.net</code> operator and a keyword, but for years now it had stopped working. Google indexes only a small portion of the page even though all posts and pages are listed in the <a href=\"https://jan.alphadev.net/sitemap.xml\">Sitemap</a> and are properly reachable. <a href=\"https://search.google.com/search-console\">Google’s Search Console</a> isn’t of any use either.</p>\n            <p>Meanwhile I did grep the Markdown sources for this blog for the thing I needed, which worked but doesn’t work on mobile and can only be done by me.</p>\n            <blockquote>\n              <p>Yeah, well, I’m gonna go build my own theme park. With blackjack and hookers! In fact forget the park.</p>\n              <p>– <cite>Bender</cite></p>\n            </blockquote>\n            <p>The plan to finally add my own search has been percolating in the back of my head for more than a year and I had even started to experiment with <a href=\"https://pagefind.app\">pagefind</a>, but I never got the integration into Jekyll working properly<sup id=\"fnref:1\"><a href=\"#fn:1\" class=\"footnote\" rel=\"footnote\" role=\"doc-noteref\">1</a></sup>.</p>\n            <p>This morning I stumbled over <a href=\"https://www.stephanmiller.com/static-site-search/\">this post</a> by Stephan Miller, that described how lightweight and easy the implementation using <a href=\"http://lunrjs.com\">Lunr.js</a> is, and now… I do have my own search index.</p>\n            <p>I opted go all the way by pre-computing the entire index during build-time and then push it along with the rest of the static files. (<a href=\"https://jan.alphadev.net/assets/index.json\">/assets/index.json</a>, if you’re curious). At the time of writing the entire index is approximately 1.2 MB in size. But is only loaded when you visit the <a href=\"https://jan.alphadev.net/search\">/search page</a>.</p>\n            <p>Both Lunr itself and the index are loaded from this domain<sup id=\"fnref:2\"><a href=\"#fn:2\" class=\"footnote\" rel=\"footnote\" role=\"doc-noteref\">2</a></sup> and once successfully loaded, work entirely offline. No requests are sent anywhere.</p>\n            <p>The only downside are the 1.2 MB initial load and the requirement for working JavaScript. But it is still way better than having to grep Markdown files.</p>\n            <p>Supposedly there are <a href=\"https://lunrjs.com/guides/customising.html\">all kinds of smarts</a> that can be enabled during index creation, I have left everything default for now, but let’s see how long that lasts.</p>\n            <div class=\"footnotes\" role=\"doc-endnotes\">\n              <ol>\n                <li id=\"fn:1\">\n                  <p>Have I mentioned that I dislike the way Ruby feels? Their whole premise is DX, but I just can’t get accustomed to it. It is just not for me. <a href=\"#fnref:1\" class=\"reversefootnote\" role=\"doc-backlink\">&#8617;</a></p>\n                </li>\n                <li id=\"fn:2\">\n                  <p>Yes, I know, technically GitLab Pages underneath <a href=\"#fnref:2\" class=\"reversefootnote\" role=\"doc-backlink\">&#8617;</a></p>\n                </li>\n              </ol>\n            </div>\n          </article>","date_published":"2025-09-27T00:00:00+00:00","date_modified":"2026-03-07T00:00:00+00:00","tags":[],"author":{"name":"Jan Seeger"}},{"id":"https://jan.alphadev.net/blog/2025/droidcon","url":"https://jan.alphadev.net/blog/2025/droidcon/","title":"The Scope Creep","content_html":"<article class=\"post-content\">\n            <center>\n              <figure>\n                <img src=\"https://jan.alphadev.net/assets/2025/652F5E86-A25D-4601-9DB8-B8CBCD22469B.jpg\">\n                <figcaption>DroidCon was nice, learned some things, am axhausted, will now head to the city to grab a bite.</figcaption>\n              </figure>\n            </center>\n          </article>","date_published":"2025-09-26T00:00:00+00:00","date_modified":"2026-03-07T00:00:00+00:00","tags":["berlin","droidcon"],"author":{"name":"Jan Seeger"}},{"id":"https://jan.alphadev.net/blog/2025/firsts","url":"https://jan.alphadev.net/blog/2025/firsts/","title":"Firsts","content_html":"<article class=\"post-content\">\n            <p>Well there will always be a first. This time it is the first time I not only dislike, but outright despise an OS update. Well done, Apple.</p>\n            <p>At the moment Reddit is full of techy people who want to turn it off again (and no, <a href=\"https://www.reddit.com/r/ios/comments/1l7kmoq/ios_26_psa_turn_on_reduce_transparency/\">reduce transparency</a> doesn’t solve the weird bubble borders around everything).</p>\n            <p>Wait until the general public finds out about this. It is going to turn the “install the latest updates to be safe online” to “do NOT install the new iOS otherwise your phone will look and feel like shit”.</p>\n            <p>Calling it right now: The next few months will be full of tales from people who have their friends and family ask them for advice after they had accidentally installed iOS 26 and now can’t get rid of it anymore.</p>\n            <p>But hey, at least nobody will talk about how shitty Siri and Apple Intelligence is anymore, right?</p>\n          </article>","date_published":"2025-09-15T00:00:00+00:00","date_modified":"2026-03-07T00:00:00+00:00","tags":["apple","iOS","macos"],"author":{"name":"Jan Seeger"}},{"id":"https://jan.alphadev.net/blog/2025/sustainable-products","url":"https://jan.alphadev.net/blog/2025/sustainable-products/","title":"Sustainable Products","content_html":"<article class=\"post-content\">\n            <p>I just returned from a camping trip with the motorcycle. While packing up my gear, I noticed that the tree straps are starting to fray. This is the moment I usually make a mental note to look for replacements, so that they are ready to go should the other ones fail.</p>\n            <h2 id=\"hummingbird-hammocks\">Hummingbird Hammocks</h2>\n            <p>My hammock and straps both are from <a href=\"https://hummingbirdhammocks.com\">Hummingbird Hammocks</a>, and I am very satisfied with it. It is comfy, lightweight and packs down to an ultra small size.</p>\n            <p>Unfortunately they went out of business 10 months ago and have put all their designs a cut patterns, pretty much everything <a href=\"https://github.com/HummingbirdHammocks/ultralight-hammocks\">on GitHub</a> under the MIT license. I am sad that they are gone, and awestruck by their brazen move to still uphold the quality promise to their customers at the same time.</p>\n            <h2 id=\"helinox\">Helinox</h2>\n            <p>Some other gear I love and use regularly are my <a href=\"https://helinox.eu/de/products/lite-cot\">Helinox Lite Cot</a>, which has a small tear in the fabric. I emailed them about it and without hesitation they sent me the replacement part free of charge. I haven’t yet installed it, but keep it handy should the tear get to the point that using it becomes uncomfortable.</p>\n            <h2 id=\"valleys--hills\">Valleys &amp; Hills</h2>\n            <p>Another one is my travel towel from <a href=\"https://www.valleysandhills.de/collections/frontpage/products/reisehandtuch-linnea-mittel-1\">Valleys &amp; Hills</a>, which is packs down well, is lightweight, drys quickly and doesn’t smell. They are sold by a local couple near where I live that is travelling by van and couldn’t find any suitable products, then decided to make them themselves. Highly recommend.</p>\n            <p>And no, <a href=\"https://jan.alphadev.net/about/#product-links\">I still don’t make <em>any</em> money with this</a>. I am merely a satisfied customer wanting them all to succeed, in order for them to be able to uphold the quality and sustainability promises to their customers (e.g. me).</p>\n          </article>","date_published":"2025-09-07T00:00:00+00:00","date_modified":"2026-03-07T00:00:00+00:00","tags":["camping","motorcycle","sustainability"],"author":{"name":"Jan Seeger"}},{"id":"https://jan.alphadev.net/blog/2025/compiler-explorer-for-kotlin","url":"https://jan.alphadev.net/blog/2025/compiler-explorer-for-kotlin/","title":"Compiler Explorer for Kotlin","content_html":"<article class=\"post-content\">\n            <p>In addition to the ever fantastic <a href=\"https://play.kotlinlang.org/\">Kotlin Playground</a>, <a href=\"https://jan.alphadev.net/blog/2024/copy-function-specifics/#kotlin-playground\">I regularly use to answer quick questions</a>, as of last summer Matt Godbolt’s <a href=\"https://godbolt.org/\">Compiler Explorer</a> has <a href=\"https://android-developers.googleblog.com/2024/09/become-better-android-developer-compiler-explorer.html\">gained the ability to analyse various Android formats</a>, including Java, Dex and Kotlin.</p>\n            <p>Godbolt is suited to answer questions about rather smaller, self-contained snippets of code. Larger binaries and whole apps are best dissected using <a href=\"https://apktool.org/\">Apktool</a> or <a href=\"https://java-decompiler.github.io\">jd-gui</a>, which thankfully are both open source<sup><a href=\"https://github.com/iBotPeaches/Apktool\">1</a>, <a href=\"https://github.com/java-decompiler/jd-gui\">2</a></sup>.</p>\n            <p>Additionally, JetBrains’ <a href=\"https://github.com/fesh0r/fernflower\">Fernflower</a> comes in handy when you want to dissect some code. <a href=\"https://blog.jetbrains.com/idea/2024/11/in-memory-of-stiver/\">RIP Stiver</a>.</p>\n          </article>","date_published":"2025-08-16T00:00:00+00:00","date_modified":"2026-03-07T00:00:00+00:00","tags":["godbolt","kotlin"],"author":{"name":"Jan Seeger"}},{"id":"https://jan.alphadev.net/blog/2025/trip-report-schwaebische-alb","url":"https://jan.alphadev.net/blog/2025/trip-report-schwaebische-alb/","title":"Trip Report: Schwäbische Alb","content_html":"<article class=\"post-content\">\n            <p><img src=\"https://jan.alphadev.net/assets/2025/IMG_4507.jpeg\" alt=\"Screenshot showing the Route marked on a Map\" /></p>\n            <h1 id=\"ulm\">Ulm</h1>\n            <p>Last Sunday afternoon I was off to Ulm to attend this year’s <a href=\"https://www.ulm.de/tourismus/stadtgeschichte/feste-und-traditionen/schwoermontag/schwoermontag_2025/schwoermontag_2025\">Nabada</a> and subsequent Schwörmontag Party in the old town. Making sure to avoid the Autobahn, sticking to Bundesstraße only, the trip was smooth almost throughout.</p>\n            <p>Apple Maps had a few hiccups where in order to avoid the Bundesstraße it would try to lead me onto a bicycle lane that runs right along the Bundesstraße, but after ignoring that it recalculated and lead me the correct way.</p>\n            <p>Shortly before reaching Ulm it had tried to send me onto the Autobahn, which is why I made a quick stop in Merklingen and restarted the routing with the “Avoid Motorways” option again<sup id=\"fnref:1\"><a href=\"#fn:1\" class=\"footnote\" rel=\"footnote\" role=\"doc-noteref\">1</a></sup>.</p>\n            <p>Arriving in Ulm I had approximately 120 km charge left, which is why I decided to park it and leave it there until departure.</p>\n            <p>Luckily, I made it there right in time before the rain and heavy winds started.</p>\n            <h1 id=\"lake-constance\">Lake Constance</h1>\n            <p>The next leg of the journey was unremarkable, had to charge at the mid-point, which was either Biberach or Bad Saulgau.</p>\n            <p>Went with the first option and charged the bike at an <a href=\"https://en.chargemap.com/enbw-energie-baden-wuerttemberg-15-rollingstr-biberach.html\">EnBW charger at the Landratsamt Biberach</a>. Rolled in there with 28 kms left, took 50 minutes to full charge, no issues.</p>\n            <p>The way onwards was nothing but beautiful, Maps had lead me through weird and narrow forrest roads. But the view was breathtaking.</p>\n            <p>Arriving with 46 km rest charge in Bodman-Ludwigshafen at the Lake Constance, I was lazy and decided to make the charging a tomorrow problem.</p>\n            <h1 id=\"black-forrest\">Black Forrest</h1>\n            <p>For the onward leg, I still had to charge. Nowadays I rarely use the public chargers, but every time I try to use <a href=\"https://en.chargemap.com/de-wlb-stockach-2-messkircher-strasse.html\">an Aldi one</a> I run into weird issues. This time no debit or credit card worked, not even unlocking it with the <a href=\"https://apps.apple.com/app/id1232210521\">Mobility+</a> using the QR code.</p>\n            <p>I found a <a href=\"https://en.chargemap.com/baugenossenschaft-stockach.html\">different charger</a> in a residential area, built and operated by their housing association. I initially started the charge using the <a href=\"https://apps.apple.com/app/id1232210521\">Mobility+</a> app via Roaming, but then found their app instructions posted to a wall. After downloading their <a href=\"https://apps.apple.com/app/id1534894906\">ChargeAtFriends app</a> and setting up an account, I cancelled the charge process and restarted using theirs.</p>\n            <p>The journey to the Black Forrest was nice and unremarkable, beautiful but not as ridiculously beautiful as the roads were the day before.</p>\n            <p>Blumberg was the mid-point to take a break and decide if I was going further to the Titisee Lake for hammock camping or go back home due to the shitty weather that was predicted for the next few days. If I opted to make the way back home, I would have to recharge, whereas I would easily make it to the Lake Titisee with the remaining charge.</p>\n            <p>I hooked it up to an <a href=\"https://en.chargemap.com/energiedienst-hauptstrasse-58-blumberg.html\">EnBW charger</a> and went to see the <a href=\"https://www.stadt-blumberg.de/freizeit-tourismus/entdecken-erleben/schleifenbachwasserfaelle\">Schleifenbachwasserfälle</a> while the bike was charging.</p>\n            <h1 id=\"return-to-home\">Return to Home</h1>\n            <p>Since the B27 runs from Blumberg straight through Tübingen I had assumed it would be 2 hours of riding Bundesstraße. Road constructions and diversions lead me right off it and through Towns, Country Roads and lots and lots of roundabouts.</p>\n            <p>I decided to make a short break in Balingen, then continue on back home. One last diversion caused by another construction site briefly lead me through a dirt road into the wrong direction, but after that was cleared I made it home.</p>\n            <h1 id=\"resumé\">Resumé</h1>\n            <p>Total: Distance 436 km, Charging costs 11,35 € (+ the amount I had to top it up at home again)</p>\n            <p>All in all I made it through the entire trip without any bad weather<sup id=\"fnref:2\"><a href=\"#fn:2\" class=\"footnote\" rel=\"footnote\" role=\"doc-noteref\">2</a></sup>.</p>\n            <h2 id=\"takeaways\">Takeaways</h2>\n            <ul>\n              <li>\n                <p><a href=\"https://apps.apple.com/app/id1232210521\">Mobility+</a> really is the Swiss Army knife of electric charging, a bit on the expensive side but it just works everywhere. If possible I will always try local accounts first but it is nice to have a powerful fallback option at hand.</p>\n              </li>\n              <li>\n                <p>Taking a break every once in a while makes all the difference for a smooth ride. Fresh mind, rehydrated, and the option to take a peek at the upcoming route and if needed make adjustments.</p>\n              </li>\n              <li>\n                <p>Public chargers are now a solved problem and range anxiety effectively nonexistent. Except for Aldi ones, they always seem to have issues making a connection to the payment provider.</p>\n              </li>\n              <li>\n                <p>It was the first time I rode an actual trip with both side cases, the top case and my backpack. I didn’t notice any difference in handling though. If anything it cost slightly more energy, but then the acceleration still didn’t feel any worse.</p>\n              </li>\n              <li>\n                <p>Unlike my <a href=\"https://jan.alphadev.net/blog/2024/trip-report-black-forest/\">last larger trip</a>, I used the head up display for navigation and less for previewing the curve of the road. My ability to anticipate curves seems to have improved lots since last time.</p>\n              </li>\n              <li>\n                <p>The charger in Stockach didn’t show up on the ChargeMap app, but it did on the EnBW one. Next time I’m in a pinch again, I know to check several apps. And I requested it to be added to the ChargeMap DB.</p>\n              </li>\n            </ul>\n            <div class=\"footnotes\" role=\"doc-endnotes\">\n              <ol>\n                <li id=\"fn:1\">\n                  <p>I already had it set to “Avoid Motorways” when I set out. But it seems to have forgotten. <a href=\"#fnref:1\" class=\"reversefootnote\" role=\"doc-backlink\">&#8617;</a></p>\n                </li>\n                <li id=\"fn:2\">\n                  <p>That always happened after my arrival. <a href=\"#fnref:2\" class=\"reversefootnote\" role=\"doc-backlink\">&#8617;</a></p>\n                </li>\n              </ol>\n            </div>\n          </article>","date_published":"2025-07-26T00:00:00+00:00","date_modified":"2026-03-07T00:00:00+00:00","tags":["motorcycle","zero s 2024","travels"],"author":{"name":"Jan Seeger"}},{"id":"https://jan.alphadev.net/blog/2025/gear-replacements","url":"https://jan.alphadev.net/blog/2025/gear-replacements/","title":"Gear Replacements","content_html":"<article class=\"post-content\">\n            <p>To continue on my <a href=\"https://jan.alphadev.net/blog/2023/gear-replacements/\">last Gear Replacements post</a>, here’s what has happened since:</p>\n            <h1 id=\"helmet\">Helmet</h1>\n            <p>After my <a href=\"https://jan.alphadev.net/blog/2025/motorcycle-post-mortem/\">motorcycle accident</a> I replaced my Scorpion EXO 1200 Air with a <a href=\"https://www.scorpion-helme.com/on-road/integral-helme/scorpion-exo-520-evo-air/\">Scorpion EXO 520 Evo</a>, which is okay but has <em>noticably more wind noise</em> at higher speeds. It protects my head, but is quite annoying.</p>\n            <h1 id=\"keyboard\">Keyboard</h1>\n            <p>Due to a coffee-related accident, I lost my CoolerMaster Quick Fire Rapid-i, which had been in use since 2015. During that 10 years, which include almost 5 years of everyday home office use, it was extensively used (and completely taken apart and thoroughly cleaned once a year) and thus looked the part. It is now replaced with a Keychron K3 QMK v3 with Banana Switches. Over it’s lifetime the Firmware was updated several times, but I had always lamented the lack of customizable QMK firmware, which just wasn’t a thing yet when I acquired it.</p>\n            <h1 id=\"airpod-pro-2\">AirPod Pro 2</h1>\n            <p>I replaced my AirPod Pros with the second gen a while ago. No comparison. Get the new version even if the old ones are on sale!</p>\n            <h1 id=\"wd-red\">WD Red</h1>\n            <p>Another one of those instances where I woke up to some alert from the NAS: A drive had died, so I ordered two replacements. One to replace the broken drive with and on spare. They arrived 3 days later, unfortunately after 2 days the second drive in the NAS died, taking the entire volume with it. I then ordered 3 more drives to start totally fresh. So now I have 5 brand new WD Red drives, 4 in the NAS and 1 spare.</p>\n          </article>","date_published":"2025-07-18T00:00:00+00:00","date_modified":"2026-03-07T00:00:00+00:00","tags":["travels","gear"],"author":{"name":"Jan Seeger"}},{"id":"https://jan.alphadev.net/blog/2025/copenhagen","url":"https://jan.alphadev.net/blog/2025/copenhagen/","title":"Copenhagen","content_html":"<article class=\"post-content\">\n            <center>\n              <figure>\n                <img src=\"https://jan.alphadev.net/assets/2025/A7B86E2E-B977-42F3-8453-83D72A7B6C03.jpg\">\n                <figcaption>Copenhagen</figcaption>\n              </figure>\n            </center>\n          </article>","date_published":"2025-05-23T00:00:00+00:00","date_modified":"2026-03-07T00:00:00+00:00","tags":["travels","copenhagen"],"author":{"name":"Jan Seeger"}},{"id":"https://jan.alphadev.net/blog/2025/localsend","url":"https://jan.alphadev.net/blog/2025/localsend/","title":"LocalSend","content_html":"<article class=\"post-content\">\n            <p>There’s <a href=\"https://support.apple.com/en-us/119857\">AirDrop</a> for Apple Devices and there’s <a href=\"https://support.google.com/android/answer/9286773?hl=en\">Quick Share</a> for Android. But in order to transfer data across ecosystem boundaries, one needed to upload the data to a cloud service first and then download everything again on the receiving device.</p>\n            <p><a href=\"https://localsend.org\">LocalSend</a> is an <a href=\"https://github.com/localsend/localsend\">open-source</a>, cross-platform implementation in Dart. It works on a plethora of different platforms like all major Desktop and Mobile OSes, but also supports headless clients for automations.</p>\n          </article>","date_published":"2025-04-26T00:00:00+00:00","date_modified":"2026-03-07T00:00:00+00:00","tags":[],"author":{"name":"Jan Seeger"}},{"id":"https://jan.alphadev.net/blog/2025/motorcycle-post-mortem","url":"https://jan.alphadev.net/blog/2025/motorcycle-post-mortem/","title":"Motorcycle Accident Post Mortem","content_html":"<article class=\"post-content\">\n            <style>\n              ul.time li {\n              \tdisplay: list-item;\n              \tlist-style-type: \"⏱️\";\n              \tpaliing-inline-start: 1ch;\n              }\n            </style>\n            <p>On Thursday 20th February 2025 at 14:06 I had a motorcycle accident. I lost traction at low speed (approx. 35km/h) and was thrown off, landed hard, rolled over several times. This post will serve as a post mortem which drills into the causes, describes mitigative measures and preventative steps.</p>\n            <p><em>Note:</em> This post had started in my head, while laying awake in a hospital bed the night after the crash, but publishing has been deliberately delayed until all the legal proceedings have concluded.</p>\n            <h1 id=\"issue-summary\">Issue summary.</h1>\n            <p>Several smaller causes, each not severe enough to outright cause a crash, combined, lead to catastrophic failure.</p>\n            <h1 id=\"a-timeline\">A Timeline.</h1>\n            <h2 id=\"monday-25-january-2025\">Monday 25. January 2025</h2>\n            <ul class=\"time\">\n              <li>13:50 Rode bike a few KMs in in the rain (in \"rain mode\"), got throttle fault warning</li>\n              <li>13:51 Changed drive select to sport mode to clear the error message</li>\n              <li>13:51 Parked in garage, waiting for better weather</li>\n            </ul>\n            <h2 id=\"thursday-20-february-2025\">Thursday 20. February 2025</h2>\n            <ul class=\"time\">\n              <li>14:02 Started bike up</li>\n              <li>14:02 got error message about 12V battery being too cold. Throttle was locked.</li>\n              <li>14:04 After warming the battery up using integrated heater, the message was gone and throttle would work.</li>\n              <li>14:05 Rode two turns</li>\n              <li>14:05 Made bow around construction site</li>\n              <li>14:05 Lost traction by oversteering to the right</li>\n              <li>14:05 Tried to compensate in the other direction, oversteered to the left</li>\n              <li>14:05 Tried to compensate to the right again and fell over</li>\n              <li>14:05 Tumbled over the street four times</li>\n            </ul>\n            <h1 id=\"impact-and-mitigation\">Impact and Mitigation</h1>\n            <p>Ambulance driver, 5 hours of wait time in the emergency room, pain in shoulder did not set in until 90 min after the accident.</p>\n            <h1 id=\"root-cause-analysis\">Root cause analysis</h1>\n            <h2 id=\"below-operating-temperature\">Below operating temperature</h2>\n            <p>The 12V battery being too cold to operate and needing to be heated, should have served as a giant red flag that the entire bike was below operating temperature. While bikes do not <em>need</em> winter tires in Germany, the rubber mix isn’t made to be ridden at low temperatures.</p>\n            <p>Air temperature during the accident was 13°C, but the bikes temperature sensor showed 4°C at the main battery pack, which is safe to assume the rest of the bike (including tires) had a similar temperature.</p>\n            <h2 id=\"sport-mode\">Sport mode</h2>\n            <p>Forgetting to set back the ride mode to Standard or Rain, even after clearing the errors might have lead to the throttle to respond with too much torque than the situation could handle.</p>\n            <h1 id=\"contributing-factors\">Contributing factors</h1>\n            <h2 id=\"protective-gear\">Protective gear</h2>\n            <p>Because the planned route was merely 450 m, donning the proper protective gear was omitted, leading to scratches and bruises.</p>\n            <p>Wearing proper protective gear might have led to sliding on the contact pads instead of the torso having to dissipate the excess momentum by rolling over.</p>\n            <h2 id=\"ground-composition\">Ground composition</h2>\n            <p>Freshly mended construction site with spots of fresh asphalt. Wet spot, shaded by a large house.</p>\n            <p>Considered contributing factor because “a wet road” shouldn’t <em>directly lead</em> to an accident, but will factor into it.</p>\n            <h2 id=\"unknown-tire-pressure\">Unknown tire pressure</h2>\n            <p>The bike has just come out of winter sleep and was yet to be checked for sufficient tire pressures. That was to be the next step after charging and a good cleaning.</p>\n            <h1 id=\"resolution-and-recovery\">Resolution and recovery</h1>\n            <h2 id=\"shoulder-surgery\">Shoulder surgery</h2>\n            <div style=\"width: 100%; display: inline-block;\">\n              <img style=\"width:49%\" src=\"https://jan.alphadev.net/assets/2025/BeeSnapshot_2025-03-21_16_47_29.png\" />\n              <img style=\"width:49%\" src=\"https://jan.alphadev.net/assets/2025/BeeSnapshot_2025-03-21_16_49_32.png\" />\n            </div>\n            <p>I have since received a shoulder surgery where they applied a titanium bracket to fix my broken collar bone in place, until the bone grows back together.</p>\n            <h2 id=\"restore-bike\">Restore bike</h2>\n            <p><img src=\"https://jan.alphadev.net/assets/2025/76176357924__C61A11C0-52A7-4E9D-BB2E-530007294760.jpeg\" alt=\"\" /></p>\n            <p>After the initial assessment the handlebar was mauled by the asphalt, the bike has lost its foot pegs on the right side and the rear brake lever. But other than that it seems unharmed<sup id=\"fnref:brake\"><a href=\"#fn:brake\" class=\"footnote\" rel=\"footnote\" role=\"doc-noteref\">1</a></sup>. Frame is not bent, the battery and drive train are fine.</p>\n            <h1 id=\"corrective-and-preventative-measures\">Corrective and preventative measures</h1>\n            <ol>\n              <li>Heed warning signs and red flags!</li>\n              <li>Always wear protective gear (even for short trips of a few hundred meters)</li>\n              <li>Check temperatures before riding and let bike soak in the sun if too cold</li>\n              <li>Buy a cheap battery powered tire pump and pressure gauge and regularly check tires</li>\n            </ol>\n            <div class=\"footnotes\" role=\"doc-endnotes\">\n              <ol>\n                <li id=\"fn:brake\">\n                  <p>It ended up needing a new rear brake pump. <a href=\"#fnref:brake\" class=\"reversefootnote\" role=\"doc-backlink\">&#8617;</a></p>\n                </li>\n              </ol>\n            </div>\n          </article>","date_published":"2025-04-04T00:00:00+00:00","date_modified":"2026-03-07T00:00:00+00:00","tags":["motorcycle","zero s 2024"],"author":{"name":"Jan Seeger"}},{"id":"https://jan.alphadev.net/blog/2025/fun-with-drives2","url":"https://jan.alphadev.net/blog/2025/fun-with-drives2/","title":"Fun with drives, again","content_html":"<article class=\"post-content\">\n            <p>Monday: Another one of those instances where I woke up to an alert mail:</p>\n            <blockquote>\n              <p>Storage Pool 2 on XXXXXX has degraded (total number of drives: 2; number of active drives: 1).</p>\n            </blockquote>\n            <p>Presumably after a system update and subsequent reboot one of the two M.2 drives couldn’t be found anymore. Not only as part of the Storage Pool but it didn’t show up at all.</p>\n            <p>First, I tried rebooting, which didn’t change anything.</p>\n            <p>And for good measure I ran the script that <a href=\"https://github.com/007revad/Synology_HDD_db\">adds the non-Synology blessed drives</a> again. It dutifully reported the drive models were added to the database.</p>\n            <p>And after a reboot to load the new database it still didn’t show up.</p>\n            <p>To not break anything further by hastily trying things out, <a href=\"https://jan.alphadev.net/blog/2024/fun-with-drives/#muting-the-alarm\">I muted the alarm</a>. The storage pool was online and working albeit being degraded. Fixing this must be postponed until time allows.</p>\n            <h1 id=\"scheduled-maintenance\">Scheduled maintenance</h1>\n            <p>On Saturday my new <abbr title=\"Uninterruptible Power Supply\">UPS</abbr> arrived and to hook it up I had to shutdown the machine. While it was powered off I removed both drives and reseated them.</p>\n            <p>When I booted up the device again the second drive mysteriously appeared. The drive was detected but the storage pool could not be <em>repaired</em> because the drive supposedly wasn’t compatible but <em>adding</em> it to the pool as replacement for the <em>missing</em> drive did work.</p>\n            <h1 id=\"of-note\">Of Note</h1>\n            <ul>\n              <li>Both M.2 drives are identical and have the same model number. Only the one in Slot 1 was detected (Before and after patching the database)</li>\n              <li>Loosing the electrical contact due to a software update is very unlikely.</li>\n            </ul>\n            <h1 id=\"further-proceedings\">Further proceedings</h1>\n            <p>As with last time: Nothing.</p>\n            <p>Now all drives are recognised and all storage pools are working properly. Time will tell if the next update breaks the pools again. But now that I have documented the steps taken,  recovery time should be negligible.</p>\n          </article>","date_published":"2025-03-23T00:00:00+00:00","date_modified":"2026-03-07T00:00:00+00:00","tags":["synology"],"author":{"name":"Jan Seeger"}},{"id":"https://jan.alphadev.net/blog/2025/semi-automatic-appearance-switching","url":"https://jan.alphadev.net/blog/2025/semi-automatic-appearance-switching/","title":"Semi-Automatic macOS Dark/Light mode switching","content_html":"<article class=\"post-content\">\n            <p>I prefer to keep the appearance setting to auto, so that my computer will be in light mode during the day and in dark mode at night.</p>\n            <p><img src=\"https://jan.alphadev.net/assets/2025/0195327a-9632-7cfd-8dc3-f8b7da5cbc50.jpeg\" alt=\"Appearance Pane in the macOS System Preferences app that shows the Appearance set to Auto\" /></p>\n            <p>But sometimes when working in a particularly dim or an exceedingly bright room, I like to override this using this simple shortcut here:</p>\n            <p><img src=\"https://jan.alphadev.net/assets/2025/0195327a-0b8c-7111-98dc-7fed81131ef5.jpeg\" alt=\"Shortcut that has one instruction: Toggle appearance\" /></p>\n            <p>This would work, but then permanently set it to the opposite value, say I’d invoke the shortcut during the day, it would set it to dark mode and stay that way forever.</p>\n            <p>Even weirder: The Auto option isn’t even available via the Shortcuts interface. So you’d have to remember<sup id=\"fnref:1\"><a href=\"#fn:1\" class=\"footnote\" rel=\"footnote\" role=\"doc-noteref\">1</a></sup> to go to the System Preferences and switch it back to auto or keep manually switching using the Shortcut.</p>\n            <h1 id=\"2nd-approach-programmatically-setting-the-value\">2nd approach: Programmatically setting the value</h1>\n            <p>macOS stores all settings in .plist files, which can be accessed using the <code class=\"language-plaintext highlighter-rouge\">defaults</code> command. The automatic switching and interface style can be found under the following keys:</p>\n            <div class=\"language-plaintext highlighter-rouge\">\n              <div class=\"highlight\">\n                <pre class=\"highlight\"><code>AppleInterfaceStyleSwitchesAutomatically = 1\nAppleInterfaceStyle = Dark\n</code></pre>\n              </div>\n            </div>\n            <p>But for the changes to the .plist to take effect you’d have to log out and log in again, which is not optimal for a casual action.</p>\n            <h1 id=\"3rd-approach-telling-ui-automator-to-tell-macos-to-switch\">3rd approach: Telling UI Automator to tell macOS to switch</h1>\n            <p>The <a href=\"https://www.reddit.com/r/MacOS/comments/abvlrs/comment/ed4pb38/\">UI Automator can override the values</a> both immediately and will not overwrite the the auto setting.</p>\n            <p><img src=\"https://jan.alphadev.net/assets/2025/01953279-cf72-7d80-9b24-01b9205b2233.jpeg\" alt=\"tell application &quot;System Events&quot; to tell appearance preferences to set dark mode to not dark mode\" /></p>\n            <p>This now properly works, while being overly complicated (Shortcut running Apple Script, invoking UI Automator to change a simple value in a .plist) it ticks all the boxes for me.</p>\n            <div class=\"footnotes\" role=\"doc-endnotes\">\n              <ol>\n                <li id=\"fn:1\">\n                  <p>or notice days later <a href=\"#fnref:1\" class=\"reversefootnote\" role=\"doc-backlink\">&#8617;</a></p>\n                </li>\n              </ol>\n            </div>\n          </article>","date_published":"2025-03-05T00:00:00+00:00","date_modified":"2026-03-07T00:00:00+00:00","tags":["macos","shortcuts"],"author":{"name":"Jan Seeger"}},{"id":"https://jan.alphadev.net/blog/2025/opml-tool","url":"https://jan.alphadev.net/blog/2025/opml-tool/","title":"OPML tool","content_html":"<article class=\"post-content\">\n            <p>As already hinted at in the <a href=\"https://jan.alphadev.net/blog/2024/tracking-newsfeed-changes/\">Tracking Newsfeed changes</a> post, I have written a small tool that reads an OPML file, reformats it in a reproducible way, and then outputs it back again into the same file.</p>\n            <p>It was deeply entangled with the greater RSS project I am working on in the background. But I got it successfully separated and put a minimal Amper wrapper<sup id=\"fnref:1\"><a href=\"#fn:1\" class=\"footnote\" rel=\"footnote\" role=\"doc-noteref\">1</a></sup> around it, which is way more lightweight than a comparable Gradle-based build.</p>\n            <p>You can grab it <a href=\"https://github.com/janseeger/kotlin-opml\">here</a> and try for yourself:</p>\n            <ol>\n              <li>Clone the repo\n                <div class=\"language-shell highlighter-rouge\">\n                  <div class=\"highlight\">\n                    <pre class=\"highlight\"><code>git clone git@github.com:janseeger/kotlin-opml.git\n</code></pre>\n                  </div>\n    </div>\n              </li>\n              <li>Export the OPML file from your RSS reader of choice and put it in an empty directory\n                <div class=\"language-shell highlighter-rouge\">\n                  <div class=\"highlight\">\n                    <pre class=\"highlight\"><code> <span class=\"nb\">mkdir </span>rss\n <span class=\"nb\">mv </span>feeds.opml rss/\n git init rss\n</code></pre>\n                  </div>\n    </div>\n              </li>\n              <li>Format the OPML\n                <div class=\"language-shell highlighter-rouge\">\n                  <div class=\"highlight\">\n                    <pre class=\"highlight\"><code> <span class=\"nb\">cd </span>kotlin-opml\n ./amper run ../rss/feeds.opml\n <span class=\"nb\">cd</span> ..\n</code></pre>\n                  </div>\n    </div>\n              </li>\n              <li>Track changes using git\n                <div class=\"language-shell highlighter-rouge\">\n                  <div class=\"highlight\">\n                    <pre class=\"highlight\"><code> <span class=\"nb\">cd </span>rss\n git add feeds.oml\n git commit <span class=\"nt\">-m</span> <span class=\"s2\">\"initially adding feed\"</span>\n</code></pre>\n                  </div>\n    </div>\n              </li>\n            </ol>\n            <p>From now on, you can repeat steps 3 and 4, and depending on the cadence and quality of your change messages you’ll get a nice record of what happened to your subscriptions:</p>\n            <ul>\n              <li>You subscribed/unsubscribed a Feed</li>\n              <li>Author changed the name of the Feed</li>\n              <li>Feed URL or even Domain changed</li>\n              <li>Removed broken Feed that couldn’t be retrieved anymore</li>\n            </ul>\n            <h1 id=\"and-now\">And now?</h1>\n            <p>I get that this won’t fix all your problems, but at least, if done regularly can provide interesting insights into your feed, and if nothing else serves as a nice backup.</p>\n            <div class=\"footnotes\" role=\"doc-endnotes\">\n              <ol>\n                <li id=\"fn:1\">\n                  <p>While Amper is not yet ready for large projects, it works wonderfully for small ones like this. <a href=\"#fnref:1\" class=\"reversefootnote\" role=\"doc-backlink\">&#8617;</a></p>\n                </li>\n              </ol>\n            </div>\n          </article>","date_published":"2025-02-14T00:00:00+00:00","date_modified":"2026-03-07T00:00:00+00:00","tags":["kotlin","opml"],"author":{"name":"Jan Seeger"}},{"id":"https://jan.alphadev.net/blog/2025/hello-jellyfin","url":"https://jan.alphadev.net/blog/2025/hello-jellyfin/","title":"Hello, Jellyfin!","content_html":"<article class=\"post-content\">\n            <p>After years of deliberation, and a short but unsuccessful test run in the past, I finally made the switch to from Plex over to Jellyfin.</p>\n            <p>The migration itself was the easiest part, as in the past I had started to use the Dockerised version of Plex again, which again does have folder permission issues when mounting the data into the Container, but thanks to watchtower gets updated in a timely manner (within hours of a new update dropping).</p>\n            <p>For the switch all I had to do was to <a href=\"https://jellyfin.org/docs/general/installation/container/\">download the Jellyfin docker image</a>, mount the same media folders that Plex had and start it up. After a few clicks in the user interface, it was ready to go: I switched the destination in the reverse proxy to the new instance and stopped the Plex container.</p>\n            <p>All this merely took a couple of minutes.</p>\n            <h1 id=\"app-support\">App Support</h1>\n            <p>It took me a while to get all the apps replaced, with all the features I want.</p>\n            <h2 id=\"macos\">macOS</h2>\n            <ul>\n              <li><a href=\"https://firecore.com/infuse\">Infuse</a> stays, as it supports both Plex and Jellyfin</li>\n              <li><a href=\"https://www.plex.tv/plexamp/\">Plexamp</a> -&gt; <a href=\"https://apps.apple.com/app/finer-player/id6738301953\">Finer</a></li>\n            </ul>\n            <h2 id=\"appletv\">AppleTV</h2>\n            <ul>\n              <li><a href=\"https://firecore.com/infuse\">Infuse</a>, see macOS.</li>\n            </ul>\n            <h2 id=\"ios\">iOS</h2>\n            <ul>\n              <li>\n                <p><a href=\"https://www.plex.tv/plexamp/\">Plexamp</a> / <a href=\"https://prism-music.app\">Prism</a> -&gt; ?</p>\n                <p>On iOS there’s plenty of apps to choose from:</p>\n                <ul>\n                  <li><a href=\"https://tilo.dev/manet/\">Manet</a>: CarPlay, looks nice, Closed Source</li>\n                  <li><a href=\"https://github.com/jmshrv/finamp\">Finamp</a>: No CarPlay 👎, Cross Platform (Flutter), looks awfully Android-y, Open Source</li>\n                  <li><a href=\"https://www.fintunes.app\">Fintunes</a>: No CarPlay 👎, Cross Platform (React), looks nice, <a href=\"fintunes_gh\">Open Source</a></li>\n                  <li><a href=\"https://github.com/rasmuslos/AmpFin\">AmpFin</a>: No CarPlay 👎, looks nice, Open Source</li>\n                </ul>\n                <p>Manet is the only viable alternative at the moment, because the others <a href=\"https://github.com/jmshrv/finamp/issues/24\">lack</a> <a href=\"https://github.com/leinelissen/jellyfin-audio-player/issues/57\">CarPlay</a> <a href=\"https://github.com/rasmuslos/AmpFin/issues/74\">support</a>. But I’ll try them all out when not driving.</p>\n              </li>\n              <li>\n                <p><a href=\"https://prologue.audio\">Prologue</a> -&gt; <a href=\"https://plappa.me/\">plappa</a></p>\n              </li>\n            </ul>\n            <h2 id=\"android\">Android</h2>\n            <ul>\n              <li><a href=\"https://www.plex.tv/plexamp/\">Plexamp</a> -&gt; <a href=\"https://www.fintunes.app\">Fintunes</a></li>\n            </ul>\n          </article>","date_published":"2025-01-28T00:00:00+00:00","date_modified":"2026-03-07T00:00:00+00:00","tags":["plex","jellyfin"],"author":{"name":"Jan Seeger"}},{"id":"https://jan.alphadev.net/blog/2025/motorcycle-comms","url":"https://jan.alphadev.net/blog/2025/motorcycle-comms/","title":"Motorcycle Comms","content_html":"<article class=\"post-content\">\n            <p>The first riding season I deliberately did not listen to music or podcasts, I wanted to experience the journey. Keep the focus on the road ahead.</p>\n            <p>For this second upcoming season I wanted to try a headset, hoping that this would also <a href=\"https://jan.alphadev.net/blog/2024/zero-modifications-carplay/#auto-playing-whatever-was-played-last\">solve my audio problems</a>.</p>\n            <p>After much deliberation, I went with the Kardo one instead of Sena. And for future-proofing, it also had to be a mesh-capable one. So, no Freecom for me.</p>\n            <p>This leaves the Packtalk Edge, Neo and Louis Edition. According to some AI slop pages, the main difference between the Edge and Neo are bigger speakers (44 mm instead of 40 mm) and that you don’t have to manually plug/unplug the USB-C when mounting.</p>\n            <p>There wasn’t much on the specifics of the Louis Edition apart from the older version where it seemed to have been a <a href=\"https://www.bikerportal24.de/louis-cardo-guenstigeres-packtalk-interkom-mit-mesh-technologie/\">rebranded Packtalk Bold</a>. But since my helmet<sup id=\"fnref:1\"><a href=\"#fn:1\" class=\"footnote\" rel=\"footnote\" role=\"doc-noteref\">1</a></sup> only has space to accommodate 40mm speakers anyway, I decided to give it a try.</p>\n            <h1 id=\"packtalk-louis-edition-neo\">Packtalk Louis Edition (Neo)</h1>\n            <p>Installation was a matter of minutes<sup id=\"fnref:2\"><a href=\"#fn:2\" class=\"footnote\" rel=\"footnote\" role=\"doc-noteref\">2</a></sup> and the voice quality is after quick testing more than nice enough for my purposes.</p>\n            <p><strong>The <em>updated</em> Louis Edition headset is a rebranded Packtalk Neo</strong>, which is why it comes with the smaller speakers. Unfortunately, I only noticed this halfway through the installation. I was more preoccupied with properly routing the cables than to look where they terminate. I’ll stick with the Neo for now, but had I known, I would have gone for the Edge.</p>\n            <p><img src=\"https://jan.alphadev.net/assets/2025/IMG_4163.jpeg\" alt=\"Image showing the Packtalk Louis Edition with USB-C cable that is separate from the mounting base\" /></p>\n            <p>Since the USB-C cable is separate from the mounting base, I now <em>always have to put the device on</em> or find a way to <em>tie up the loose cable</em>. Otherwise it will get annoying pretty fast.</p>\n            <p>If you think about getting the Neo or Louis Edition, spend some more and get the Packtalk Edge where the connectors are built-in pogo pins.</p>\n            <h2 id=\"left-to-do\">Left to do</h2>\n            <p>I’ll report back once this thing has seen a few KMs of road.</p>\n            <p>Apart from the indoor voice quality and functionality check, I haven’t seen much. I don’t know yet how long the battery lasts, or if it will work nicely being connected to the phone (to manage mesh participants), while being connected to the CarPlay display. Same goes for my Phone.</p>\n            <div class=\"footnotes\" role=\"doc-endnotes\">\n              <ol>\n                <li id=\"fn:1\">\n                  <p>Scorpion Exo 1200-Air <a href=\"#fnref:1\" class=\"reversefootnote\" role=\"doc-backlink\">&#8617;</a></p>\n                </li>\n                <li id=\"fn:2\">\n                  <p>If you know how to disassemble and properly reassemble the paddings of your helmet <a href=\"#fnref:2\" class=\"reversefootnote\" role=\"doc-backlink\">&#8617;</a></p>\n                </li>\n              </ol>\n            </div>\n          </article>","date_published":"2025-01-12T00:00:00+00:00","date_modified":"2026-03-07T00:00:00+00:00","tags":["motorcycle","zero s 2024","bluetooth"],"author":{"name":"Jan Seeger"}},{"id":"https://jan.alphadev.net/blog/2025/more-zero-modifications","url":"https://jan.alphadev.net/blog/2025/more-zero-modifications/","title":"More Motorcycle Electric Mods","content_html":"<article class=\"post-content\">\n            <h1 id=\"usb-c-pd-charger\">USB-C PD charger</h1>\n            <p><a href=\"https://zeromanual.com/wiki/12V_Accessory_Power_Circuit\">Ostensibly the bike can easily provide up to 500W accessory power</a> using its 12V DC-DC converter. But the built-in USB ports are USB-A and are therefore for phones and other smaller devices.</p>\n            <p>I extended the accessory power lead along the chassis under the riders seat back to the top case, where a weatherproof detachable connector passes power to the inside.</p>\n            <p><img src=\"https://jan.alphadev.net/assets/2025/C1AE43D2-7CF0-48A5-B4DB-D303E2B7C8A2.jpg\" alt=\"100W converter in the Top Case with the power lead coming in through the weatherproof seal\" /></p>\n            <p>The <a href=\"https://pekaway.de/en/collections/alle-produkte/products/pekaway-delivery\">Pekaway 100W USB-C PD adapter</a> was originally designed for caravan but works fine for bikes and MacBooks and Steam Decks. With that the electric mods are done.</p>\n          </article>","date_published":"2025-01-05T00:00:00+00:00","date_modified":"2026-03-07T00:00:00+00:00","tags":["motorcycle","zero s 2024"],"author":{"name":"Jan Seeger"}},{"id":"https://jan.alphadev.net/blog/2025/analytics","url":"https://jan.alphadev.net/blog/2025/analytics/","title":"Analytics","content_html":"<article class=\"post-content\">\n            <p>I just looked it up in git: This blog had used Google Analytics from 10th October 2014 until I removed it again on 25th of January 2018. Originally I had removed it because the data wasn’t of much use to me, rather was a liability.</p>\n            <p>But to satisfy my curiousity, I just added the <a href=\"https://tinylytics.app/\">tinylytics</a> Snippet into the footer of this page. They host in Europe, are GDPR-compliant, and do seem to collect only minimal info (they don’t seem as focused on moving people through marketing funnels as others are). And they provide to option to <a href=\"https://tinylytics.app/public/esJ4sJWwzqovVeaTd-tC\">publicly show the data</a>, so effectively you get to see the same reports I do.</p>\n            <p>This is an experiment, if I can get <em>something</em> positive out of it, I might go ahead with analytics. Or remove it again, if it turns out to be of no use to me.</p>\n          </article>","date_published":"2025-01-03T00:00:00+00:00","date_modified":"2026-03-07T00:00:00+00:00","tags":["analytics"],"author":{"name":"Jan Seeger"}},{"id":"https://jan.alphadev.net/blog/2024/reliably-insecure","url":"https://jan.alphadev.net/blog/2024/reliably-insecure/","title":"Reliably Insecure","content_html":"<article class=\"post-content\">\n            <p><a href=\"https://scotthelme.co.uk/\">Scott Helme</a> has built a small utility webpage that will exclusively work over non-secure HTTP:</p>\n            <p><a href=\"http://httpforever.com\">http://httpforever.com</a></p>\n            <p>Furthermore it is intended for public use ❤️. This is handy for captive portals and various test cases.</p>\n            <p>found via <a href=\"https://lapcatsoftware.com/articles/2024/12/1.html\">Jeff Johnson</a></p>\n          </article>","date_published":"2024-12-24T00:00:00+00:00","date_modified":"2026-03-07T00:00:00+00:00","tags":[],"author":{"name":"Jan Seeger"}},{"id":"https://jan.alphadev.net/blog/2024/link-rot","url":"https://jan.alphadev.net/blog/2024/link-rot/","title":"Link Rot","content_html":"<article class=\"post-content\">\n            <p>Wouter from Brain Baking <a href=\"https://brainbaking.com/post/2024/12/how-bad-is-link-rot-at-brain-baking/\">inspired me to check the liveness of the links I link to</a> from this site.</p>\n            <p>I too based my calculations on <code class=\"language-plaintext highlighter-rouge\">_post</code> instead of <code class=\"language-plaintext highlighter-rouge\">_site</code>, which makes for simpler link parsing and cleanup. Plus this excludes the links to this site here, since they are being generated on each publish and thus are guaranteed to be up-to-date.</p>\n            <p>Technically they <em>can</em> break, but all pages are always rebuilt on publish, and the build log would show those as warning. Except for legacy redirect aliases, but those were already covered by the <a href=\"https://search.google.com/search-console/index/drilldown\">Google <del>Webmaster</del> Search Console Tools</a>.</p>\n            <h1 id=\"show-me-the-details\">Show me the Details</h1>\n            <div class=\"language-sh highlighter-rouge\">\n              <div class=\"highlight\">\n                <pre class=\"highlight\"><code>_posts % <span class=\"nb\">grep</span> <span class=\"nt\">-h</span> <span class=\"nt\">-re</span> <span class=\"s2\">\"http[s?]</span><span class=\"se\">\\:</span><span class=\"s2\">\"</span> <span class=\"nb\">.</span> <span class=\"o\">&gt;</span> ~/links.txt\n</code></pre>\n              </div>\n            </div>\n            <p>That gives me 289 raw results from 116 posts (minus this one).</p>\n            <p>After removing the cruft before and after the links using <code class=\"language-plaintext highlighter-rouge\">.*(http.*)[\\)&gt;].*</code> with <code class=\"language-plaintext highlighter-rouge\">$1</code>, there were a few placeholder links left, like in <a href=\"https://jan.alphadev.net/blog/2015/dual-stack-ddns-updates/\">here</a>, <a href=\"https://jan.alphadev.net/blog/2023/subscribing-to-video-feeds/\">here</a> or <a href=\"https://jan.alphadev.net/blog/2011/facebook-rss/\">here</a>.</p>\n            <p>First without the follow-redirects option to capture the Redirects status codes.</p>\n            <div class=\"language-sh highlighter-rouge\">\n              <div class=\"highlight\">\n                <pre class=\"highlight\"><code><span class=\"k\">for </span>url <span class=\"k\">in</span> <span class=\"si\">$(</span><span class=\"nb\">cat </span>links.txt<span class=\"si\">)</span>\n<span class=\"k\">do\n    </span>curl <span class=\"nt\">-I</span> <span class=\"nt\">-o</span> /dev/null <span class=\"nt\">-w</span> <span class=\"s2\">\"%{url}: %{http_code}\"</span> <span class=\"s2\">\"</span><span class=\"nv\">$url</span><span class=\"s2\">\"</span>\n    <span class=\"nb\">echo</span> <span class=\"s2\">\"</span><span class=\"se\">\\n</span><span class=\"s2\">\"</span>\n<span class=\"k\">done</span> <span class=\"o\">&gt;</span> curl.txt\n</code></pre>\n              </div>\n            </div>\n            <p>While executing this, two domains weren’t even able to resolve/connect: <code class=\"language-plaintext highlighter-rouge\">www.saltstack.com</code> which they forgot to redirect after the VMWare acquisition and <code class=\"language-plaintext highlighter-rouge\">nitter.net</code> for obvious reasons.</p>\n            <p>And a second time with the redirects followed to see which links actually show “something” when clicked:</p>\n            <div class=\"language-sh highlighter-rouge\">\n              <div class=\"highlight\">\n                <pre class=\"highlight\"><code><span class=\"k\">for </span>url <span class=\"k\">in</span> <span class=\"si\">$(</span><span class=\"nb\">cat </span>links.txt<span class=\"si\">)</span>\n<span class=\"k\">do\n   </span>curl <span class=\"nt\">-IL</span> <span class=\"nt\">-o</span> /dev/null <span class=\"nt\">-w</span> <span class=\"s2\">\"%{url} -&gt; %{url_effective}: %{http_code}\"</span> <span class=\"s2\">\"</span><span class=\"nv\">$url</span><span class=\"s2\">\"</span>\n   <span class=\"nb\">echo</span> <span class=\"s2\">\"</span><span class=\"se\">\\n</span><span class=\"s2\">\"</span>\n<span class=\"k\">done</span> <span class=\"o\">&gt;</span> curl.txt\n</code></pre>\n              </div>\n            </div>\n            <h1 id=\"results\">Results</h1>\n            <p>Of the 289 links 276 remained after deduplication, 274 of which I got a response. Plus 405 responses for 7 requests that disallow HEAD requests, but which worked after switching those to GET:</p>\n            <p><img src=\"https://jan.alphadev.net/assets/2024/http-status-codes.svg\" alt=\"Bar Graph showing the distribution between the different HTTP status codes: 2 unreachable, 161 working, 57 permanent redirects, 19 found elsewhere, 1 see other, 2 temporary redirects, 9 forbidden, 19 not found and 4 internal server errors \" /></p>\n            <p>With redirects enabled this makes a total of 230 working links out of 274, resulting in 16.06% link rot.</p>\n            <p>I notice a lot of broken GitHub and Google Play Store links in there, even if <a href=\"https://www.manton.org/2024/12/21/i-support-the.html\">Manton Reese’s theory</a> holds true, only those that are not explicitly unpublished remain there:</p>\n            <blockquote>\n              <p>… of all the new web companies, there are only two that will last 100 years, still hosting our stuff at URLs that don’t change: GitHub and Automattic</p>\n            </blockquote>\n            <p>But still far from the 38% to 66.5% mark.</p>\n          </article>","date_published":"2024-12-23T00:00:00+00:00","date_modified":"2026-03-07T00:00:00+00:00","tags":[],"author":{"name":"Jan Seeger"}},{"id":"https://jan.alphadev.net/blog/2024/throwback","url":"https://jan.alphadev.net/blog/2024/throwback/","title":"Throwback Thursday","content_html":"<article class=\"post-content\">\n            <center>\n              <figure>\n                <img src=\"https://jan.alphadev.net/assets/2024/IMG_1054.jpeg\">\n                <figcaption>Tools of darker times that have lost their utility since.</figcaption>\n              </figure>\n            </center>\n          </article>","date_published":"2024-12-19T17:25:00+00:00","date_modified":"2026-03-07T00:00:00+00:00","tags":[],"author":{"name":"Jan Seeger"}},{"id":"https://jan.alphadev.net/blog/2024/fun-with-drives","url":"https://jan.alphadev.net/blog/2024/fun-with-drives/","title":"Fun with Drives","content_html":"<article class=\"post-content\">\n            <p>I have been setting up a new NAS<sup id=\"fnref:1\"><a href=\"#fn:1\" class=\"footnote\" rel=\"footnote\" role=\"doc-noteref\">1</a></sup> at home, and unlike the old one this new one does have two NVME slots for cache or fast storage. And since I tend to end up fully speccing out my systems, I wanted to add two SSDs and 32GBs of RAM from the get-go.</p>\n            <p>There were two options, either buy the Synology original parts, or go with compatible 3rd-party ones and forgo the <em>genuineness checks</em>. Naturally I went with the janky way and added two 16GB Crucial sticks and two 2TB WD Red NVME drives. As expected the NVME drives were present but weren’t <em>recognised as compatible</em>, which <a href=\"https://github.com/007revad/Synology_M2_volume\">this handy script</a> from GitHub changed. It created the bare Storage Pool from which Volumes could then be managed in the Storage Manager App as usual. Everything was fine and worked.</p>\n            <p>The other day I woke up to a message from my NAS in my inbox, telling me that the Storage Pool was degraded:</p>\n            <blockquote>\n              <p>Storage Pool 2 on $hostname has degraded (total number of |drives: 2; number of active drives: 1).</p>\n              <p>Several reasons may result in storage pool degradation. Please go to Storage Manager &gt; Storage to understand the cause of degradation, or refer to this article to learn how to repair a degraded storage pool.</p>\n              <p>From Synology - $hostname</p>\n            </blockquote>\n            <h1 id=\"muting-the-alarm\">Muting the alarm</h1>\n            <p><strong>Did I mention this thing beeps like crazy?!</strong> You can temporarily  disable the alarm under <code class=\"language-plaintext highlighter-rouge\">Control Panel &gt; Hardware &amp; Power &gt; Beep Control</code>. Thankfully this stops the beeping for the current incident only and keeps all further alarms enabled.</p>\n            <p>I then proceeded to shutdown the entire system, remove and visually inspecting the drives. Looked good, so back in they went and after booting up again the beeping continues.</p>\n            <p>The Storage Manager tells me that Storage Pool 2 was degraded because there was no redundancy, but didn’t offer to re-add the second drive again (due to the janky grafted-on parts). Okay there’s no way to fix it in the WebUI, to the terminal then. I dissected the M2_Volume script to ascertain how it functions, and it seems to be a fancy semi-automatic wrapper around Synology’s <code class=\"language-plaintext highlighter-rouge\">synostgpool</code>. Unfortunately I couldn’t get it to modify an existing Storage Pool, it merely supports creating a new one, which means the existing data gets wiped.</p>\n            <p>After some back and forth I then decided the rebuild the Storage Pool. Stopped the Container Manager and Plex Server that were still running off of the degraded Pool (thankfully Config/Database only, the media files are located on spinning rust). And then proceeded to re-created the Storage Pool using the Script again. It finished without any indication of an error and a new Storage Pool show up in the Storage Manager. But with one drive (I had selected both and the correct ones, re-checked the terminal with the inputs again to make sure).</p>\n            <p>By accident I stumbled over <a href=\"https://github.com/007revad/Synology_HDD_db\">this</a>, which is by the same person, which promises to overwrite the Compatibility Database to enable the Storage Manager to use the drives as if they were supported.</p>\n            <p>Executed the script, went to Storage Manager and manually added the second NVME drive to the 1-drive Pool and off we go.\n              I should have done the HDD script from the beginning, it modifies the NAS and those modifications have to be applied after every OS update. But that is manageable (perhaps even with a startup-script?) and allows me to conveniently use the GUI, while the M.2 Volume script initially creates the drive and then you’re on your own.</p>\n            <p>I’m writing this as the Storage Pool is rebuilding, and have lost a few hours worth of time. I did wonder if buying official Synology NVME would have prevented the issue. But they don’t make the drives either, they buy something off the shelf as well and slap their own sticker on. Plus WD Red are explicitly made for NAS use.</p>\n            <p>Oh, well. I will report back if it happens again or if I find out what is the cause of this.</p>\n            <div class=\"footnotes\" role=\"doc-endnotes\">\n              <ol>\n                <li id=\"fn:1\">\n                  <p>Synology DS923+ <a href=\"#fnref:1\" class=\"reversefootnote\" role=\"doc-backlink\">&#8617;</a></p>\n                </li>\n              </ol>\n            </div>\n          </article>","date_published":"2024-10-30T00:00:00+00:00","date_modified":"2026-03-07T00:00:00+00:00","tags":["synology"],"author":{"name":"Jan Seeger"}},{"id":"https://jan.alphadev.net/blog/2024/trip-report-black-forest","url":"https://jan.alphadev.net/blog/2024/trip-report-black-forest/","title":"Trip Report: Black Forest","content_html":"<article class=\"post-content\">\n            <p>The last item on the agenda before shuttering my motorcycle for the winter was to do a tour through the Black Forest. And the long weekend with the <a href=\"https://de.wikipedia.org/wiki/Tag_der_Deutschen_Einheit\">public holiday</a> came in handy.</p>\n            <p>As assurance I kept to bigger cities where there’s plenty of chargers of varying providers. The first few stops were spaced comfortably apart, so that there wouldn’t be any need for charging on the road. While the way back home, I tried to stretch the legs far apart to get a feel for long-distance reach.</p>\n            <h1 id=\"karlsruhe\">Karlsruhe</h1>\n            <p>Rainy, 10-14 degrees Celcius. Started the trip with 100% charge, reached Karlsruhe with a little below 50%. That is when the run-around started.</p>\n            <h2 id=\"zkm-parking\"><a href=\"https://en.chargemap.com/zkm-tiefgarage-1.html\">ZKM Parking</a></h2>\n            <p>Parking Garage where you pay 1,30€ per hour, charging is free. Number plate scanner that at the barrier also works for motorcycles. The one charger they had was occupied. Had to pay 1€ to check that the charger wasn’t available.</p>\n            <h2 id=\"chargeone---amalienstraße\"><a href=\"https://en.chargemap.com/claus-heinemann-elektroanlagen-gmbh-chargeone-karlsruhe-33-amalienstrasse.html\">ChargeOne - Amalienstraße</a></h2>\n            <p>Had 17 of 20 chargers unoccupied, but the barrier wouldn’t open because they had switched from paper tickets on entry to a number plate scanner that only works for front-mounted plates. Because of the public holiday no personell was present to manually open the barrier. Oh well.</p>\n            <h2 id=\"chargeone---kreuzstraße\"><a href=\"https://en.chargemap.com/claus-heinemann-elektroanlagen-gmbh-chargeone-karlsruhe-13-a-kreuzstrasse.html\">ChargeOne - Kreuzstraße</a></h2>\n            <p>Haven’t seen the barrier, leads down below ground and the tunnel entrance had a sign posted that said: no entry for motorcycles. I didn’t want to find out if it would have opened for me, if that meant having to push the heavy bike back up the hill in reverse if it didn’t. On to the next one.</p>\n            <h2 id=\"enbw---hans-thoma-straße\"><a href=\"https://en.chargemap.com/hans-thoma-strae-5-karlsruhe.html\">EnBW - Hans Thoma Straße</a></h2>\n            <p>Depending on which App you use there is either, one, two or no charging station here, but I had to check for myself because one of the apps had to be correct. It does exist and has two charging ports, one of which is working and was already occupied.</p>\n            <p>The second it seems was disabled via configuration because there wasn’t enough space to park another car next to it.</p>\n            <p>Down to 44% battery.</p>\n            <h2 id=\"stadtwerke-rastatt---lammstraße\"><a href=\"https://en.chargemap.com/stadtwerke-rastatt-karlsruhe-13-17-lammstrasse.html\">Stadtwerke Rastatt - Lammstraße</a></h2>\n            <p>Did not find anything there. The coordinates pointed to a pedestrian zone. Couldn’t see any chargers or signage, but  unlikely for 20 chargers to be located roadside in a pedestrian zone anyways.</p>\n            <h2 id=\"enbw---yorckstraße\"><a href=\"https://en.chargemap.com/yorckstrae-19-karlsruhe.html\">EnBW - Yorckstraße</a></h2>\n            <p>This one was initially occupied, but since it had taken me over an hour to drive from charging station to charging station, it was free again. Plugged in with less than 40%.</p>\n            <p>I don’t want to know how tedious this must have been ten years ago. Trying the available charging poles one by one, while on low battery.</p>\n            <h1 id=\"offenburg\">Offenburg</h1>\n            <p>After a nice breakfast (Menemen) I rode south along the Rhine river towards Offenburg. The day before I had filled the bike to 100% even though I knew it wouldn’t be needed.</p>\n            <p>The ride went smoothly, dry roads, no rain and a cool 12-14 degrees Celsius throughout. I arrived with a bit more than 60% charge. And decided to top for 20 minutes to 80% for the next day, which would be light on the consumption as well.</p>\n            <h2 id=\"comfortcharge---okenstraße\"><a href=\"https://en.chargemap.com/comfortcharge-gmbh-offenburg-25-okenstrasse.html\">ComfortCharge - Okenstraße</a></h2>\n            <p>Didn’t know that Deutsche Telekom also provides charging stations. But everybody seems to have them now, and it worked.</p>\n            <p>I used the Mobility+ App to remotely unlock the charger. There probably would have been a cheaper option, but I wanted to test it out and also didn’t have the need to fill it up completely.</p>\n            <h1 id=\"freiburg\">Freiburg</h1>\n            <p>I started the day the right way with a Butterbrezel, Coissant and a pot of Coffee, and then continued the journey with just over 70% charge and reached Freiburg with approximately 45% left.</p>\n            <h2 id=\"has-to-be---hansjakobstraße\"><a href=\"https://en.chargemap.com/has-to-be-freiburg-im-breisgau-112b-hansjakobstrasse.html\">Has To Be - Hansjakobstraße</a></h2>\n            <p>The charging socket is initially locked until you unlock it using a 67€ deposit payable via either Credit Card or PayPal. I set the bike to fully charge because the way back up will be a long stretch.</p>\n            <h1 id=\"trip-conclusion\">Trip conclusion</h1>\n            <p>Reach anxiety isn’t warranted at all. Not with the fast charger, nor would it be without. The bike makes 200km without a sweat, a quick recharge and another 150km is more than what is needed for a day trip.</p>\n            <p>When I initially test drove the bike I was weirded out by the fact that the Zero has a cruise control built in. I couldn’t imagine who would need that. Combined with the fact that I had to figure out how to operate it while driving. Let’s say I wasn’t convinced. But now after having used the cruise control extensively I can say I have warmed up to it. It is annoying when approaching tighter corners, but really nice when driving through a town.</p>\n            <h2 id=\"by-the-numbers\">By the numbers</h2>\n            <p>500 KMs in 4 days, gained lots of knowledge, spent 17,37€ for charging (including the ZKM parking fee)</p>\n          </article>","date_published":"2024-10-20T00:00:00+00:00","date_modified":"2026-03-07T00:00:00+00:00","tags":["motorcycle","zero s 2024","travels"],"author":{"name":"Jan Seeger"}}],"description":"Der alltägliche Wahnsinn","author":{"name":"Jan Seeger"}}