Hi! I’m a biotechnology student at Aalborg University, after more than a decade as a startup co-founder and software developer.

pdit: The Python Un-Notebook for Coding Agents

I have been a fan of computational notebooks for a long time. At my previous company, Peter Engelbrecht introduced me to R, and we ended up doing most of our BI work in R Notebooks. It felt like a breath of fresh air after point-and-click dashboards. Who knew you could just write code and churn out nice reports? Then notebooks disappeared from my life for a while, until I went back to school to study biotechnology. Suddenly I was again analyzing data and generating plots. This time on bacterial growth instead of customer churn, but the tools were mostly the same. Something did change, though: coding agents.

With coding agents in the loop, the way I interact with code changes. I spend more time reading code and less time writing it. I recently released pdit, a Python "un-notebook," my attempt at building something notebook-like but designed for this workflow. pdit does two things differently: it does away with notebook cells, and it works with plain Python.

[... 516 words]

Automated PCR Primer Design

Last month I ran my very first PCR, attempting (and eventually failing) to amplify a region flanking a specific SNP. This meant designing a set of PCR primers, a process that turned out to include a surprising amount of gene-sequence copy-and-paste and waiting for NCBI's servers to run my job. Being a compulsive tool builder, I had to streamline this process, and see if it could all be done locally on my own computer.

[... 1005 words]

iNaturalist to Ankivalenz

I spent an hour tonight vibe coding a tiny CLI which exports iNaturalist observations to Ankivalenz-formatted Markdown, so I can easily turn my backyard observations into Anki cards.

To use it, install it via pip and run it, specifying your username:

$ pip install inaturalist-to-ankivalenz
$ inaturalist-to-ankivalenz --username vangberg

This generates an iNaturalist.md file which, if you run Ankivalenz on it, will create an Anki card for each observation, with the photo on the front and the species name on the back:

Happy exploring!

Image Occlusion with Ankivalenz

Image occlusion is a useful technique to create spaced repetition cards from an image. Cards are created by hiding different parts of the image and using the name of the hidden part as the answer, and a single image can easily result in 10s of cards. Image occlusion seems to be especially popular with medicine students who have to remember the names of endless bones (206, to be precise), but it is a technique that is useful beyond that.

I use my tool Ankivalenz to generate Anki cards from structured Markdown notes, and even though I did not know about image occlusion when I first built Ankivalenz, its syntax does a wonderful job of enabling image occlusion. Here is how to do it.

[... 209 words]

Musikalia

TL;DR Today I released Musikalia, an iOS music player for kids. Here is a short demo:

Get it on the App Store (it requires an Apple Music subscription), or read on for the back-story.

[... 724 words]

Foreign Dispatch

When you learn a new language, different skills must be practiced: reading, listening, speaking, writing. Writing is the one I find most difficult, involving a lot of friction and context switching. Foreign Dispatch is a new project, where I will build tools to make foreign language writing easier.

[... 449 words]

Ankivalenz: Turn Notes Into Anki Cards

[... 816 words]

Note Workflows in Skrift

A few years ago I was introduced to the Zettelkasten note-taking method through the book "How to Take Smart Notes" by Sönke Ahrens.[^1] The very short version, as neatly summarized by Sascha Fast:[^2]

A Zettelkasten is a personal tool for thinking and writing. It has hypertextual features to make a web of thought possible. The difference to other systems is that you create a web of thoughts instead of notes of arbitrary size and form, and emphasize connection, not a collection.

Before reading Ahrens' book, I thought of myself as a compulsive note-taker, but all I had to show for it was a couple of half-empty paper notebooks and a dozen stale notes in a folder somewhere on Dropbox. It was mostly a write-and-forget kind of situation.

Armed with my newly found knowledge of how to take smart notes, I did what every technically inclined person would do, and started looking for apps that could help me write these smart notes. In my mind I was already imagining a holographic interface of some kind, but I was thoroughly disappointed. Then I did what every technically inclined person who can write code would do, and made my own note app, Skrift.

[... 699 words]

Feature Adoption Report with Segment, BigQuery and R

In product development our focus should be on providing value to the customer, and not just blindly piling on features to the product. A simple, if not always accurate, way of measuring whether a given feature provides value to the customer is to look at the adoption -- that is, what percentage of your users are using the feature.

In this post I will show you what my feature adoption report looks like, and how you can implement a subset of it with R, Segment and Google BigQuery.

[... 1219 words]