tools
Intro # Yes, dear readers (or reader if you look at my umami analytics, a singular which might very well be me): I let Gemini loose on my ~/src directory. Ok, that’s a clickbait headline. It wasn’t quite like that.
Here’s what really happened. I have a bunch of CLI scripts, mostly written in Go, that suffer from neglect and are in need of repairs and the usual “upgrade to latest and greatest”. I really don’t have time and patience for the silliness of doing that, so I thought that it is a good opportunity to try AI coding and a perfect way to let a LLM (in my case Gemini) show off its coding skills. I mentioned in my previous update that I’m using Antigravity, so there are no obstacles preventing me from actually executing on this idea.
Recipes
Intro # My cooking recipe collection has been with the Paprika Recipe Manager for quite some time. I’m a card-carrying member of the digital hoarder club, so the recipe collection has grown tremendously. The honest truth though is that I only cook a tiny subset of this collection on a regular basis and only seldom venture beyond that comfort zone. I’m definitely not a good cook.
Tooling update
Intro # A year has passed and I haven’t posted anything to this blog. How time flies. I realized that my tooling has changed quite a bit (at work and at home). I’m not allowed to describe the work tooling but I can definitely describe the new tooling I use at home. This post is just that. It will cover all use cases: Go, C++, Haskell, Python, math typesetting and blogging. As it turns out, I’m using the same (new) tooling for all use cases.
C++ setup
Intro # Some programming environments don’t need a blog post like this one. In such environments everything is standardized and works out of the box. There is a working package manager that everybody agrees on. There is only one tool chain, it is straightforward and comes built in with the language installation. Go is like that. The combination of Go and the Goland IDE functions neatly without any fuss, tweaking, querying stackoverflow for obscure error messages etc.
Tutoring setup
Occasionally I have to help some of my younger relatives that are still in school or college understand some of the material they learn. I can cover programming, math and physics. Since we’re geographically dispersed, the tutoring has to happen virtually. For a programming session this is easy. We have a shared editor and a video session going. I usually use Repl.it. For help on a paper we use Google Docs or Overleaf.
LaTeX setup
Intro # As I mentioned in the Intro of the Haskell setup post, tooling changes often and becomes outdated quickly. So why write this post at all? Honestly, it is mostly for me, like much of this blog I don’t think I have (m)any readers 🙂. . My math notes are infrequent enough (my last one was six months ago) that I run the risk of forgetting the details of this Rube Goldberg machine of a workflow and then I won’t be able to maintain or fix it.
Haskell setup revisited
I said in Haskell setup that posts like these don’t age well. And sure enough, here I am with a revision. After dipping my toes in the Haskell testing waters I wanted a project scaffolding that is different from what cabal init generates:
I wanted a proper testing setup that allows me to also test module internals. I also wanted to solve having saved snippets of bindings loaded into the repl so I don’t have to repeatedly type the same expressions. After a bunch of trials and errors I settled on the project structure as seen in magicsquare. It breaks out internals into a separate module so it can be tested. It defines an Examples module that imports the other two modules and defines snippets useful in the repl. I invoke the repl like so:
Haskell setup
Intro # Posts like this one don’t age well. Tooling changes all the time. And the other thing is: I do Haskell just for fun, ie silly little exercises with only pure functions. So take this setup with a grain of salt. And if you stumbled on this from the future, there’s probably better options for you.
With these disclaimers out of the way, let’s see the setup.
Keyoxide
Introduction # People are familiar by now with the Mastodon account verification system: if you want to prove that you own both a particular Mastodon account and a particular website By owning I mean you hold the login credentials. , you add a link with the rel="me" attribute to your website pointing back to your Mastodon profile and in the Mastodon profile you add a link to your website page that contains that rel="me" anchor. The Mastodon instance will fetch that page, find the rel="me" anchor and reward you with a green checkmark next to your website link in your Mastodon profile. This is very simple and straightforward but it does imply a certain level of trust in the Mastodon instance doing the verification.
Mastosync
Introduction # One of the cool things about Mastodon, Notion and RSS is great API availability and nice Go libraries covering these APIs:
Jomei Notion Mattn Mastodon MMCDole RSS Feeds Pretty early after migrating to Mastodon, I started thinking about a little project that would use these APIs: a tool that automatically toots links to new blog posts appearing in an RSS feed. Obviously as with most things something like this already exists: mastofeed. But I wanted to put my own spin on it and play with the APIs. One afternoon of hacking later and I had mastosync.
Nova and Hugo
When the Nova 11 announcement appeared in one of my feeds, it was clear I wouldn’t be able to resist. I love, love, love truly polished native Mac apps and Nova completely nails it in that category. I played with previous versions of Nova before but I never had a real use case for it. I’m not a web developer and adapting it to the programming environments I use is somewhat challenging so I always slide back to specialized IDEs for those (Goland for Go, CLion for C++, Visual Studio Code for Haskell and TeXShop for LaTeX). But now I have this blog and this is all Markdown, CSS, Html, Javascript, in other words a great use case for Nova.






