Show Sidebar

Welcome to the blog of Janek Fischer. On this page you can see the latest blog updates. For further articles, please use the search bar or navigate through the blue tags.

I recommend any decent RSS/Atom aggregator to get notified on blog updates.

Most recent articles or updates:

2025-09-04: State of Tasks 2025

After using my own task management tool mostr for a while (development journey), I soon hit its limits again: As a command-line REPL only application so far, its view modes are very limited. Like with other task managers I tried over the years, it soon got clogged up with unrelated tasks always somehow visible together - relevant with irrelevant subtasks, important projects next to undone chores. I ventured into solutions for that with the "Quick Access" section, which basically uses a frecency algorithm already.

But the real solution will be a proper full-featured interface with different view modes in combination with algorithmic priorization, which I outlined in my Bachelor's Thesis.

So for a while, I ended up jotting down tasks on my new Ratta Supernote Nomad and into Telegram (I know, not secure!). Now I finally set up Nextcloud Tasks in combination with iOS Reminders, which allows surprisingly seamless integration, since I maintain some Apple devices next to my lovely Arch Linux Framework laptop. This is great for quick things on the go.

For projects and work tasks, Vikunja is serving us very well after Konrads great work of the last years - whether colored Kanban or quickly adding hierarchical lists. Since Vikunja is also implementing CalDAV, I might soon be able to skip on Nextcloud Tasks altogether.

2024-12-04: How to Check If an Open Source Project is Actively Maintained

Adopting an actively maintained open source project is crucial for ensuring continued support, bug fixes, and feature updates. This article outlines how to determine if an open source project is actively maintained, using factors like commit frequency, issue and pull request management, and documentation quality.

Read the whole article ...

2024-12-04: Authenticating a Bot in Nostr

So, now I have an application that can interact with nostr, but what if I want to integrate it with other applications such as a messenger? What if I want to have a Bot in Zulip which allows you to create a Mostr Task and list existing ones? The latter one is more tricky since it requires authentication on a production relay. A nostr identity is an asymmetric cryptographic keypair, so there is no straightforward way to do such.

A signer browser extension is not of help, because the bot runs external to the user. Asking for and storing the user's key is out of question in this context, because that would expose it in both the message history and the zulip database. Any encryption password would need to be provided via message to the bot too, making the encryption moot as well.

Thus the avenues I see for the bot acting authenticated on behalf of a user is either to communicate with another intermediary securely (in essence a remote signer) or for the user to run a bot themselves that has the necessary identification details. The problem with the former stil is that any means of authenticating the bot to the intermediary would be available to the zulip server admin as they need to be stored somehow.

Read the whole article ...

2024-11-26: Why Mostr has no Merge Conflicts

Mostr uses the nostr protocol in novel ways to provide an immutable changelog and seamless synchronization.

Read the whole article ...

2024-11-26: Designing Nostr Applications for Unreliable Connectivity

In Nostr applications, relays serve as distributed databases - similar to git, where each repository holds a database. Git has a standard mechanism for bringing those databases into sync, which is helpful for offline work as well as redundancy.

I feel that with Nostr, we are in the area of centralized VCS like Subversion, where every check-in and update requires a connection. You may do some changes locally, but to properly integrate them you connect to the remote.

Read the whole article ...

2024-11-22: Crontab screwing up my tmux shell

In the last days I was suddenly faced with an oddly persistent issue: New tmux sessions were started with sh instead of my default shell. Even changing my .tmux.conf did not seem to make a difference:

 set -g default-shell /bin/zsh	  

Then the internet reminded me that tmux is driven by a server process. Killing the process and having it restart by creating a new session magically brought it back to my default shell zsh.

So something must have started this tmux session without my default shell.

I also noticed that this happened reliably in my new tmux session started at boot to control my Framework 16 LED Matrix. Realizing that also my whole environment (mainly populated by .zshenv) was missing, I started to put one and one together.

Read the whole article ...

2024-11-12: Designing Flexible Extendable Scales

In my task manager, I wanted priorities to be simple and accessible, but flexible for power use. So instead of nailing you down to a given set, I decided on simply using a number in the backend. The frontend could still display that number in any desired format.

Such scales ideally expand upwards - not like the EU energy label which has now been reset because they built a scale of few items with A being the best, instead of the other way around where you could at least extend it to the following letters instead of introducing a confusing reset.

That is why low priorities are given low numbers (and there is no technical reason not to allow negative numbers either, to allow expansion in both directions) so that old low-priority tasks do not pollute the list in a need to be adjusted downwards. Because if low number meant high priority, similar to the energy label, a new priority in your repertoire is easier to add to the bottom, requiring you to adjust. Adding it to the top means minimal adjustment needed, bceause there are typically fewer high-priority tasks.

Additionally, I introduced a mechanism that allows for interspersing as desired: A single-digit priority is always multiplied times 10, allowing one to easily get started incrementally with 10 priorities without caring about that mechanism, but if even more granularity is desired, the transition is seamless to one hundred or even more priority levels (not that I could envision myself properly using that, but I want to keep everything open for all kinds of individual workflows).

2024-10-17: The Quest for Simple Convenient Linux Image Viewers

I like simplicity, but I also like convenience. The Linux command line offers a lot of that, though the latter sometimes needs some searching. So also in the case of image viewers.

Over the course of the last months, I have developed two primary use-cases: Previewing a bunch of images directly in the terminal, first with generic iterm, then within kitty - images was one of the reasons prompting me to switch to it. The second one is a quick popup window, as KDE's showfoto is only marginally faster than the full-blown digikam which takes multiple seconds to start, with a lot of bells and whistles and pop-ups.

In the terminal, I quickly sorted out pxl and catimg because of inferior quality. cacaview converts images into colorful ASCII-Art, but is very coarse and pops up if you are in a graphical session and I found no way to turn that off, making it unsuitable for my uses. I took timg, viu and tiv into a detailed comparison using a little helper script to vary the width as seen below:

Comparison of timg, viu and tiv in kitty and konsole at varying widths
Comparison of timg, viu and tiv in kitty and konsole

Both timg and viu supported kitty at the time of the test, and while viu creates a smooth image in normal terminals, the jaggedness of tiv preserves a lot more details. timg hits a very good middle ground on these, and also allows previewing pdfs directly without conversion and can show images in grids, making it perfect for my previews. tiv supports a directory mode while viu only shows one image at a time, keeping timg as a clear winner. ueberzug also looked interesting, but more appropriate for integration with other applications. lsix is also an interesting alternative to kitty with its sixel protocol because it natively lists images in a grid with their names, but so far kitty served me well enough to not give this a second thought, though recent developments highlight sixel as a more established standard.

For the popup version for use from xdg-open, I wanted quick opening, ability to easily navigate back and forth in the folder of the image and focus capture with quick quitting. w3m is interesting cause it is also a browser, but seemed a bit clunky for this usecase. qiv fell out cause I tested it on KDE Plasma, where the popup window did not capture focus. feh also did not cut it, leaving me with the unmaintained sxiv and its various forks.

Today I experimented with nsxiv, pqiv and vimiv, with the latter as clear winner because of its ability to easily navigate between and within images with familiar vim shortcuts.

2024-10-15: Developing Portable Interfaces in Rust

As I am polishing the interface for my task manager, I am looking into ways of reusing code across different display environments - specifically I right now want to expand from the CLI to the web and Messenger Bots, with potential native interfaces in mind for later as well. One very specific component prompted a bit of a search: A table with colspan, styled to not have cell delimiters.

I found some hope in https://github.com/Canop/termimad - it uses Markdown which can easily be converted to HTML and is frequently supported within messengers. But my table requirements are not supported, and would not be portable either way because such specificities are outside the scope of Markdown. For now I might just settle with it though, finding a way to move forward without colspan.

For the future, another aspect that needs to be reconsidered is interactivity: The CLI is a REPL, so there are no interactive elements, similarly for messengers. But on the web and in an app, clickable elements are expected and useful. By then, a cross-platform library like flutter or its aspiring Rust alternative https://github.com/emilk/egui shall be considered.

2024-10-01: Building a Task Manager: Tag Inheritance

I am building a Task Manager called mostr where I am testing a lot of surprisingly novel concepts. Fundamentally, all tasks are organized in a tree rather than a pretermined project/subtasks structure. This allows tracking time by simply moving like through a directory tree. The currently selected task is the one being time-tracked, but also heavily influences the creation of new tasks, which are automatically subtasks of the current task.

Furthermore, you can attach tags to a task. Adding a context to your session then both filters for visible tasks with specific properties but also adds these properties to any newly created task.

Now I am figuring out how the selected task should affect the current task, because there should be some sort of tag inheritance: Usually subtasks would be annotated with similar tags as their parent tasks. So initially I thought I could simply match all subtasks of a matching parent task (virtual tag inheritance) or apply the tags of the parent task to the subtask (physical tag inheritance) But while I do want straightforward and intuitive defaults, I also want to maintain maximum flexibility so that mostr can accomodate different power users. But cases like this would not be handled well by the above options of inheritance:

Mostr #pc #dev
|- Think about Feature #think
|- Write about Feature #pc #write
|- Implement Feature #pc #dev	  

When I work on mostr, I am generally on the computer, which is why it has the pc tag. But there are also tasks in that project that do not necessarily happen on the computer. And how do the task tags interact with an active context?

When entering a task, we have three cases to handle:

With that in mind, I came up with the idea of virtual tags. When you enter a task and there is no existing context, the virtual tags behave like a transient context, both applying to filtering and creation. If the context is a subset of the current task tags, the extra tags only apply to creation of subtasks. If there is a mismatch, the current context is apparently obsolete, so it is removed before proceeding as if there was no context.

So the remaining question is how to remove virtual tags if you want to find or create a subtask which only has a subset of those. This touches the issue of storage: The context is a list of tags and excluded tags (tasks with these tags are hidden from view, not explicitly relevant here) and I presumed I could derive the virtual tags from the selected task without storing them separately. But to allow removing a virtual tag, I either need to track removed virtual tags or current virtual tags. This becomes even more tricky when moving up and down with such tasks. So when I enter mostr, I have the virtual tags #pc #dev - I remove them to enter the thinking task - but then what happens when I move up again? Per default, the virtual tags would be active again, unless the removal of virtual tags is also tracked in the context, which might just be the most effective way.

2024-08-16: Exploring Rust

After being on my list of languages to explore for years following my contribution to Mixxx in the Google Summer of Code 2020 where I got to know C++ professionals who love Rust, I finally start learning Rust last month by implementing a long-anticipated nostr-based project.

First of all, I wanted to get an introduction to the language, so I read a bit in "The Book" - The Rust Programming Language. In a quest for a more interactive experience I found Rustlings and then the Jetbrains adaptation. I have been an Intellij IDEA user for years, displacing Eclipse which I used back in school, especially once I migrated to Kotlin - Jetbrains also made Kotlin so their IDE is of course ahead while also being the de-facto best Java IDE (even though I would love to use fully open-source software like Eclipse, I sometimes need to be pragmatic). But I soon found those courses too slow and basic for somebody of my experience level - instead I opted to get my hands dirty straight away in a project, producing a usable tool within days. In between I read up on some select chapters of The Book and of course did some research.

Read the whole article ...

2024-07-31: Duolingo Review After Three Months of Learning Kiswahili

I started using Duolingo about three months ago on my third visit to Kenya, after seeing a friend use it to practice German. I realized that in as much as I knew some bits of Swahili, I was missing a proper foundation of vocabulary to practice with. And I did not want to go back to pesky word lists from school, that worked decently well for me to learn Latin but were very simplistic and unflexible.

First of all, I can report sucess in that: I am now able to express myself decently! Duolingo nicely fit itself into pockets of time throughout my day, teaching me incrementally.

The main struggle right now might be a feature of the language: Swahili is very compact and often spoken quickly (unlik almost anything else Africans do ^^) so comprehension in a conversation is still low, but also got better - rather than understanding only individual words like a few months ago, I can now comprehend phrases and sometimes a whole sentence. Still, a conversation requires the other person to consciously accomodate me so far, which especially kids are not really aware of unfortunately - and those are the ones I like to connect with most. Then again, not always words are needed.

Another challenge is the fact that Kenyans commonly intertwine Swahili and English, to the point that many are unable to speak either language purely. This means that I tend to commonly only get to hear a certain subset of words, with words such as colors entirely missing in everyday conversation. Additionally, I pick up Sheng, colloquial words typically used for example in money amounts - Nusu, Mbao, Chwani, Soo, Punch. Tanzania purportedly can help.

Read the whole article ...

2024-06-07: Keeping Up Relationships

Many people nowadays struggle to keep in touch with friends. Let me share my system that works for me and many of my closest contacts.

Rather than struggling to allocate time specifically, I maintain a list of people I call regularly. When an opportunity comes up, like a longer drive or a walk, I see who fits the mood and is available. I keep being surprised how glad people are for me to call them. Since I do it at my convenience, everybody is happy and I almost always have somebody to talk my thoughts over with.

This works most easily when I am with my family with the obligation to walk the dog every day. Because then I usually get outside at least twice a day, with ample opprtunity for a run, listening to music and podcasts, talking to people and enjoying nature.

This is my way of having regular walks with friends, bridging any distance without painful scheduling.

2024-05-06: Learning Kiswahili

Habari, niaje, sasa, mambo, jambo - a diversity of greetings point at the rich history of the common east african language. Typically African, none of these can really be equated to "Hello" - somehow they all more or less mean "how are you?" - even though that phrase also has literal translations like "Ukosalama?" or "Ukofiti?" I gave up on trying to make a proper distinction and just went along. What I can say is that "habari" is more formal (literally meaning "news") while "jambo" is the greeting of the coast. In my experience it is the only of these greetings used like "hello" - for all other words, you are not expected to respond with the greeting but a response indicating your state, almost always positive - here a selection in descending formality: Mzuri (good), Salama (peaceful), Nikosawa (I am fine), Fiti (nice), Poa (cool)

Similar to German, it is spoken across a few countries but differently - Tanzanians are generally regarded as speaking it properly, while people in Kenya and Uganda commonly mix it with English or tribal languages in a single sentence.

Read the whole article ...

2024-04-17: Polygon Project Stages

The Polygon Project is a vision of making modular open-source software more attractive than proprietary collaboration suites (such as Microsoft 365 or Google Suite) and ERP-Systems through deep integration, data soveignity with single point of truth and appealing and useful new interfaces as well as customizability to preferences and processes. While the true power resides on the simple flexible backend, revenue will come from servicing a ready-made productivity suite. The interface parts are crucial to selling as key decision people tend to have limited technical knowledge. That is why we focus the initial development on stability and user-facing components - home-grown open-source stacks are known for unreliability, but with the power of GitOps and Kubernetes we can change that - beating Google through their own technology.

This vision is to be implemented in multiple stages:

Read the whole article ...