Recent events
2025-11-02 17:13 Rickard pushed to blog
commit 8a6fd343f30a8a46adca571e86a89a6e24cd3ce0
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date: Sun Nov 2 17:13:14 2025 +0100
Get rid of si in youtube url
diff --git a/posts/2025/10/27/newsletter-october/post.md b/posts/2025/10/27/newsletter-october/post.md
index b4ea93d..a84c318 100644
--- a/posts/2025/10/27/newsletter-october/post.md
+++ b/posts/2025/10/27/newsletter-october/post.md
@@ -87,7 +87,7 @@ Allocator](https://www.rfleury.com/p/untangling-lifetimes-the-arena-allocator).
He also covers the topic in the video [Enter The Arena: Simplifying Memory
Management (2023)](https://youtu.be/TZ5a3gCCZYo). And in [Everyone is doing
memory management wrong. feat. Ryan Fleury | S2
-E02](https://youtu.be/UeJPyuVxL-o?si=ePSrtw0td6cPOt1h&t=2162) (at around 36:02)
+E02](https://youtu.be/UeJPyuVxL-o?t=2162) (at around 36:02)
Ryan talks about how he learned about arenas from Casey's [Handmade
Hero](https://guide.handmadehero.org/).
2025-11-02 17:01 Rickard pushed to blog
commit 964b135abba8d285721781a7ae3b6881a9ff05d4
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date: Sun Nov 2 17:00:58 2025 +0100
Add tag
diff --git a/posts/2025/10/27/newsletter-october/post.md b/posts/2025/10/27/newsletter-october/post.md
index d263432..b4ea93d 100644
--- a/posts/2025/10/27/newsletter-october/post.md
+++ b/posts/2025/10/27/newsletter-october/post.md
@@ -1,7 +1,7 @@
---
date: 2025-11-02 16:49:00
title: Newsletter October 2025: Computer Enhance!
-tags: newsletter,rlmeta,rlworkbench
+tags: newsletter,rlmeta,rlselect,rlworkbench
---
This month I discovered Casey Muratori. This opened up a whole new world of
2025-11-02 17:00 Rickard pushed to blog
commit b3754b48d882d335cd4319a9cd26b29a8c339318
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date: Sun Nov 2 17:00:25 2025 +0100
Add tags
diff --git a/posts/2025/10/27/newsletter-october/post.md b/posts/2025/10/27/newsletter-october/post.md
index 07b96b4..d263432 100644
--- a/posts/2025/10/27/newsletter-october/post.md
+++ b/posts/2025/10/27/newsletter-october/post.md
@@ -1,7 +1,7 @@
---
date: 2025-11-02 16:49:00
title: Newsletter October 2025: Computer Enhance!
-tags: newsletter
+tags: newsletter,rlmeta,rlworkbench
---
This month I discovered Casey Muratori. This opened up a whole new world of
2025-11-02 16:58 Rickard pushed to blog
commit 90963811c42ac54860b445d85fffb088673ce698
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date: Sun Nov 2 16:58:42 2025 +0100
Newsletter october 2025
diff --git a/posts/2025/10/27/newsletter-october/post.md b/posts/2025/10/27/newsletter-october/post.md
new file mode 100644
index 0000000..07b96b4
--- /dev/null
+++ b/posts/2025/10/27/newsletter-october/post.md
@@ -0,0 +1,233 @@
+---
+date: 2025-11-02 16:49:00
+title: Newsletter October 2025: Computer Enhance!
+tags: newsletter
+---
+
+This month I discovered Casey Muratori. This opened up a whole new world of
+programming to me, and I have been consuming many hours of Youtube videos from
+this new world and also started new programming projects to explore these
+ideas. It feels like I have unlocked the next level of programming. So who is
+Casey? And what have I been doing? Let's see.
+
+Casey cares about performance. He has a bunch of educational resources where he
+talks about how to become aware of performance and how to improve performance.
+A few of the first things I came across from him are the following:
+
+* [Refterm Lecture Part 1 - Philosophies of
+ Optimization](https://www.youtube.com/watch?v=pgoetgxecw8)
+
+* [Software Performance: Avoiding Slow Code, Myths & Sane Approaches – Casey
+ Muratori | The Marco Show](https://www.youtube.com/watch?v=apREl0KmTdQ)
+
+* [Simple Code, High Performance](https://www.youtube.com/watch?v=Ge3aKEmZcqY)
+
+* [The Thirty Million Line
+ Problem](https://www.youtube.com/watch?v=kZRE7HIO3vk)
+
+* [Solving Java’s 1 Billion Row Challenge (Ep. 1) | With
+ @caseymuratori](https://www.youtube.com/watch?v=n-YK3B4_xPA)
+
+After becoming a little more aware of performance, I got an idea for how to
+improve the performance of
+[rlselect](https://rickardlindberg.me/projects/rlselect/). I started
+implementing [rlselect2](https://projects.rickardlindberg.me/rlselect2.html)
+with a focus on new ideas for better performance. Not that rlselect desperately
+needs better performance, but I wanted to learn. So maybe next time I write
+something, I don't default to bad performance.
+
+Casey also has a subscription-based course called
+[Computer, Enhance!](https://www.computerenhance.com/) which I also enrolled
+in. You learn about how computers (CPUs) work and how to get the most out of
+them. Casey explains things very well, so I look forward to working my way
+through his course.
+
+The first homework in the course is to write an instruction decoder for 8086
+instructions. That is, you should parse machine code and disassemble it into
+assembly instructions.
+
+Then I got sidetracked. Sidetracked with
+[rlmeta2](https://projects.rickardlindberg.me/rlmeta2.html), which is a new
+implementation of [rlmeta](https://rickardlindberg.me/projects/rlmeta/). What
+is rlmeta?
+
+> RLMeta is a programming language in which you write grammars. Grammars have
+> rules that specify how to match objects from an input stream and specify what
+> should happen when objects are matched. It can be used to write lexers,
+> parsers, tree transformers, code generators, and similar tools.
+
+Why did I start a second implementation? Maybe because I had new ideas for how
+to get better performance. Maybe because I like the architecture of rlmeta and
+wanted to try and bootstrap it again.
+
+The first step was to implement rlmeta2 i Python. I was able to do that in a
+weekend. Then, because of my new ideas about performance, I wanted to implement
+it in C instead. I spent much time thinking about how to implement some of
+Python's concepts in C for the runtime support that rlmeta2 needs.
+
+Then I watched the Wookash podcast [Casey Muratori on Legendary Handmade
+Hero!](https://youtu.be/AhOZ4E-fyLY) where Casey mentioned [Better Software
+Conference](https://bettersoftwareconference.com/). The conference features
+speakers that seem to share Casey's philosophy about performance and the
+handmade spirit.
+
+I watched the talk [Vjekoslav Krajačić – File Pilot: Inside the Engine – BSC
+2025](https://youtu.be/bUOOaXf9qIM). In it, he talks about arenas. Arenas is
+a memory allocation strategy that can be used in C that feels like garbage
+collection.
+
+That was a clue for me in my work on implementing rlmeta2 in C. Python has
+automatic memory management and garbage collection. So I've never really
+thought about memory. But rlmeta2 needs to allocate memory dynamically. How do
+you do that in C in a good way?
+
+I found a blog post on the subject by Ryan Fleury (also a speaker at BSC):
+[Untangling Lifetimes: The Arena
+Allocator](https://www.rfleury.com/p/untangling-lifetimes-the-arena-allocator).
+He also covers the topic in the video [Enter The Arena: Simplifying Memory
+Management (2023)](https://youtu.be/TZ5a3gCCZYo). And in [Everyone is doing
+memory management wrong. feat. Ryan Fleury | S2
+E02](https://youtu.be/UeJPyuVxL-o?si=ePSrtw0td6cPOt1h&t=2162) (at around 36:02)
+Ryan talks about how he learned about arenas from Casey's [Handmade
+Hero](https://guide.handmadehero.org/).
+
+Another topic that came up in this (to me) new world was data-oriented design
+and writing programs that make effective use of the CPUs caches. One talk about
+that that I watched was [CppCon 2014: Mike Acton "Data-Oriented Design and
+C++"](https://www.youtube.com/watch?v=rX0ItVEVjHc). By making assumptions about
+your data, you can write more efficient programs.
+
+So my head has been spinning with high frequency on these ideas. Learning more
+low level programming. Learning how high level concepts map to low level
+concepts. Sometimes working on a high abstraction level is nice. But sometimes
+all layers of abstractions get in the way. Certainly for performance. But
+sometimes a problem might actually be harder to solve with more abstractions.
+So I am excited to learn more about low level concepts to be able to write
+better software.
+
+At the end of the month I had actually made some real good progress on my new
+projects. I managed to write the instruction decoder for the first homework
+assignment in rlmeta2. Here is what it looks like:
+
+ main = decodeInstruction*:xs !. -> {
+ "bits 16\n"
+ "\n"
+ xs
+ };
+
+ decodeInstruction =
+ | opFromByte:opcode peekRegByte:source rmByte:destination -> {
+ opcode " " destination ", " source "\n"
+ }
+ | opFromWide:opcode peekRegWide:source rmWide:destination -> {
+ opcode " " destination ", " source "\n"
+ }
+ ;
+
+ peekRegByte =
+ | &0b_xx_000_xxx -> { "al" }
+ | &0b_xx_001_xxx -> { "cl" }
+ | &0b_xx_010_xxx -> { "dl" }
+ | &0b_xx_011_xxx -> { "bl" }
+ | &0b_xx_100_xxx -> { "ah" }
+ | &0b_xx_101_xxx -> { "ch" }
+ | &0b_xx_110_xxx -> { "dh" }
+ | &0b_xx_111_xxx -> { "bh" }
+ ;
+
+ peekRegWide =
+ | &0b_xx_000_xxx -> { "ax" }
+ | &0b_xx_001_xxx -> { "cx" }
+ | &0b_xx_010_xxx -> { "dx" }
+ | &0b_xx_011_xxx -> { "bx" }
+ | &0b_xx_100_xxx -> { "sp" }
+ | &0b_xx_101_xxx -> { "bp" }
+ | &0b_xx_110_xxx -> { "si" }
+ | &0b_xx_111_xxx -> { "di" }
+ ;
+
+ rmByte =
+ | 0b_xx_xxx_000 -> { "al" }
+ | 0b_xx_xxx_001 -> { "cl" }
+ | 0b_xx_xxx_010 -> { "dl" }
+ | 0b_xx_xxx_011 -> { "bl" }
+ | 0b_xx_xxx_100 -> { "ah" }
+ | 0b_xx_xxx_101 -> { "ch" }
+ | 0b_xx_xxx_110 -> { "dh" }
+ | 0b_xx_xxx_111 -> { "bh" }
+ ;
+
+ rmWide =
+ | 0b_xx_xxx_000 -> { "ax" }
+ | 0b_xx_xxx_001 -> { "cx" }
+ | 0b_xx_xxx_010 -> { "dx" }
+ | 0b_xx_xxx_011 -> { "bx" }
+ | 0b_xx_xxx_100 -> { "sp" }
+ | 0b_xx_xxx_101 -> { "bp" }
+ | 0b_xx_xxx_110 -> { "si" }
+ | 0b_xx_xxx_111 -> { "di" }
+ ;
+
+ opFromByte = &0b_xxxxxx_0_0 opcode:x -> { x };
+ opFromWide = &0b_xxxxxx_0_1 opcode:x -> { x };
+
+ opcode =
+ | 0b_100010_d_w -> { "mov" }
+ ;
+
+This program gets compiled to a C program by the meta compiler (a version of
+rlmeta2 implemented in C) which can then be compiled using a C compiler:
+
+ $ ./meta <decoder.meta >decoder.c
+ $ gcc -o decoder decoder.c
+
+This program is a decoder for 8086 machine instructions, and when run on the
+machine code example
+
+ $ xxd machine_code_example
+ 00000000: 89d9 88e5 89da 89de 89fb 88c8 88ed 89c3 ................
+ 00000010: 89f3 89fc 89c5 ......
+
+it spits out this:
+
+ $ ./decoder <machine_code_example
+ bits 16
+
+ mov cx, bx
+ mov ch, ah
+ mov dx, bx
+ mov si, bx
+ mov bx, di
+ mov al, cl
+ mov ch, ch
+ mov bx, ax
+ mov bx, si
+ mov sp, di
+ mov bp, ax
+
+## TODO
+
+This is an experiment to make public a `TODO` list with my current programming
+interests. In every newsletter, I will report what I did and what next steps
+I'm most interested in pursuing. So here is the list going into next month.
+
+* Do homework 2 of Computer Enhance using rlmeta2
+* Work on rlworkbench (an experimental [language workbench](https://en.wikipedia.org/wiki/Language_workbench) based on rlmeta2)
+ * Improve meta
+ * Make it compile without warnings
+ * Make it bootstrapable with only a C compiler (any C compiler)
+ * https://dependablec.org/
+ * https://github.com/tsoding/nob.h (idea for a build system)
+ * Ideas
+ * Cache glyphs
+ * Immediate mode UI?
+ * Handmade style
+* New blog
+ * Migrate all my blog posts to my it
+ * Make it available as a downloadable PDF
+
+References:
+
+* rlmeta2: https://projects.rickardlindberg.me/rlmeta2.html
+* rlworkbench: https://projects.rickardlindberg.me/rlworkbench.html
+* new blog: https://blog.rickardlindberg.me/
2025-11-02 10:34 Rickard pushed to blog
commit ed9844f78fea186aed92460d7f947c60328341bb
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date: Sun Nov 2 10:34:34 2025 +0100
Revise
diff --git a/posts/2025/10/19/newsletter-september/post.md b/posts/2025/10/19/newsletter-september/post.md
index 526db37..a5f56b3 100644
--- a/posts/2025/10/19/newsletter-september/post.md
+++ b/posts/2025/10/19/newsletter-september/post.md
@@ -18,11 +18,11 @@ Instead they can target a higher-level platform.
I remember reading about [Heroku](https://en.wikipedia.org/wiki/Heroku) many
years ago. With it, people were able to deploy their Ruby on Rails (and perhaps
-other frameworks) applications without any knowledge of web servers or
-infrastructure. Heroku raised the abstraction and made it possible for more
-people to put things in production. Of course that comes at a cost of less
-flexibility. In some situations that is not worth it. But in other situations
-it makes things so much easier.
+other) applications without any knowledge of web servers or infrastructure.
+Heroku raised the abstraction and made it possible for more people to put
+things in production. Of course that comes at a cost of less flexibility. In
+some situations that is not worth it. But in other situations it makes things
+so much easier.
The Heroku approach seemed to have gone out of style for a while. But now it
seems to be popular again under the name of *Platform Engineering*. I look
commit 71e69fb1a3ecba5c577769633d10c076685b0579
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date: Sun Nov 2 10:31:35 2025 +0100
Newsletter september 2025.
diff --git a/posts/2025/10/19/newsletter-september/post.md b/posts/2025/10/19/newsletter-september/post.md
new file mode 100644
index 0000000..526db37
--- /dev/null
+++ b/posts/2025/10/19/newsletter-september/post.md
@@ -0,0 +1,29 @@
+---
+date: 2025-11-02 10:30:00
+title: Newsletter September 2025: Platform Engineering
+tags: newsletter
+---
+
+This month I discovered the term *Platform Engineering*. In particular, I
+watched [this video
+series](https://www.youtube.com/playlist?list=PLwLLcwQlnXBy0sfJHkZvomeH7EO4QU67h)
+from the *Modern Software Engineering* channel. I also found the article [What
+is platform
+engineering?](https://learn.microsoft.com/en-us/platform-engineering/what-is-platform-engineering)
+from Microsoft to provide a good description.
+
+I like the concept of platform engineering because it allows teams to take full
+responsibility for their software while not having to be operations experts.
+Instead they can target a higher-level platform.
+
+I remember reading about [Heroku](https://en.wikipedia.org/wiki/Heroku) many
+years ago. With it, people were able to deploy their Ruby on Rails (and perhaps
+other frameworks) applications without any knowledge of web servers or
+infrastructure. Heroku raised the abstraction and made it possible for more
+people to put things in production. Of course that comes at a cost of less
+flexibility. In some situations that is not worth it. But in other situations
+it makes things so much easier.
+
+The Heroku approach seemed to have gone out of style for a while. But now it
+seems to be popular again under the name of *Platform Engineering*. I look
+forward to following development in this space.
2025-09-06 13:23 Rickard pushed to blog
commit 95478c832e363d835ab891b3e41132b9d0379ded
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date: Sat Sep 6 12:02:28 2025 +0200
Newsletter August 2025
diff --git a/blog.py b/blog.py
index 8dd47b9..b10f4c0 100755
--- a/blog.py
+++ b/blog.py
@@ -514,6 +514,11 @@ class Post:
def write(self, root, bibs, posts):
output_dir = os.path.join(root, self.html_root())
os.makedirs(output_dir, exist_ok=True)
+ for png in glob.glob(os.path.join(os.path.dirname(self.path), "*.png")):
+ shutil.copy(
+ src=png,
+ dst=os.path.join(output_dir, os.path.basename(png))
+ )
with open(os.path.join(output_dir, self.html_name()), "w") as f:
f.write(self.html_content(bibs, posts))
diff --git a/posts/2025/09/04/newsletter-august/garmin-overview.png b/posts/2025/09/04/newsletter-august/garmin-overview.png
new file mode 100644
index 0000000..2fe7f68
Binary files /dev/null and b/posts/2025/09/04/newsletter-august/garmin-overview.png differ
diff --git a/posts/2025/09/04/newsletter-august/garmin-run.png b/posts/2025/09/04/newsletter-august/garmin-run.png
new file mode 100644
index 0000000..2b39d43
Binary files /dev/null and b/posts/2025/09/04/newsletter-august/garmin-run.png differ
diff --git a/posts/2025/09/04/newsletter-august/garmin-strava.png b/posts/2025/09/04/newsletter-august/garmin-strava.png
new file mode 100644
index 0000000..9e729bd
Binary files /dev/null and b/posts/2025/09/04/newsletter-august/garmin-strava.png differ
diff --git a/posts/2025/09/04/newsletter-august/garmin-watch.png b/posts/2025/09/04/newsletter-august/garmin-watch.png
new file mode 100644
index 0000000..2e49eba
Binary files /dev/null and b/posts/2025/09/04/newsletter-august/garmin-watch.png differ
diff --git a/posts/2025/09/04/newsletter-august/post.md b/posts/2025/09/04/newsletter-august/post.md
new file mode 100644
index 0000000..a4e3220
--- /dev/null
+++ b/posts/2025/09/04/newsletter-august/post.md
@@ -0,0 +1,106 @@
+---
+date: 2025-09-06 13:14:00
+title: Newsletter August 2025: More Programming
+tags: newsletter,timeline
+---
+
+This month I've been programming on two hobby projects. I have made progress on
+both as well as enjoyed the craft of programming.
+
+## Garmin
+
+I record my runs with a Garmin watch and heart rate monitor.
+
+
+
+I analyze the data they gather in the Garmin Connect and Strava apps.
+
+
+
+This month I wanted to analyze if I have become faster over time given the same
+effort. For example, I wanted to know if my average pace at an effort of 135
+BPM in heart rate had increased or not.
+
+I looked at using Garmin Connect and Strava for this, but couldn't find a way
+to do it. I pay for Strava, but use the free version of Garmin Connect. I
+found that Garmin had recently launched a paid subscription called Garmin
+Connect+ that should, among other things, allow you to do more custom graphs.
+
+But I was not keen on paying for something that maybe supports what I want. And
+what about when I want to extract some other data from my runs, and Garmin
+doesn't support it? Why is it so difficult to analyze data that I own in a way
+that I want?
+
+That's when the familiar though of "How hard can it be to do myself?" hit me
+and I started researching. I tried to connect my Garmin watch to my computer.
+It showed up as a USB device. I looked through the files and found a folder
+with all my activities. There they were. These are the sources I would need to
+analyze my runs. In a file format called FIT.
+
+I started researching how to process FIT files. Eventually I found that Garmin
+has a Python SDK [garmin-fit-sdk](https://pypi.org/project/garmin-fit-sdk/).
+Nice!
+
+Once I figured out how to process the files (the most uncertain part of this
+project) it was just a matter of drawing some graphs I though. And it was, but
+as usual it takes more time than anticipated. But this time, not too long. So I
+managed to build something that serves my needs. Here is the main screen:
+
+
+
+The top part shows an overview of all my runs. My Garmin watch has limited
+memory, so only the most recent activities are stored. But because I have used
+the Garmin Connect app for a while, I had uploaded my activities there and was
+able to download them again and import into my application.
+
+The bottom part is that custom graph that I wanted. I think I can see a trend
+towards faster average paces. Nice! I can click on a specific run here and a
+different graph will open:
+
+
+
+It shows the standard pace and heart rate graphs for a specific run.
+
+I have now stopped paying for Strava, and I think I will also leave their
+platform soon. For me, it has become more of a distraction than something that
+provides value.
+
+## Timeline
+
+This month I also did some more work on
+[Timeline](https://projects.rickardlindberg.me/timeline/). The new workflow
+that [my own code hosting
+platform](post:2025/05/02/newsletter-april-projects/post.md) provides with the
+addition of [building the Windows exe in
+Wine](post:2025/07/07/newsletter-july/post.md) is just wonderful. I make a
+change to the code, commit it, and push it. The push triggers a build of the
+project website and binaries. If the build succeeds, everything is published
+and the push commands finishes with a success code. I can share the new version
+instantly. If the build fails, nothing gets published and I have to fix the
+error found in the output of the push command.
+
+This month a request came in on the mailing list asking if event texts could be
+drawn outside the event box instead of inside. Here is what the tutorial
+timeline looks like today:
+
+
+
+I thought this was an interesting problem to work on, so I had a look.
+Implementing this feature required extensive changes in the logic of how a
+timeline is drawn. I spent quite a bit of time trying to understand the
+drawing code which I hadn't touched in years. I made many refactorings that I
+think made the code better in addition to supporting the new feature. Here is
+how it turned out:
+
+
+
+In some timelines, this rendering works better, and there is now a setting in
+Timeline that allows you to choose which one you want.
+
+This work felt rewarding for many reasons. It was an example of a well
+functioning feedback loop involving a user. The feedback loop was shorter
+because of technical improvements in the code hosting platform. And I got do a
+fun programming task.
diff --git a/posts/2025/09/04/newsletter-august/timeline-text-inside.png b/posts/2025/09/04/newsletter-august/timeline-text-inside.png
new file mode 100644
index 0000000..93ec4ba
Binary files /dev/null and b/posts/2025/09/04/newsletter-august/timeline-text-inside.png differ
diff --git a/posts/2025/09/04/newsletter-august/timeline-text-outside.png b/posts/2025/09/04/newsletter-august/timeline-text-outside.png
new file mode 100644
index 0000000..9e41e48
Binary files /dev/null and b/posts/2025/09/04/newsletter-august/timeline-text-outside.png differ
2025-09-04 06:20 Rickard pushed to blog
commit 418bdaa2c2fa8b0ce4f57536d9ae30549847564c
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date: Sat Aug 9 16:32:32 2025 +0200
Remove spotify extra, unnecessary args.
diff --git a/posts/2025/07/07/newsletter-july/post.md b/posts/2025/07/07/newsletter-july/post.md
index c0df564..1089aca 100644
--- a/posts/2025/07/07/newsletter-july/post.md
+++ b/posts/2025/07/07/newsletter-july/post.md
@@ -30,5 +30,5 @@ in a reasonable amount of time. Brute force, tree searches seem to take too
long. That was a bit disappointing, but I still had fun programming.
If you are a fan of thrash metal, I can highly recommend my new favourite band
-[Bloodstain](https://open.spotify.com/artist/6uG9Od49dC2XZyHVJS9aEZ?si=9SbN6FGIQKOuktq85Tt1eg&nd=1&dlsi=787ef799b4324a28).
+[Bloodstain](https://open.spotify.com/artist/6uG9Od49dC2XZyHVJS9aEZ).
Sooo good.
2025-08-09 16:26 Rickard pushed to blog
commit 1b544804a1e3c4f1efbf8f17063bd98175395399
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date: Sat Aug 9 16:26:15 2025 +0200
Newsletter July 2025.
diff --git a/posts/2025/07/07/newsletter-july/post.md b/posts/2025/07/07/newsletter-july/post.md
new file mode 100644
index 0000000..c0df564
--- /dev/null
+++ b/posts/2025/07/07/newsletter-july/post.md
@@ -0,0 +1,34 @@
+---
+date: 2025-08-09 16:09:00
+title: Newsletter July 2025: Leisure programming
+tags: newsletter
+---
+
+This month I did some work on
+[Timeline](https://projects.rickardlindberg.me/timeline/). Since we moved part
+of the development over to [my own code hosting
+platform](https://projects.rickardlindberg.me/) we lost the ability to build
+the Windows installer. That had to be done manually on a Windows PC. I don't
+like manual and I don't own a Windows PC, so this month I experimented with
+building the Windows installer on
+Linux/[Wine](https://en.wikipedia.org/wiki/Wine_(software)). To my slight
+surprise, I think I got it working. We'll see if we get any error reports after
+the next release.
+
+While I spent some time improving the infrastructure for Timeline, I also fixed
+some minor issues and did some cleanup in the codebase. I was reminded that I
+enjoy programming. It doesn't have to be a new, shiny project that has hundreds
+of satisfied customers. I simply enjoy the craft of programming.
+
+This month I also played many rounds of
+[Solitaire](https://en.wikipedia.org/wiki/Klondike_(solitaire)). Mainly to relax
+with something that doesn't involve a screen. That triggered me to write a
+program that figures out if a given hand is solvable or not. Again I had fun
+programming this thing and finding good ways to represent cards and the rules
+of solitaire. However, I think it turned out that the problem is not solvable
+in a reasonable amount of time. Brute force, tree searches seem to take too
+long. That was a bit disappointing, but I still had fun programming.
+
+If you are a fan of thrash metal, I can highly recommend my new favourite band
+[Bloodstain](https://open.spotify.com/artist/6uG9Od49dC2XZyHVJS9aEZ?si=9SbN6FGIQKOuktq85Tt1eg&nd=1&dlsi=787ef799b4324a28).
+Sooo good.
2025-07-07 09:08 Rickard pushed to blog
commit e222ec25134d69f05300d7e04bab67f24ba9a3f2
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date: Mon Jul 7 09:07:00 2025 +0200
Newsletter june 2025.
diff --git a/bib/simplepeter.md b/bib/simplepeter.md
new file mode 100644
index 0000000..fd51a1f
--- /dev/null
+++ b/bib/simplepeter.md
@@ -0,0 +1,6 @@
+---
+date: 2025-07-07 08:27:00
+title: Why Can't We Make Simple Software? - Peter van Hardenberg
+type: youtube
+link: https://youtu.be/czzAVuVz7u4
+---
diff --git a/posts/2025/07/07/newsletter-june/post.md b/posts/2025/07/07/newsletter-june/post.md
new file mode 100644
index 0000000..b4e771e
--- /dev/null
+++ b/posts/2025/07/07/newsletter-june/post.md
@@ -0,0 +1,19 @@
+---
+date: 2025-07-07 08:15:48
+title: Newsletter June 2025: Ink & Switch
+tags: newsletter
+---
+
+This month I watched the presentation [](bib:simplepeter). This introduced me
+to [Ink & Switch](https://www.inkandswitch.com):
+
+> An independent research lab exploring the future of tools for thought.
+>
+> We envision a new computer that amplifies human intelligence.
+
+This caught my interest because they mention [Doug
+Engelbart](https://en.wikipedia.org/wiki/Douglas_Engelbart) which I learned
+about from [Alan
+Kay](https://archive.rickardlindberg.me/writing/alan-kay-notes/). I have been
+inspired by Kay's work and perhaps Ink & Switch is doing work in the same vein
+that is worth keeping and eye on.
2025-06-01 08:22 Rickard pushed to blog
commit 47ea02ad8d656a26c2f70574ea8239a9fef772c9
Author: Rickard Lindberg <rickard@rickardlindberg.me>
Date: Sun Jun 1 08:22:13 2025 +0200
New post.
diff --git a/bib/kaylacked.md b/bib/kaylacked.md
new file mode 100644
index 0000000..624806d
--- /dev/null
+++ b/bib/kaylacked.md
@@ -0,0 +1,6 @@
+---
+date: 2025-05-31 10:25:00
+title: The little editor that could
+type: youtube
+link: https://youtu.be/GoyNMFccbow
+---
diff --git a/bib/lex467sweeny.md b/bib/lex467sweeny.md
new file mode 100644
index 0000000..d8388ef
--- /dev/null
+++ b/bib/lex467sweeny.md
@@ -0,0 +1,6 @@
+---
+date: 2025-05-31 10:27:00
+title: Tim Sweeney: Fortnite, Unreal Engine, and the Future of Gaming | Lex Fridman Podcast #467
+type: youtube
+link: https://youtu.be/477qF6QNSvc
+---
diff --git a/posts/2025/05/30/newsletter-may/post.md b/posts/2025/05/30/newsletter-may/post.md
new file mode 100644
index 0000000..16d69ed
--- /dev/null
+++ b/posts/2025/05/30/newsletter-may/post.md
@@ -0,0 +1,27 @@
+---
+date: 2025-06-01 08:21:00
+title: Newsletter May 2025: Podcasts and a new Blog
+tags: newsletter
+---
+
+This month I consumed some podcasts and Youtube videos related to programming.
+Here are my favourites:
+
+* Listening to [](bib:lex467sweeny) made me want to get into 3D graphics
+ programming. One project I have in mind, that I have thought about before, is
+ building a ray tracer.
+
+* I found the history lesson of the UNIX editor `ed` in [](bib:kaylacked)
+ interesting.
+
+* I got inspired when listening to [](bib:lex309carmack). Carmack has been part
+ of creating some amazing things with the use of programming. It inspired me
+ to do the same.
+
+* I listened to [](bib:lex48bjarne) because I enjoyed a previous Lex podcast,
+ and I needed something to entertain me during a long drive. C++ is a language
+ that I have actively avoided. After this podcast, I appreciate it a bit more.
+
+I also started working on a new blog. You can browse my posts/notes for this
+month at
+[blog.rickardlindberg.me/2025/05](https://blog.rickardlindberg.me/2025/05/).