Local AI Coding Assistant in Neovim in 2026 v3
How I extended the Pi agent framework with custom extensions for local models, git [worktrees](https://git-scm.com/docs/git-worktree), and Neovim integration.
Blog posts by Dan Saattrup Smart
How I extended the Pi agent framework with custom extensions for local models, git [worktrees](https://git-scm.com/docs/git-worktree), and Neovim integration.
A follow-up to my previous post on setting up a local AI coding assistant in Neovim in 2026. Still no internet required!
Setting up a local AI coding assistant in Neovim in 2026. No internet connection required!
After getting lost of confused countless of times during my own home buying process, I decided to write this blog post to help others navigate the process. What steps do you need to take, and in what order? What costs are normal, and what do they mean?
Whenever OpenAI (or any other AI company to be fair) releases a new GPT model, we all tend to assume that the new model is always better than the predecessor - even if that model is also cheaper than the previous models. Even if we assume that this is the case for English, where does this leave the rest of our languages? In this blog post, I'll be digging into this question, using the multilingual…
In this post, we create a voice bot from existing tools out there. This involves detecting audio, transcribing audio, processing the transcription to generate an answer, and converting that answer back into speech. All code is open source, allowing you to easily modify it to your own needs.
How do you add a simple stand-alone dark mode component in Vue.js? I dug into this topic and came up with a solution which requires neither global state management nor clogging up your CSS files with variable declarations. Intrigued? Read on!
As ChatGPT has gained enormous popularity, open source versions of such generative language models finetuned on chatbot datasets have started to emerge. But these open source options have exploded recently, so this post will give you an overview of the open source chatbot models that have been released so far.
This post covers the making of a personal website with Vue.js, including all the lessons I've personally learnt along the way from creating this very website. Everything is open sourced, so you can freely copy the code and tweak it to create your own website!
I present my paper "Monitoring Model Deterioration with Explainable Uncertainty Estimation via Non-parametric Bootstrap", joint with Carlos Mougan. We develop a new and simple uncertainty estimation method, achieving better coverage than the current state-of-the-art methods, a new way to predict when ML models' performance deteriorates, as well as an way to explain the source of deterioration.
This post introduces the makefile and gives several examples of how to use makefiles for Python projects. This includes automatic installation of all project dependencies, setting up git configuration, performing unit tests, creating and viewing documentation for the project, bumping the version of the project as well as publishing the project to PyPI.
When using the int dtype in Python then its behaviour changes depending on the operating system, resulting in mysterious negative integers. We explore this phenomenon and how these behaviours can be avoided.
This is an introduction to graph convolutional neural networks, also called GCNs. These are approximations of spectral graph convolutions, which are defined using the graph Fourier transform, an analogue of the regular Fourier transform to the graph domain. Aside from going over the theoretical justification for GCNs, I also include some sample code in both PyTorch Geometric and Deep Graph Library…
I introduce doubt, a Python library which helps machine learning models produce prediction intervals, giving uncertainty bounds to their point-estimate predictions. It provides a wrapper function for all scikit-learn models, which uses non-parametrised bootstrap estimates to form the intervals, as well as implementations of linear quantile regression models and quantile regression forests.
DeepWalk was the first algorithm for producing node representations in arbitrary graphs. It was heavily inspired by the SkipGram algorithm used in NLP and developed the year earlier. We introduce the DeepWalk algorithm and provide an implementation in the Julia programming language.
We describe the PageRank algorithm, which was initially used to rank search results in the Google search engine. This algorithm can be used on any graph and yields a PageRank score for every node in the graph, signifying how "central" a given node is. A local variant, Personalised PageRank, exists as well, where we look at how connected a node is to a specified set of interesting nodes.
Quantile regression forests (QRFs) is a way to make a random forest output quantiles and thereby quantify its own uncertainty. Furthermore, this method only requires training the forest once. We compare the QRFs to bootstrap methods on the hourly bike rental data set.
This is an introduction to quantile regression models, which are models that natively outputs prediction intervals directly. We discuss the pros and cons of the methods, and provide implementations for both linear quantile regression and quantile neural networks in PyTorch.
We present a novel method to produce prediction intervals for nearly any machine learning model, using bootstrapping. This is based on prediction intervals introduced in Kumar and Srivastava (2012), and takes into account both sample noise, model variance noise and model bias. We provide several simulations where we compare it to the parametric prediction intervals computed via normal theory.
We introduce the concept of parametric prediction intervals using normal theory, and how they are different to confidence intervals. As examples we consider the classical linear regression model with additive noise and show that the intervals work as intended in that case. We also explore what happens as soon as we start to overfit.
We introduce confidence intervals for sample statistics, both using normal theory with t-distributions and also using modern bootstrap methods, and includes a dummy example of Danish coffee consumption. This is the first post in a series about quantifying uncertainty in machine learning models.
This post presents my project Scholarly, which can predict the arXiv category of a scientific paper using only the title and abstract. The neural network is based on the SHA-RNN architecture and is trained on all of arXiv, scraped through their API and stored in a SQLite database which is also freely available.
This post covers a personal project of mine, developing a model that can split English words into syllables with a neural network, which is useful for both hyphenation as well as computing syllable counts. The machine learning model is trained on the Gutenberg Moby Hyphenator corpus, consisting of 170k English words.
Mean squared error and cross entropy are the most commonly used loss functions in machine learning. We show that the reason why this is the case is because they are both instances of maximum likelihood estimation.
This posts presents my Python package NaturalSelection, being a package that implements a genetic optimization algorithm, which can be used to evolve neural network architectures. We give a few examples within computer vision.
A pictorial description of what the singular value decomposition is actually doing, in terms of rotations, flips and scalings, with parallels to the eigenvalue decomposition. This decomposition is the key part of principal component analysis.
A description of the normal, or Gaussian, distribution, and the key theorems surrounding it, the law of large numbers and the central limit theorem. As a consequence we see why standardising your data, such as with scikit-learn's StandardScaler, makes it approximate a normal distribution.
A description of the geometric and exponential distributions, and proving that they are the unique memoryless distributions.
A description of the uniform distribution, and why this distribution can be shown to be the universal distribution.
This first post presents the Poisson distribution, which counts the number of successes in a particular time interval, and has an associated result called the Law of Small Numbers.
Previously I covered the core model induction up to showing that all sets of reals in L(R) are determined. In terms of large cardinal theories, this is equiconsistent with the theory ZFC and the existence of infinitely many Woodin cardinals. I'll here talk about how to push this even further, getting close to reaching the current state of the art.
I've previously mentioned an interesting characterisation of Woodin cardinals, that they are more or less characterised by the fact that we can do genericity iterations with them, i.e., that we can "capture reals" when Woodin cardinals are present. This is an exercise in the core model induction book, and Stefan Mesken recently found a way to solve this (see his solution here), which I'll be…
Abstraction is so common in mathematics that we usually don't bat an eye when jumping between different levels of abstraction. There are many cases in which such an abstraction makes concepts clearer, as it cuts away all unneccesary bits of information, and also many cases in which something more concrete makes things easier to work with, as we have more information about how our objects of study…
Absoluteness of wellfoundedness and Shoenfield absoluteness are two absoluteness results in set theory that are both used incredibly often. But what if we want to apply the result to absoluteness between arbitrary models M and N, rather than absoluteness between V and L? It turns out that our models have to satisfy dependent choice in both absoluteness results, and in Shoenfield absoluteness we…
Some of the first properties we learn about forcing notions are the notions of being atomless and being separative. Usually any kind of analysis of these terms are left out, as "all forcings we care about are atomless and separative", so this post will be dedicated to taking a slightly closer look at these properties.
One of the first forcing facts that we learn is that kappa-closed forcings preserve all sequences of length kappa. I will recall these facts here, and show how they relate to the "kappa-version" of both the axiom of choice and the axiom of dependent choices.
The previous two posts was dedicated to stating, explaining and applying a certain result in core model theory, the PD dichotomy, without using any inner model theory at all. This post is then the final post in this short series in which we'll actually prove the dichotomy. This blog series, and especially the following proof, grew out of some work with Stefan Mesken.
This is a continuation of my last post, in which I argue that core model theory can provide tools which other set theorists can use without having indepth knowledge of their proofs. The tool I chose was the following core model dichotomy, and in this post we'll dig into a couple of examples in which we apply the dichotomy to various areas of set theory.
Inner model theory and core model theory might seem like their own niche in set theory, where you have to invest hundreds of hours just to get a glimpse of what's going on. But behind all the complicated theory there are theorems in inner model theory which can be applied in many contexts with minimal background knowledge of the intricate technicalities appearing in their proofs. In this and the…
There are many different properties that forcings can have, whose consequences are usually well-known. As an example, intuitively, closure properties of forcings yield preservation of cardinals below, and antichain properties yield preservation of cardinals above. But these properties seem mostly to be studied individually, so Stamatis Dimopoulos and I set out to find these folklore results about…
When doing set theory we tend to take pride in the fact that it's something unique, something that is doing things in a very different way from the rest of mathematics. Take things like transitive sets, forcing extensions, elementary embeddings as well as syntactic considerations in results like Shoenfield absoluteness. But there are times when we might be better off by borrowing terminology, and…
When doing set theory (or mathematics in general) we're working inside some universe, usually denoted by V. Since we can't work with everything there is (in a first-order way), we resort to working with initial segments of V. The confusion then arises, since what do we mean by an initial segment? Some prefer to work with the "rank-hierarchy" and others prefer to work with the "hereditary…
The notion of distributivity comes from the Latin word distribut-, meaning "divided up", and has since evolved into how mathematics deals with things that are divided up. This starts back in school when we learn that a(b + c) = ab + ac. This property can be generalised in the language of Boolean algebras, still maintaining the intent of dealing with divided stuff, leading to the axiom of choice…
When dealing with games in general, we can vary different parameters. We could vary (1) how big the payoff set is, (2) which objects we're playing and (3) for how many rounds we're playing. When we restrict ourselves to definable games then we can't have determinacy of games on integers of length omega_1+omega. Restricting ourselves to definable games of countable length on the integers, what…
Looking at a map of the large cardinal hierarchy for the first time can be a dizzying experience. What are the differences between them, and which ones are similar? Some of them are defined using partition properties and some of them are defined using elementary embeddings, and others have a whole myriad of equivalent characterisations! What's the intuition about the different sections of the…
There's a very neat way of encoding any set as a set of ordinals, which has the somewhat peculiar feature of it being hard (which here meaning that it requires the axiom of choice) to encode sets, but easy to decode them. Like some kind of a very ineffective crypto-system.
Mentioning the core model induction to a fellow set theorist is akin to mentioning that you're a mathematician to the layman --- you receive a reaction which is struck by a delightful mix of terror and awe. My humble goal with this blog post is not to offer a "fix-all" solution to this problem, but rather to give a vague (but correct) explanation of what's actually¬†going on in a core model…
The incompleteness theorems appear mysterious to many people, from sheer confusion of the statements themselves, to wrongfully applying the theorems to scenarios way out proportion, such as (dis)proving the existence of god. It doesn't help that when actually learning about the theorems in a logic course, most details are usually admitted. What I'll try to do in this post is still not to give a…
It's quite standard nowadays to characterise the measurable cardinals as the cardinals kappa such that there exists a normal kappa-complete non-principal measure on kappa. As we continue climbing the large cardinal hierarchy we get to the strong cardinals, Woodin cardinals and superstrong cardinals, all of which are characterised by extenders, which can be viewed as particular sequences of normal…
Last time we delved into the world of ideals and their associated properties, precipitousness and saturation. We noted that these properties could be viewed as a measure of "how close" a cardinal is to being measurable, and furthermore that all the properties are equiconsistent; i.e. that the existence of a precipitous ideal on some $\kappa$ is equiconsistent with the existence of a measurable…