2025 in Code

I’m mostly doing this for myself, a way to look back and see the year for what it was. Negatives tend to stand out in our memories: pain, anger, a slight we didn’t appreciate, a loss we did not anticipate… all this quickly coalesces into a gloom and doom spiral, a “search and you will find” approach to seeing things as dark as possible.

2025 in Code.

The first months were all about learning and using Dart and Flutter. We wrote Camino Now, got out first 20,000 users, and celebrated on the Camino Francés in a Hot Tub.

To fully make Camino Now work, I also had to learn more about Django to write the backend. That one was a bit of a drag, but worked out, and by May we had a working version that served those 20,000 users with ease.

Around October, I started using Ruby more, including Rails, and was often blown away by how much easier things got, when redid them in Ruby. I still love Python and can’t think of any language more suitable for my needs, but rewriting all of Camino Now’s backend in Ruby took a week, which was astounding.

The next version of Camino Now will be web based, not bound to an app, and might be written in Ruby and Rails.

Other Projects

Hule (this website) is written in Python. It features a Microblog-Macroblog backend, federation into the ⁂ Fediverse, Photo-First approach, Wiki pages, and Fediverse threads being displayed intelligently. Hule works rather well, serves me well, and seems to make me want to write more and more coherently. The Wiki will slowly become a collection of “Days in Medical History” over this year.

Train Track has nothing to do with Trains and will be my personal training tracker for 2025. The goal is to reach a very healthy 75 kilos by the end of this year, run a half marathon, and get fit enough to do even higher ascents and mountains. I’ll show you guys what I wrote in a few days.

Conclusion

I got more fluent in Python, learned Dart and Flutter, and rediscovered Ruby for web based projects and quick CLI scripting. All in all, a good year in that regard, and one that sets the foundation for 2026.

Train Track "Frontend" 2

New Year’s resolutions are hard. Mine were to learn a bit more about Streamlit, to get deeper into using local AI as a data correlation mechanism, and to get fitter/healthier.

So that’s where Train Track comes in. It’s a small Python app I am writing using FastCGI and Streamlit to analyze my Apple Health data, exported and sent to Train Track daily via Health Auto Export. HAE is pretty cool, it takes everything my phone knows about my health and habits and can send it via MQTT, to Home Assistant, or (most important to me) a REST endpoint.

Second image is a local LLM analyzing the data and giving some basic recommendations and correlations. That one needs a LOT more work.

Note: I am not stupid enough to blast my health data into the Fediverse, that’s example content :)

Seeking one or two good marmots!

Hule is about ready to be deployed more widely. Our Alpha testers report happy results, but we’re running the installs (sans this one) in very sandboxed environments. Now that’s your chance to get in on Ground Zero: want to run a public Hule install? Let me know (here or @mikka) and I’ll send you the tarball.

You should either have a Linux server (or the $5 to rent one), some experience with the command line (not much needed), an hour or so to install (with ~20 mins talking to me about the basics), a willingness to find German Only and English Only parts that still need translation, no fear of local LLM (or Claude API, or that part gets tested by someone else if you DO have a fear :)), and a domain (or subdomain).

You get: the probably most marmot-y Fediverse presence in your neighborhood.

Hule: Threads

Twitter hatte ein paar Dinge, die irgendwann einmal in der Community entstanden sind, von der UI/UX nicht wirklich vorgesehen waren, und lange nur in den Clients und in Third Party apps wirklich Sinn machten. Zum Beispiel die @user Notation, Hashtags, und natürlich Threads.

Threads waren die Community-Antwort auf Twitter’s absolut wissenschafts- und diskussionsfeindlichen 280 Zeichen. Mit unter 1000 Zeichen kann keine freundliche Unterhaltung stattfinden, das System förderte Slogans und Proklamation über Daten und menschlichen Umgang miteinander auf Augenhöhe. Dieses eine Ding, die kurzen Statuse, waren (IMHO, aber nicht nur my humble opinion) der Grund für die Verrohung und den Rand-Drift der Plattform.

Sehr lange gab es nur die Nutzung von Drittdiensten wie Tweetlonger oder RiverTweet um das Ganze lesbar zu machen.

Mastodon, die am meisten genutzte Server-Software im Fediverse, hat einige dieser Probleme geerbt: die kurzen Statuse, und die nicht optimale Darstellung von Threads.

Im Fediverse helfen andere Reader-Frontends wie Phanpy oder Elk da extrem, auch einige Smartphone Apps machen das Lesen im Thread einfacher.

Hule 2.0 Bugfix Release 121325:

  • Fixed a bug where we didn’t send Update notifications if subscribable Actors (the user or a category) changed profile information.
  • Fixed a bug where we (reverse UNO card) also didn’t interpret external Update notifications for changed profiles.
  • Added better threading for “very deep” conversations (4+ levels) that fixed a n+1 issue, because I am a shitty coder.
  • Took out CW for one round, since the UI was giving us issues on mobile. Old CW posts remain CW.

Hule 2.0

Die Notes-Frontpage 3

Darf ich Dir das neue Hule vorstellen?

Hule ist ein Blog, Fediverse Actor, und Wiki für all die, denen ihr Content wichtig ist. Es beschränkt sich auf das Wesentliche, Minimalistische, ohne dabei wie der feuchte Fiebertraum eines 1960er osteuropäischen Soviet-Plattenbau-Architekten auszusehen (looking at you, Mastodon).

Als Demo in Action: https://mikka.is

Hule ist schlank und recht schnell. Es kann in ~10 Minuten aufgesetzt werden, nutzt SQLite (mehr braucht es für ein persönliches Blog nicht), Python, und Django. Der Installer hilft Dir auch, Caddy (einen Webserver) zu konfigurieren, wenn Du noch keinen hast.

Installiert werden kann das auf einem 5€/Monat Hetzner Server oder selbst einem RaspberryPi 5.

Was kann Hule?

Zuerst, klar, kann es am Fediverse teilnehmen. Du kannst einen Status absetzen, andere Nutzer:innen können Dir folgen, Kommentieren, Liken, Boosten. Alles unter 1000 Zeichen wird so einfach in das Fediverse abgesetzt.

Wenn Dir mal nach Längerem zumute ist, dann kannst Du auch einen Artikel schreiben. Das Fediverse kann mit Artikeln supergut umgehen, Mastodon leider nicht, also bauen wir aus dem Artikel einen Status mit einem Link auf Dein Blog.

Du kannst Bilder anhängen. Wenn Du magst, kannst Du die GPS-Daten des Bildes erhalten, dann wird das Bild auch auf einer Karte angezeigt. Und wenn Du richtig magst, dann kannst Du das Bild auch an eine KI schicken, entweder lokal oder im Netz, und Deine Bilder nach Farbe, Subjekt, und mehr sortieren lassen. Ich empfehle eine lokale KI mit Ollama oder LMStudio, aber das überlasse ich Dir.

Es gibt auch ein Wiki, dass Du entweder mit einem “normalen” Text-Editor oder mit einem App wie Obsidian bearbeiten kannst. Damit sind alle drei “Formen” der Teilnahme im Netz abgedeckt. Du kannst meine (opinionated) Rationale hier (auf einer Hule Wiki Seite) lesen: https://mikka.is/w/warum-wiki/

Hule mag Alt-Texte sehr gerne, und versucht auch sonst ein guter Netizen zu sein. Es kann natürlich mehrere Sprachen (auf meiner Seite ist Deutsch und Englisch eingestellt).

In der nächsten Version unterstützt es auch die neue “Quote” Funktion Mastodons, weil diese von der normalen Implementation eines Fediverse Quote etwas abweicht.

Wie bekomme ich Hule?

Hule ist zur Zeit in einer geschlossenen Beta. Wir nehmen aktiv am Fediverse teil, und da ist es wichtig, keinen Scheiß zu bauen. Also wird alles doppelt und dreifach auf Bugs und “good netizenry” getestet. Wenn Du mitmachen willst, dann schick mir eine DM auf @mikka.

Wer zahlt für das?

Hule wird Open Source sein und “free” wie in Beer und Speech.

Hule 2.0 ist ein extrem vereinfachtes System. Die anderen Funktionen wie Map, Gallerie, etc. werden nach und nach wieder als Plugins implementiert, statt Teil des Grundgerüsts zu sein.

Gibt mir auch eine Chance, das Ganze theme-able zu machen. Ach, und wir sind bei ~80 Subscribern, ein paar Dutzend mehr wären geil für Stresstesting (ich gehe mal davon aus, dass eine persönliche Fediverse-Seite/Blog keine 100k Subscriber handeln muss, und wenn, dann ist das einfach implementiert).

Amiga vs AGI

Way back when, I was a member of a small Amiga Cracking/Demo group, that over time focused more and more on Demo and less and less on Cracking. Demo was, where it was at, we’d travel to Sweden and Italy and many other places, spending nights sleeping in train stations and city parks having spent all our money on the train ticket and McDonalds… it was a glorious time.

Then came the DCKs, the Demo Construction Kits. And the Amos Basic Compiler Templates. Both allowed everyone to build basic Demos. Scrollers, bouncers, music, even interactive elements. So we upped our game, added impossible sprite movements, kicked Copper and Blitter into places they weren’t supposed to go, tickled more music out of the system than it was meant to play.

DCK often caught up to us a few months later. My proudest moment, not going to lie, was when a German Amiga Magazine advertised a Disc containing a DCK to make “Demos just like Lowkey.” Another Demo Team, DOC (whom I hated with the passion of a thousand seething suns for having insanely racist “jokes” in their demos) even published their own DCK. I wonder what became of Michael H., and if he’s still a racist…

Long story short… that’s how Vibe Coders feel. It’s not that different from typing in five pages of hex numbers with control number/checksum every 16 numbers (anyone except me remembering those from C=64 and Amiga Magazines?) or running a DCK: the output might look like last year’s hype beast, but the creator doesn’t understand thing one about the code. And, frankly, understanding the machine, learning its nooks and crannies, that was what it was all about for me. Some Demos made it big, some fizzled, but very few of those moments stand out. What does stand out, are the nights, smoking rolled Gauloise Black in my room in the basement, hunched over an Amiga 500 connected to a shitty monitor, trying to edge out one more raster to close a loop or pouring over disassembler printouts to understand, how a game enforced its copy protection. And those Demos, the “Zero Day” ones, were the successful ones. If everyone can replicate last year’s peak code, those who create this year’s will be the winners.

I could have spent my youth making DCK demos and probably get laid more and earlier. I could have made money selling cracked games or creating demos for others. But that didn’t feel satisfying enough. I wanted to own what I did. And, sooner or later, when everyone vibe codes, that’ll be it again. In 5 years, all those slop apps with purple gradients and emojis, telltale signs of Claude or Codex, will be forgotten. Hand made code will survive. Because it will be at the apex of development, not two years behind. And, more importantly, it’ll fill its makers with pride.

Photo Details View Changes in 1.1α

Old layout: smaller image, sidebar. 2

For 1.1α I am experimenting with a wider image display. Moving the tags below the text and the navigational elements (back, forth, map, etc.) to the right, should improve the UX here somewhat. This has been A/B tested by some α users, and generally found more acclaim than rejection.

I’ve also added the masonry setting for the main timeline (for desktop sizes, mobile automatically uses reverse chronological one column) in 1.1.

Finally: Podcasts are in, with Apple and Spotify support, only Atom/RSS needs some polishing.

Spec: Blood
B: +5.1K | P: +851 | Motes: 3 | R: 3/0 | WQ: 0
Legion Remix Session
Legion Remix Daily Tracker
Date: 2025-10-17
Today's Play Time: 2m
Today's Gains:
Bronze: +5.1K (Total: 157.8K)
Infinite Power: +851 (Total: 194.2K)
Items:
Motes of a Broken Time: 3 (Today: +2)
Kills:
Rares: 3
Rare Elites: 0
Activities:
World Quests: 0
Left-click: Reset today's data
Shift-click: Open currencies panel

I know, I am probably the only person admitting to playing WoW, but if you’re secretly also playing the game and use TitanPanel, I’d have something for you: LegionRemixer, a simple tracker for your Remix currencies and progress. Just in case you are, you know… And if you are, let’s Mythic.

Bullhorn Updates

Ok, well, the last test seems to have worked, and with that #Bullhorn is a fully fledged ⁂ Fediverse instance. This means, there’ a new kid on the block, a small but hopefully somewhat useful single-user-self-hosted instance for hikers, travelers, photographers, and anyone else looking for something a bit more photo-forward to host themselves.

In a nutshell, Bullhorn is a Django/Python (curse you, @simon for making me like it back in the “Simon eats Quail” days) microblog with fediverse (ActivityPub) features, that scratches my itch of needing a decent solution to upload my #DigiLux2 and #iPhone17Pro images and document my traveling.

After cancelling my Flickr account (had it since 2004, my first photo was the oldest still on their servers for a long, long, time, until someone backdated their Getty collection, but it was uploaded during the Etech Beta Demo), I needed something to fill the void. Bullhorn was meant to be a local-only replacement. Then it got galleries and AI and text posts, and after I was in for that penny, I figured why not go in for the pound and make it speak ActivityPub.

I’ll probably do a livestream this weekend about it. We’ll see :)

Bullhorn Weekend Update

Die Oberfläche eines Posts auf Bullhorn. Herausgestellt werden die oben beschriebenen Features mit roten Kästen.

Diese Woche habe ich Wetter, Tags, und Leaderboard in #Bullhorn fertiggestellt.

Wetter (v0.8)

Zeigt Wetterdaten zu Bildern - Wetter bezieht seine Daten entweder vom neuen FediWetter (wenn eine Station nahe ist, was i. A. noch recht selten ist, weil ich den Quellcode bislang nicht produktionsreif habe) oder OpenMeteo’s OpenWeather API. OpenMeteo hat eine “Einschränkung” von 10000 Aufrufen am Tag, wer so viele Bilder am Tag hochläd, der kann auch zahlen.

Leaderboard (v0.7)

Zeigt Top-Tags, Wetter, Posts, und Cameras - mehr eine Spielerei, aber eine schöne. Sowohl von Bildern als auch vom Leaderboard kann man jetzt alle Bilder finden, die im Regen aufgenommen oder mit einer Lumix geschossen wurden, oder Steine zeigen. Die neuen Vision Tags sind da auch vetreten.

Vision Tags (v0.9)

Ein lokales LLM oder eine AIaaS (AI as a Service) kann Deine Bilder analysieren (Achtung: Bild wird zur KI übertragen) und Tags erstellen. Diese können dann zur Klassifikation und Suche genutzt werden.