Notes
| 2023-09-17
(updated 2025-10-25)
| 1 min read
#django#python
Django’s CSRF protection is usually a great thing,
but when building (API) endpoints meant to be accessed by scripts/third parties it gets in the way of that.
I write an extensive personal knowledge base using markdown, code-server and a variety of other tools.
Originally, in 2021, I wanted to have something like Obsidian Publish but self-hosted, so I created it.
Over time my knowledge base evolved more into a second brain, tracking not only my technical notes and journal, but also things like recipes and hikes.
With this my publishing pipeline, and the script at it’s core, extended in a multitude of ways.
This is a guide to a simple self organization/task management system I built for myself over the years.
From time to time I showed it to someone and they got some benefits from it, most adapted it to better fit their needs down the line,
which is exactly what you should do with any kind of personal task management in my opinion.
To me, a backend heavy developer, HTMX is the frontend framework I like to use because:
It does not feel like a JavaScript framework at all, but more like an extension of the HTTP/HTML model
It allows me to write interfaces that feel responsive and modern to users while still doing all the heavy lifting in my backend with the tools I’m used to
It works with my mental model, which is heavily based on the request-response cycle
Sometimes you have to do a specific task and you are fully capable of doing it manually,
however those tasks are also great to flex your muscles and hack something together.
They can be an excellent tool to sharpen your skills with the tools you use regularly,
and improve your quick prototyping skills.
In addition, with a couple of iterations, again sharpening an important skill, you could afterwards create a more general purpose tool from a hacky script.
Since I spend more than 8 hours here most days I created a nice setup for myself.
Thankfully I have a whole room just for my home office, so I take full advantage of that.
Besides my main desk I have a secondary desk,
a couch, a couple of sideboards, a wall mounted whiteboard and a couple of shelves to display all the techy and nerdy things.
Given the recent rise in text-based language models, sometimes called AI tools, I wanted to share my thoughts and experiences in using them,
especially in the context of blogging.
Notes
| 2023-04-01
(updated 2025-10-25)
| 3 min read
#hiking#personal
These days I enjoy hiking quite a lot.
To make it easier to just “pick up the pack and go” I created two basic packs that are optimized for my needs
and the environment I’m usually hiking in, the Swabian Alps.
Basics
I have some basics I duplicated and carry in both my packs, these are:
Pen & paper
Multitool
Mini first aid kit in a ziploc bag
Paracetamol
Band aids
Gel sanitizer
Foam pad
Waterproof poncho
A bit of cash, usually around 20-30€ these days
A piece of paper with my and my emergency contacts information
Fisherman’s Friend for a fresh feeling and honestly because my parents had them when we were hiking
Prepared packs
Small pack
I’m currently using a Terra Peak Flex 20l in red for my smaller backpack.
It’s a nice size for shorter hikes and fits me well.
Now that we have talked about the benefits of running your own server
and how to run your own server let’s take a look at some things you could run on your own personal server
and some things you should better not.
In the world of technology, we are moving further and further away from operating directly on servers,
but there are still significant benefits to be gained from running a personal server.
I have been running some kind of personal server for many years now and I strongly believe anyone working in technology can benefit greatly from doing so.
Here’s why:
The 1Password CLI op works either in connection with a client app, like on the Mac,
or standalone, useful on a server.
# Logineval$(op signin)# Get favoritesop item list --vault "Private" --favorite
# Get a specific itemop item get <ID>
# !! Important: Sign out at the endop signout
Some helper functions
Helpers to more easily work with the op cli.
1login(){eval$(op signin)}alias1signout="op signout"1search(){term=$1if[ -n "$2"]thenvault="$2"elsevault="Private"fiecho"Searching for '$term' in vaut '$vault'" op item list --vault "$vault" --long | grep "$term" --ignore-case
}1get(){ op item get $*}
This however did not work with the above mentioned error message.
After a lot of debugging I found that they released a new version recently which introduced this feature.
My solution was to update my locally build container image to the latest version, as of writing 1.29.0, in which this feature is introduced.
This is somewhere between a rant about the app and backing services no longer working, a collection of information I could find out about it
and a possible search-result for others facing the same issues and not really finding anything online just like me.
Update: March 2023
The company seems to no longer exist.
I have switched to the eufy smart scales, which are made by Anker, a reputable manufacturer.
Running any kind of personal infrastructure sometimes requires your attention based on certain events or failure states,
no matter how much you automate tasks.
Over the years I have used E-Mail, Telegram bots and a variety of other tools for this purpose.
However all of them have the drawback that they mix with other kinds of information and are not easilly usable in scripts.
Notes
| 2022-09-29
(updated 2025-10-25)
| 1 min read
#git
Sometimes you may want to commit only the files you have changed and not any newly created files,
this can easily be achieved by this command: git commit -a
Notes
| 2022-09-29
(updated 2025-10-25)
| 2 min read
#personal
This is a list of interesting blog posts, talks and such things that I found over the years.
Some of them may teach you something relevant, some may just further your general understanding of tech.
From personal experience they can lead you down the rabbit hole really fast, enjoy with care!
Ever since diving into the software development world I was troubled by a duality:
On the one hand I have built and operated many services described as monolithic with relative ease,
on the other hand I’m always told I, and others, should build microservices because they are better in a variety of ways.
With this post I’m going to compare both software architectures by looking at the key benefits often associated with microservices
and additional considerations I think are important.
Notes
| 2022-07-08
(updated 2025-10-25)
| 1 min read
#git#productivity
A simple changelog system on top of git commit messages.
The main idea is to generate “release notes” from a diff in commits before a release.
It can easily be run manually or as part of a merge/pull CI pipeline.
In this case it looks for commit messages starting with one of these [ADD], [REMOVE], [INFO]
and just outputs those, but those patters can be adjusted to fit any existing commit schema.
When adding yamllint to an existing project it can be hard to fix all the errors at once.
I wrote a simple script to create a rules block that simply ignores all rules that currently trigger for a file.
This works by generating a rules block ignoring paths.
In production I would consider it best practice to use a S3 solution for serving assets. Namely static files and user-generated media.
This describes my setup on how to do this locally too.
The main benefit for me is that there is less of a difference between environments and I can test S3 specific features in my app.
Setup
I will assume a already working Django project and MacOS with [[brew]] installed,
but brew specific parts are easilly replicated on different systems using their native package managers.
The path you are in when opening a new WSL tab is determined by startingDirectory.
This parameter needs to be a valid Windows path, which isn’t great if we want to end up in /home/kamner inside WSL.
The nice thing about WSL is that it will resolve windows paths into their equivalent WSL/linux path if possible.
For example, C:\Scripts would resolve to /mnt/c/Scripts.
Using this and the neat trick that the WSL filesystem is exposed as a a hidden fileshare ([[technology/windows/wsl-hidden-fileshare]])
we can get to where we want.
Afterwards, we can create a logroatet configuration going in /etc/logrotate.d/mongodb.
/var/log/mongodb/mongod.log
{
rotate 5 # Keep the last 5 rotated logs, so 6 files including the currently active
size 10M # Rotate once the log reaches 10MB in size, depending on your envrionment you could instead use daily, weekly, monthly, etc
missingok # It's ok if the log file does not exist
create 0600 mongodb mongodb # Permissions and ownership for the roatetd logs
delaycompress # Don't compress on first rotation, so we have the current log and log.1 uncompressed
compress # Compress everything else
sharedscripts # Run this script only once and not for every matching file
postrotate # Script to run after rotating
/bin/kill -SIGUSR1 $(systemctl show --property MainPID --value mongod.service)
endscript # End of script
}
The postrotate script simply finds the PID of mongod.service: systemctl show --property MainPID --value mongod.service
and sends it a SIGUSR1 which is the signal MongoDB expects if you wish to rotate the log.
Notes
| 2021-08-10
(updated 2025-10-25)
| 2 min read
#freshservice
It is possible to customize almost all of the user portal but you better know what you are doing.
Otherwise you may end up like me, spending way more time than you ever should on customizing this damn portal.
Let’s hope this one helps you, otherwise feel free to reach out to me on Twitter.
Page Header
Place a variation of the below at
Admin > General Settings > Helpdesk Rebranding > Requester Portal Branding > Customize Portal > Layout And Pages > Portal Pages > General Pages > Portal Home
The idea at the start was simple.
Do something like Obsidian Publish , so read frontmatter and if it contains published: True put it up on a website to view.
I have since rewritten and updated this tool: New version
The Basics
I started with taking a look at different static site generators but after a bit of testing I ended up back at Hugo, which I already use for ps1.guru and a few other projects.
The idea at the start was simple.
Do something like Obsidian Publish , so read frontmatter and if it contains published: True put it up on a website to view.