<?xml version="1.0" encoding="utf-8"?><rss version="2.0">
  <channel>
    <title>Peter's DevLog</title>
    <link>https://peterme.net/</link>
    <description>I'm a computer scientist from Norway with interests in tinkering, open source, and game development.

This log is intended as a way to both share my projects and keep myself from forgetting them.</description>
    <language>en-uk</language>
    <pubDate>Tue, 07 Apr 2026 06:31:03 GMT</pubDate>
    <generator>Couch CMS</generator>

        <item>
        <title>Building an epaper laptop: Dithering</title>
        <link>https://peterme.net/building-an-epaper-laptop-dithering.html</link>
        <description>
                            &lt;p&gt;Epaper screens come in many variants. The classic one that most people think about is only black and white. However most newer panels are at least capable of greyscale, and the best in class are colour. But the colour and greyscale isn&amp;rsquo;t &amp;ldquo;true&amp;rdquo; colour and greyscale, but rather they have&amp;hellip;&lt;/p&gt;                    </description>

        <pubDate>Sat, 17 Jan 2026 20:34:46 GMT</pubDate>
    </item>
        <item>
        <title>Writing tests for Nim libraries with Nimble and unittest</title>
        <link>https://peterme.net/writing-tests-for-nim-libraries-with-nimble-and-unittest.html</link>
        <description>
                            &lt;p&gt;Most developers will agree that having automatic tests is a good thing. With good tests we can make changes to our code and test whether these changes causes old bugs to resurface, new bugs to appear, or current workflows to be broken.&lt;/p&gt;

&lt;p&gt;In this tutorial we will have a look at&amp;hellip;&lt;/p&gt;                    </description>

        <pubDate>Fri, 11 Jul 2025 13:24:05 GMT</pubDate>
    </item>
        <item>
        <title>Building an epaper laptop: The monitor</title>
        <link>https://peterme.net/building-an-epaper-laptop-the-monitor.html</link>
        <description>
                            &lt;p&gt;&lt;img src=&quot;https://uploads.peterme.net/panel.jpg&quot; /&gt; The most distinct part of making an epaper laptop is obviously the screen. And picking a screen for this project was always going to be one of the most critical decisions. The biggest available panel I could find with a somewhat reasonable price was a 10.3&amp;rdquo; Waveshare&amp;hellip;&lt;/p&gt;                    </description>

        <pubDate>Tue, 01 Jul 2025 19:05:12 GMT</pubDate>
    </item>
        <item>
        <title>Building an epaper laptop</title>
        <link>https://peterme.net/building-an-epaper-laptop.html</link>
        <description>
                            &lt;p&gt;Ever since I got my first ereader twelve years ago I&amp;rsquo;ve wanted an epaper laptop. The allure of a laptop which would work in direct sunlight and has incredible battery life has always drawn me. Sure, laptops have come a long way in the past twelve years, especially the battery&amp;hellip;&lt;/p&gt;                    </description>

        <pubDate>Thu, 13 Mar 2025 20:19:46 GMT</pubDate>
    </item>
        <item>
        <title>Labelled exceptions for smoother error handling</title>
        <link>https://peterme.net/labelled-exceptions-for-smoother-error-handling.html</link>
        <description>
                            &lt;p&gt;Error handling, a contentious and oft-discussed topic. Each language has some way of dealing with errors, be it error codes, result types, exceptions, something entirely different, or a mix. How to properly deal with things going wrong in our programs has been important pretty much ever since we started writing&amp;hellip;&lt;/p&gt;                    </description>

        <pubDate>Wed, 01 Nov 2023 11:34:30 GMT</pubDate>
    </item>
        <item>
        <title>Teaching old C code new tricks with Nim</title>
        <link>https://peterme.net/teaching-old-c-code-new-tricks-with-nim.html</link>
        <description>
                            &lt;p&gt;Recently I was met with an interesting problem when wrapping a C library in Nim. The library in question was &lt;a href=&quot;https://github.com/LuaDist/mapm&quot;&gt;MAPM&lt;/a&gt;, an older but quite complete library for dealing with arbitrary precision maths. Unfortunately the library doesn&amp;rsquo;t have much in the way of error handling. If something goes wrong&amp;hellip;&lt;/p&gt;                    </description>

        <pubDate>Fri, 08 Sep 2023 13:49:28 GMT</pubDate>
    </item>
        <item>
        <title>Setting up a Nim server for dummies</title>
        <link>https://peterme.net/setting-up-a-nim-server-for-dummies.html</link>
        <description>
                            &lt;p&gt;Nim is a great candidate for server development, but if you want to run your own server and are new to the world of server management or Linux there can be a daunting amount of information to consume in order to do it right. In this article I&amp;rsquo;ll give a&amp;hellip;&lt;/p&gt;                    </description>

        <pubDate>Thu, 08 Jun 2023 08:54:26 GMT</pubDate>
    </item>
        <item>
        <title>Wrapping C libraries in Nim</title>
        <link>https://peterme.net/wrapping-c-libraries-in-nim.html</link>
        <description>
                            &lt;p&gt;As we discovered in my last article, Nim will by default generate C code and then call on a C compiler to actually produce a binary. This might seem like an odd choice, especially in the age of LLVM. However it&amp;rsquo;s actually not uncommon for languages to compile or transpile&amp;hellip;&lt;/p&gt;                    </description>

        <pubDate>Sun, 16 Apr 2023 20:22:49 GMT</pubDate>
    </item>
        <item>
        <title>Dynamic libraries in Nim</title>
        <link>https://peterme.net/dynamic-libraries-in-nim.html</link>
        <description>
                            &lt;p&gt;This is a question which has been asked in various places over the years, and recently on the forum in multiple separate threads. Seeing how I&amp;rsquo;ve built commercial software with Nim dynamic libraries, I thought I&amp;rsquo;d chime in with my knowledge. But since there are multiple threads out there and&amp;hellip;&lt;/p&gt;                    </description>

        <pubDate>Sun, 19 Feb 2023 22:12:54 GMT</pubDate>
    </item>
        <item>
        <title>Is Nim a transpiler?</title>
        <link>https://peterme.net/is-nim-a-transpiler.html</link>
        <description>
                            &lt;p&gt;This is a question that has come up time and time again in the IRC channel, when talking to people in person, and in the comment section pretty much every time Nim has an article on Hackernews or one of the bigger programming subreddits. It&amp;rsquo;s also a question that has&amp;hellip;&lt;/p&gt;                    </description>

        <pubDate>Tue, 19 Oct 2021 12:16:34 GMT</pubDate>
    </item>
        <item>
        <title>Asynchronous programming in Nim</title>
        <link>https://peterme.net/asynchronous-programming-in-nim.html</link>
        <description>
                            &lt;p&gt;In the &lt;a href=&quot;https://peterme.net/multitasking-in-nim.html&quot;&gt;previous article&lt;/a&gt; we got a small primer on various kinds of multi-tasking, in this article we&amp;#39;ll have a look at possibly the simplest form of this. Namely asynchronous execution. As discussed in the last article asynchronous execution is a way for our programs to tell the hardware&amp;hellip;&lt;/p&gt;                    </description>

        <pubDate>Fri, 03 Sep 2021 07:53:49 GMT</pubDate>
    </item>
        <item>
        <title>Multitasking in Nim</title>
        <link>https://peterme.net/multitasking-in-nim.html</link>
        <description>
                            &lt;p&gt;This is a series of articles about a topic in the Nim ecosystem that has so far been written fairly little about. Namely threading, asynchronous operation, and communication.&lt;/p&gt;

&lt;p&gt;To begin we first need to have a good grasp of the concepts we&amp;#39;re going to discuss. There is quite a bit of&amp;hellip;&lt;/p&gt;                    </description>

        <pubDate>Fri, 03 Sep 2021 07:47:09 GMT</pubDate>
    </item>
        <item>
        <title>Fixing a broken Firefox session</title>
        <link>https://peterme.net/fixing-a-broken-firefox-session.html</link>
        <description>
                            &lt;p&gt;In order to stifle my tab-hoarding habits I have recently set my Firefox install to not recover sessions when I restart the browser. This means that every time I turn my computer off for the day it will delete all the random documenation pages and weird links people have sent&amp;hellip;&lt;/p&gt;                    </description>

        <pubDate>Tue, 27 Apr 2021 09:08:02 GMT</pubDate>
    </item>
        <item>
        <title>Video content - Advent of Code 2020</title>
        <link>https://peterme.net/video-content-advent-of-code-2020.html</link>
        <description>
                            &lt;p&gt;For &lt;a href=&quot;https://conf.nim-lang.org/&quot;&gt;NimConf2020&lt;/a&gt;, our first virtual Nim conference, I realised how poor my microphone setup was. I have previously toyed with the idea of recording videos for various projects, or just presentations in the same style as the one I did for NimConf. For the conference I borrowed a better&amp;hellip;&lt;/p&gt;                    </description>

        <pubDate>Tue, 15 Dec 2020 08:45:35 GMT</pubDate>
    </item>
        <item>
        <title>Creating condensed shared libraries (Embedding NimScript pt. 3)</title>
        <link>https://peterme.net/creating-condensed-shared-libraries-embedding-nimscript-pt-3.html</link>
        <description>
                            &lt;p&gt;In the first part of this article series we looked at why we would potentially want to be able to run NimScript embedded into our Nim programs. In part two we dove a bit deeper and looked at how we could do this embedding, and how we could pass data&amp;hellip;&lt;/p&gt;                    </description>

        <pubDate>Mon, 22 Jun 2020 20:38:58 GMT</pubDate>
    </item>
        <item>
        <title>How to embed NimScript into a Nim program (Embedding NimScript pt. 2)</title>
        <link>https://peterme.net/how-to-embed-nimscript-into-a-nim-program-embedding-nimscript-pt-2.html</link>
        <description>
                            &lt;p&gt;In the first part of this three part article series we looked at why we would want to embed NimScript into our Nim applications. Particularly why we would want to use it for configuration. Whether or not that is your goal, this article will explain &lt;em&gt;how&lt;/em&gt; this can be achieved.&amp;hellip;&lt;/p&gt;                    </description>

        <pubDate>Sun, 31 May 2020 18:19:38 GMT</pubDate>
    </item>
        <item>
        <title>Using NimScript as a configuration language (Embedding NimScript pt. 1)</title>
        <link>https://peterme.net/using-nimscript-as-a-configuration-language-embedding-nimscript-pt-1.html</link>
        <description>
                            &lt;p&gt;[youtube BdQkU_HepIg]&lt;/p&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;Over the past couple of years I&amp;rsquo;ve been playing around with creating my own WM. I recently picked up the project again, and I quickly realised that it was time to re-do the configuration system. Up until this point I had been using a TOML file for the configuration.&amp;hellip;&lt;/p&gt;                    </description>

        <pubDate>Sun, 31 May 2020 18:19:23 GMT</pubDate>
    </item>
        <item>
        <title>Nim Q&amp;A (originally a HN reply)</title>
        <link>https://peterme.net/nim-qa-originally-a-hn-reply.html</link>
        <description>
                            &lt;p&gt;Recently I got made aware that a &lt;a href=&quot;https://news.ycombinator.com/item?id=21057751&quot;&gt;comment I made on HackerNews&lt;/a&gt; had been linked to in a &lt;a href=&quot;https://www.zdnet.com/article/python-inspired-nim-version-1-0-of-the-programming-language-launches/&quot;&gt;ZDNet article&lt;/a&gt;, this made me realise I should probably feature in here as well. So in a similar fashion to my older post that was a Reddit reply, here is&amp;hellip;&lt;/p&gt;                    </description>

        <pubDate>Mon, 20 Apr 2020 20:03:10 GMT</pubDate>
    </item>
        <item>
        <title>Tips and tricks with implicit return in Nim</title>
        <link>https://peterme.net/tips-and-tricks-with-implicit-return-in-nim.html</link>
        <description>
                            &lt;p&gt;One feature in Nim that it shares with several other languages, especially functional ones, is implicit return of values. This is one of those small features that might just seem like a way to avoid writing &lt;code&gt;return&lt;/code&gt; everywhere. But in fact it can be used for much more than that!&amp;hellip;&lt;/p&gt;                    </description>

        <pubDate>Fri, 01 Nov 2019 15:07:52 GMT</pubDate>
    </item>
        <item>
        <title>Welcome to a brief explanation of history</title>
        <link>https://peterme.net/welcome-to-a-brief-explanation-of-history.html</link>
        <description>
                            &lt;p&gt;History, as you might know, is of course the GNU History Library. It is a utility that allows us to read, repeat, and track the commands we run in our shells. Apparently a lot of people feel really strongly about history, so I&amp;rsquo;ve added some quotes in this article to&amp;hellip;&lt;/p&gt;                    </description>

        <pubDate>Tue, 17 Sep 2019 08:28:11 GMT</pubDate>
    </item>
        <item>
        <title>Metaprogramming and read- and maintainability in Nim</title>
        <link>https://peterme.net/metaprogramming-and-read-and-maintainability-in-nim.html</link>
        <description>
                            &lt;p&gt;One thing I&amp;#39;ve mentioned about metaprogramming in Nim, both in posts on this site and in talks, is that metaprogramming in Nim can enhance read- and maintainability. Opponents of metaprogramming would probably sneer at that and remark that it&amp;#39;s quite the opposite. And sure, metaprogramming is a powerful tool, and&amp;hellip;&lt;/p&gt;                    </description>

        <pubDate>Tue, 04 Jun 2019 16:06:51 GMT</pubDate>
    </item>
        <item>
        <title>Meta-programming in Nim - FOSDEM talk companion post</title>
        <link>https://peterme.net/meta-programming-in-nim-fosdem-talk-companion-post.html</link>
        <description>
                            &lt;p&gt;This article is intended as a companion to the lightning talk I held at FOSDEM 2019. If you haven&amp;#39;t seen the talk yet the official recording from &lt;a href=&quot;https://fosdem.org/2019/schedule/event/nim_metaprogramming/&quot;&gt;the FOSDEM site&lt;/a&gt;&amp;nbsp;is embeded below (if you want you can also grab the slides for this presentation on that site).&lt;/p&gt;

&lt;div&gt;[video webmsrc=&amp;quot;https://video.fosdem.org/2019/H.2215/nim_metaprogramming.webm&amp;quot; mp4src=&amp;quot;https://video.fosdem.org/2019/H.2215/nim_metaprogramming.mp4&amp;quot;]&amp;hellip;&lt;/div&gt;                    </description>

        <pubDate>Tue, 05 Feb 2019 14:48:18 GMT</pubDate>
    </item>
        <item>
        <title>Optional value handling in Nim</title>
        <link>https://peterme.net/optional-value-handling-in-nim.html</link>
        <description>
                            &lt;p&gt;I recently had a look at a functional language named &lt;a href=&quot;http://www.toccata.io/&quot;&gt;Toccata&lt;/a&gt;&amp;nbsp;which amongst other things &lt;a href=&quot;http://www.toccata.io/2017/10/No-Booleans.html&quot;&gt;does away with booleans&lt;/a&gt;. While this migth seem utterly insane it&amp;#39;s not an entirely new concept and&amp;nbsp;proponents of such ideas will warn you of the perils of&amp;nbsp;&lt;a href=&quot;https://shreevatsa.wordpress.com/2015/01/31/boolean-blindness/&quot;&gt;boolean blindness&lt;/a&gt;. This&amp;nbsp;refers to the fact that&amp;hellip;&lt;/p&gt;                    </description>

        <pubDate>Mon, 06 Aug 2018 16:44:46 GMT</pubDate>
    </item>
        <item>
        <title>Handling files in Nim</title>
        <link>https://peterme.net/handling-files-in-nim.html</link>
        <description>
                            &lt;p&gt;In a post over on Reddit someone noted that Nim doesn&amp;#39;t really have any article or tutorial about file reading. Trying to prove them wrong led me to a half-answer over on&amp;nbsp;&lt;a href=&quot;https://rosettacode.org/wiki/File_input/output#Nim&quot;&gt;Rosetta Code&lt;/a&gt;&amp;nbsp;and a &lt;a href=&quot;https://forum.nim-lang.org/t/570&quot;&gt;forum post from 2014&lt;/a&gt;&amp;nbsp;asking about examples on file handling. Since this is a rather&amp;hellip;&lt;/p&gt;                    </description>

        <pubDate>Thu, 03 May 2018 20:24:25 GMT</pubDate>
    </item>
        <item>
        <title>Nim at FOSDEM - Frequently asked questions</title>
        <link>https://peterme.net/nim-at-fosdem-frequently-asked-questions.html</link>
        <description>
                            &lt;p&gt;Nim recently had a stand at &lt;a href=&quot;https://fosdem.org/2018/&quot;&gt;FOSDEM 2018&lt;/a&gt;. It was lot&amp;#39;s of fun meeting up with all the people whom I&amp;#39;ve only gotten to know by their IRC nicknames. And very interesting to help out at the stand telling people about Nim. In this post I want to write&amp;hellip;&lt;/p&gt;                    </description>

        <pubDate>Thu, 22 Feb 2018 21:38:29 GMT</pubDate>
    </item>
        <item>
        <title>Nim types (originally a Reddit reply)</title>
        <link>https://peterme.net/nim-types-originally-a-reddit-reply.html</link>
        <description>
                            &lt;p&gt;While perusing the Nim subreddit I stumbled across a &lt;a href=&quot;https://www.reddit.com/r/nim/comments/7dm3le/tutorial_for_types_having_a_hard_time/&quot;&gt;post&lt;/a&gt; asking for an explanation of how types work in Nim, especially how Nim allocates different types on the heap and the stack. Since the answer grew pretty long I decided to post it here as well for perpetuity. What&amp;hellip;&lt;/p&gt;                    </description>

        <pubDate>Tue, 09 Jan 2018 10:48:38 GMT</pubDate>
    </item>
        <item>
        <title>Server migration and downtime</title>
        <link>https://peterme.net/server-migration-and-downtime.html</link>
        <description>
                            &lt;p&gt;This site has been down for a couple of days now. In fact the entire server has been down, which probably pained me more than it did you. Reason for this is that I have various services running on this server, most importantly perhaps my private git server. I&amp;#39;ve written&amp;hellip;&lt;/p&gt;                    </description>

        <pubDate>Sat, 21 Oct 2017 17:38:58 GMT</pubDate>
    </item>
        <item>
        <title>Cross-platform GUIs and Nim macros</title>
        <link>https://peterme.net/cross-platform-guis-and-nim-macros.html</link>
        <description>
                            &lt;p&gt;A while ago I read &lt;a href=&quot;http://blog.johnnovak.net/2016/05/29/cross-platform-gui-trainwreck-2016-edition/&quot;&gt;John Novaks great rant&lt;/a&gt;&amp;nbsp;on how hard and annoying it can be to do something as simple as extending a cross-platform application with the simplest of GUIs. Or as he puts it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You must not under any circumstance try to open a window (on the computer,&amp;hellip;&lt;/p&gt;&lt;/blockquote&gt;                    </description>

        <pubDate>Wed, 22 Mar 2017 20:23:52 GMT</pubDate>
    </item>
        <item>
        <title>Presentation on Functional programming</title>
        <link>https://peterme.net/presentation-on-functional-programming.html</link>
        <description>
                            &lt;p&gt;Recently I held a presentation on functional programming at the University of Troms&amp;oslash;. The presentation was meant as an introduction to the concepts of the paradigm and some of the ideas behind it. It also contains a short section on how the data structures that facilitate the immutable state collections&amp;hellip;&lt;/p&gt;                    </description>

        <pubDate>Sat, 18 Mar 2017 01:49:18 GMT</pubDate>
    </item>
        <item>
        <title>Adding touch controls to the i3 Window Manager</title>
        <link>https://peterme.net/adding-touch-controls-to-the-i3-window-manager.html</link>
        <description>
                            &lt;p&gt;A while back I got myself a second hand Surface Pro 1. It&amp;#39;s a great device, and with a little tweaking I got it running Linux just fine. At first I started out with what I was currently using as the operating system on my main machine. Keeping all my&amp;hellip;&lt;/p&gt;                    </description>

        <pubDate>Fri, 30 Sep 2016 00:37:35 GMT</pubDate>
    </item>
        <item>
        <title>Git-hooks and web development</title>
        <link>https://peterme.net/git-hooks-and-web-development.html</link>
        <description>
                            &lt;p&gt;In a previous post I wrote about how this&amp;nbsp;website&amp;nbsp;was created and how the content was managed with&amp;nbsp;CouchCMS. However there is more than just the textual content to this site. In the recent post about my&amp;nbsp;Nim&amp;nbsp;implementation of&amp;nbsp;TinyWM&amp;nbsp;the need for syntax highlighted code became apparent. Other features recently added was the home&amp;hellip;&lt;/p&gt;                    </description>

        <pubDate>Thu, 16 Jun 2016 21:44:28 GMT</pubDate>
    </item>
        <item>
        <title>TinyWM implementation in Nim</title>
        <link>https://peterme.net/tinywm-implementation-in-nim.html</link>
        <description>
                            &lt;p&gt;Lately I&amp;#39;ve been toying with the idea of creating a window manager for Linux. It&amp;#39;s not that there is a lack of them, rather quite the opposite, the Linux world is full of them. But suffice to say that I have some ideas which I think would be a welcome&amp;hellip;&lt;/p&gt;                    </description>

        <pubDate>Mon, 13 Jun 2016 18:19:27 GMT</pubDate>
    </item>
        <item>
        <title>Creating a managed website with CouchCMS</title>
        <link>https://peterme.net/creating-a-managed-website-with-couch.html</link>
        <description>
                            &lt;p&gt;After having decided that I wanted to create this DevLog I had to decide &lt;i&gt;how&amp;nbsp;&lt;/i&gt;I wanted to create it. Initially I was set on creating my own content management system (or CMS for short) since I&amp;#39;ve never been too fond of the ones I&amp;#39;ve used in the past. I feel&amp;hellip;&lt;/p&gt;                    </description>

        <pubDate>Thu, 19 May 2016 21:21:29 GMT</pubDate>
    </item>
        <item>
        <title>Welcome to Peter&#039;s DevLog</title>
        <link>https://peterme.net/welcome-to-peters-devlog-1.html</link>
        <description>
                            &lt;p&gt;Over the years I&amp;#39;ve been involved with various projects, either by myself or through work. During these projects I&amp;#39;ve often looked around for similar projects and borrowed information or procedures from others. During all of this I&amp;#39;ve often ended up piecing together information from multiple sources to get the result&amp;hellip;&lt;/p&gt;                    </description>

        <pubDate>Sat, 19 Sep 2015 16:54:07 GMT</pubDate>
    </item>
     </channel>
</rss>
