Picking a tool for zettelkasten

It is a very challenging thing to pick a tool to invest time into building a personal knowledgebase. I have used numerous tools over the years and collected a huge number of documents and notes. Logseq integrates with Zotero which might prove useful due the gigabytes of material that I have stored there. My plan was always to start writing sometime in the future. All of that material would be analyzed, quoted, and used to support some argument.

Zettlr offers the most typerwriter like view, and lacks some of the more advanced features. It is therefore the one that I am going to select for document construction. The simplicity and feature set of the program has proven itself conducive to my needs.

Joplin will continue to play a role as a my giant syncronized and backed up file cabinet.

Discovering Zettelkästen

I discovered Trilium.  The license is great.  The software is mind-blowing.   I found it as part of my desire to migrate away from Obsidian. They have a repository at https://github.com/TriliumNext/Trilium.

Via an advertisement there, I discovered https://www.warp.dev/code which looks like an most incredible resource.   That may be how applications like Trillium have such incredible documentation and coding. There are 271 contributors, and the documentation and features are incredible and beyond anything else I have seen in a note taking application. This piece of software and the mind blowing quality of the documentation and feature sets has made me reconsider Deepin with the local integration and Deepin IDE.

The problem is that the Trillium notes are in a database, whereas Obsidian’s are in mark down. I discovered Zettlr, whose notes are also in Markdown, and discuss that below..

I discovered https://www.zettlr.com/ from a discussion at https://www.xda-developers.com/found-open-source-app-like-obsidian-except-its-better/.

From that, I discovered Zettelkästen. More specifically, I learned what it was via Zettlr. The Zettelkasten method involves cross-referencing one’s knowledge base so that one can find relationships between concepts and create a living knowledgebase with minimal forgetfulness.1 Zettlr contains the ability to insert snippets using variables for the date, time, and unique ID numbers. This is something that I had been trying to do of my own accord using various applications over the years.

Obsidian has a great preview that one can use to directly copy to blogs and product great entries with links intact. It looks like Obsidian took Trilium’s preview and Zettlr’s markdown and file management to create their application. All three share a very similar sidebar and navigation motif.

I consider Obsidian to be like many Minecraft modification developers in recent years. They take a lot of permissively licensed opensource software and then wrap it in an all rights reserved vague statement and do not share any code or redistribution rights. Many minecraft mods say all rights reserved, which is not really a license. They incorporate and link other libraries. Java itself uses a classpath exception so they do not become GPL because of that, however when the mods rely on other libraries that are GPL, such as other mods, and then hide behind “all rights reserved” it really breaks my heart. One would think they would want their mods available at many different sites and not only the website they uploaded them too.

Electron is MIT licensed. This is not an accusation. This is my opinion. I suspect Obsidian used Trilium notes and possibly Zettlr code and is not compliant with the GPL. That is my opinion only. Trilium notes even comes with server software. The Obsidian Webclipper is great. Yet it irritates me to no end that an open source foundation, like Electron, and possibly some of the precursors of Obsidian, made the way to a piece of software that says you cannot even redistribute the binaries. They could go out of business, but with binaries around, people could use that great software for ages. The situation is contrary to the Linux ethos. I could be wrong, and they pulled their code from Memos, which has a very similiar interface. The Memos code is at https://github.com/usememos/memos. Memos is another project sponsored by Warp. I am not accusing Obsidian. Logseq is another GPL project with a great deal of similar features and buttons, and is available at https://github.com/logseq/logseq.

I am stating that it is very strange, and perhaps some AI agents are using GPL code and the downstream products are not GPL as they should be, but that is my opinion only.


  1. https://docs.zettlr.com/en/advanced/zkn-method/, retrieved December 14 2025

Joplin AppImage Integration

Joplin is the beautiful open source replacement for Evernote. Once upon a time, Evernote was a dream app, but then they sent out an atrocious terms of service change after turning their user interface into drab garbage compared to the old colorful beauty that existed in version 4 and before. Joplin is fully functional and syncs on every platform. They also provide a pure APK for download so that one can install it on LineageOS or other nongeminized Android system.  It offers full digital sovereignty.

One helpful tip that I spent a long time searching before learning, is that you can customize an image per notebook name, by right-clicking on the notebook, choosing edit, and then selecting an emoji.  Each notebook can have a different emoji as the icon.

Here is the procedure to integrate it into the Linux desktop. Notably, the icon is still the beautiful blue icon, and not the atrocious black and white one that has taken center stage on Windows versions of the app.

chmod +x Joplin-3.4.12.AppImage 
./Joplin-3.4.12.AppImage --appimage-extract
mv squashfs-root joplin-3.4.12
mv joplin-3.4.12 $HOME/Apps
cp $HOME/Apps/joplin-3.4.12/joplin.desktop $HOME/.local/share/applications
kate $HOME/.local/share/applications/joplin.desktop

Edit the file to say the following, but with $HOME replaced by the actual home directory of the relevant user:

[Desktop Entry]
Name=Joplin
Exec=$HOME/Apps/joplin-3.4.12/joplin --no-sandbox %U
Terminal=false
Type=Application
Icon=$HOME/Apps/joplin-3.4.12/joplin.png
StartupWMClass=Joplin
X-AppImage-Version=3.4.12
MimeType=x-scheme-handler/joplin;
Comment=Joplin for Desktop
Categories=Office;

Local download links:
Joplin-3.4.12 AppImage | Source as of 7 December 2025: joplin-dev-25.12.7

The last version that worked on OSX Catalina was 3.2.12.

LibreWolf 145 & Integrated AppImage

LibreWolf is a fork of Firefox that removes many of Mozilla’s bad decisions.1 A mirror of LibreWolf 145.0.1-2.x86_64 appimage is available here. Debian stable requires one to use a format other than the LibreWolf repo because as of 23 November, 2025 their site says the following:

sudo apt update && sudo apt install extrepo -y
sudo extrepo enable librewolf
sudo apt update && sudo apt install librewolf -y

Extrarepo exists only in Sid, which makes it unsuitable for Bookworm, or other stable Debian editions.  Adding Sid repos can turn Debian into something akin to a rolling distribution but it can cause problems if one wants older software.

To integrate the linked appimage into the operating system, take the following actions.2

./LibreWolf.x86_64.AppImage --appimage-extract
mv squashfs-root librewolf-145.0.1-2
mv librewolf-145.0.1-2 $HOME/Apps
cp $HOME/Apps/librewolf-145.0.1-2/io.gitlab.LibreWolf.desktop $HOME/.local/share/applications

Then, modify the four lines in $HOME/.local/share/applications/io.gitlab.LibreWolf.desktop that say exec. Those lines need to reflect the path where the executable resides.

I was working on this with Obsidian and preparing to archive the appimage on this website when I ran into a snag. The Obsidian .desktop referenced the AppRun from the AppImage whereas Librewolf referenced the executable named librewolf. After resolving this, I checked the licenses. Obsidian distributes software that is under the Apache License. That license allows one to add other requirements to their additions to the software. Their additional term is that you may not redistribute their software. They are even more onerous that IBM was with Lotus Symphony 3. Lotus Symphony 3 was an office suite built on Open Office that had an excellent tabbed document interface. It was a beautiful interface that Open Office should have incorporated, but for some reason they did not. The Symphony 3 license allows you to redistribute on physical disc to your friends and family, but not via internet website. Obsidian says no to redistribution at all. I was using Obsidian extensively on all my mobile devices, but will have to discontinue using it now. I have no interest in building open source machines with open source operating systems and having software that does not allow you to mirror it.

./Obsidian-1.10.3.AppImage --appimage-extract
mv squashfs-root Obsidian-1.10.3
mv Obsidian-1.10.3 $HOME/Apps
cp $HOME/Apps/Obsidian-1.10.3/obsidian.desktop $HOME/.local/share/applications

Modify the exec line in $HOME/.local/share/applications/obsidian.desktop to reflect the path where the AppImage contents appear. The exec should point to the application binary and not the AppRun file. e.g. $HOME/Apps/Obsidian-1.10.3/obsidian

I will leave this here for memory and education, but will discontinue the use of Obsidian since its future as an ongoing concern is limited to their availability of their website as a distribution channel. That does not bode well. Symphony 3 (1.3 on Linux) is nearly extinct, but one can still run it on old virtual machines.

  1. Mozilla’s strategic direction seems to be toward operating as an advertising company that uses the software clients themselves as the vehicle for advertisements and user data rather than websites and advertising platforms showing advertisements on those sites.
  2. I use $HOME/Apps and $HOME/Applications to install programs like this rather than opt so that I can easily modify files or use them in backup scripts. Typically Apps contains smaller programs, and Applications contains larger ones such as GPT4ALL which consumes tens of gigabytes.

My refined direction is digital sovereignty

My refined direction is digital sovereignty via the old paths with a goal of writing at least one article per week. The complexity of the articles will change because many projects are planned for the long term, but getting started on them takes a very long time..

I setup a RAID 5 in my old computer using new Western Digital 2 TB drives. In this case, the old machine is a Hewlett Packard Z600. The computer is very old in computer years. It has 12 Cores via dual Intel(R) Xeon(R) CPUs of model X5675 at 3.07GHz. [1] The prices on these on eBay have gone through the roof for old desktops computers of many types. One can easily find conversations about hard drives from three or four years discussing prices of $15 per terabyte. Now they are over $30 per terabyte.

I had purchased a used 2TB drive to use as Samba share space in the machine, and it went bad and locked into read-only mode within about a year. In deciding whether to buy used or new drives, I came to the conclusion that on an annual basis, one ends up spending the same or more via used drives than they do with new drives. Were one to purchase used drives, twice as many need to be acquired which eliminates the financial benefit while increasing one’s stress.

I could not remember my Vivaldi sync password despite creating the account only a couple of days ago. I tried several times to remember it, and then connections to vivaldi.net started timing out. It seems to me that they blocked me. If that had happened with the ability to access my email, it would have been a real issue. Because of this, I need to work on a more digitally sovereign approach here.

The extensions I use for Vivaldi include the Obsidian Web ClipperJoplin Web Clipper, Zotero Connector, floccus bookmarks sync, SingleFile, and uMatrix.

For LibreWolf, my extensions are Obsidian Web Clipper, SingleFile, Copy PlainText, floccus bookmarks sync, Joplin Web ClipperSearch by Image, Tree Style Tab, uMatrix, Undo Close Tab, and Web Archives.

  1. https://www.ebay.com/sch/179/i.html?_nkw=z600. Reviewed 11/1/2025, (Prices ranged from a single poorly described one for $160 with free shipping to $250 and 300 plus almost triple digit shipping costs. There were two pages total, and the entire last page was filled with $800 or $900 or even $1200 systems advertising things like 4 monitors for trading, 8 monitors, for trading and the like. The second best of all was 249.95 with free delivery.)

Running old versions of Java Minecraft

One source for the Java 8 (1.8) runtime is the Oracle Archives page.  Another helpful one is the standard Java download page for the desktop Java Runtime Environment, JRE.

I downloaded the Linux x86 (32-bit) version even though the host is a 64bit Linux.  The reason for that is that at some point in the point in the past Minecraft and various mods and the Forge loader required a 32 bit Java virtual machine (JVM).  It was so problematic to install both 64bit and 32bit via the package managers and manually configure them, that I developed a practice of installing 32-bit Linux so that the Java in the repository would also be 32bit and then everything would be fin.   It was much easier to run 32-bit Java and 32-bit Wine on a 32-bit operating system than reconfigure everything and try to switch between them depending on what was running.

I extracted the zip file from Oracle and then ran the Minecraft server instance with the following command.

home/username/Downloads/Java8_i586/jre1.8.0_461/bin/java -jar /home/username/Minecraft_x86/instances/b1.7.3/b1.7.3.251019/b1.7.3.jar nogui

Running the program that way worked very well.

.ssh config for Windows and Linux

The ~/.ssh/config file works for OpenSSH on Windows and for SSH on Linux.

To prevent disconnects, add the keepalive messages for all hosts. For specific hosts that use a specific key type, such as RSA on CentOS 6, add the specific algorithm via the HostkeyAlgorithms + functionality. To add a private key for SSH key logins, add the IdentityFile line. it is possible to allow the ssh-rsa algorithms on both outgoing and incoming connections for all hosts. The PubkeyAcceptedAlgorithms functionality is which key can be used to log into the host the config file sits on. the ForwardX11 setting sits on Linux hosts and not on Windows..

example ~/.ssh/config

IdentityFile ~/.ssh/Minecraft-Micro.pem

Host *
    ServerAliveInterval 40

Host 192.168.0.0
    HostkeyAlgorithms +ssh-rsa
 
ForwardX11 yes
HostKeyAlgorithms +ssh-rsa
PubkeyAcceptedAlgorithms +ssh-rsa

Switch a data volume on Linux

How to move /var/www/html/mydata/ to a new disk:

1. fdisk /dev/nvme4n1
     1.i. create a new DOS partition and write it to disk
2. mkfs -t ext4 /dev/nvme4n1p1
3. lsblk -f (and copy the UUID for use in FSTAB)
    3.i. a0e2e1e7-4034-4876-a005-ae5fcca39751
4. mount /dev/nvme4n1p1 /mnt
5. shopt -s dotglob
6. rsync -aulvXpogtr /var/www/html/mydata/* /mnt
7. edit /etc/fstab and replace the UUID for the data storage drive
8. mount -av to test
9. reboot

[_] Expand 7 to show fstab options

Debian 12 Sources

This is a listing of Debian sources for future reference.  Debian maintains  an archive of older versions on the Distribution Archives website.  It may be necessary at some point in the future to change the bullseye information below so that it points to the distribution archives.

/etc/apt/sources.list.d/vivaldi.list

### THIS FILE IS AUTOMATICALLY CONFIGURED ###
# You may comment out this entry, but any other modifications may be lost.
deb [arch=amd64] https://repo.vivaldi.com/stable/deb/ stable main

End of File

 

/etc/apt/sources.list

                                                
#deb cdrom:[Debian GNU/Linux 12.4.0 _Bookworm_ - Official amd64 NETINST with firmware 20231210-17:56]/ bookworm main>

deb http://deb.debian.org/debian/ bookworm main non-free-firmware
deb-src http://deb.debian.org/debian/ bookworm main non-free-firmware

deb http://security.debian.org/debian-security bookworm-security main non-free-firmware
deb-src http://security.debian.org/debian-security bookworm-security main non-free-firmware

# bookworm-updates, to get updates before a point release is made;
# see https://www.debian.org/doc/manuals/debian-reference/ch02.en.html#_updates_and_backports
deb http://deb.debian.org/debian/ bookworm-updates main non-free-firmware
deb-src http://deb.debian.org/debian/ bookworm-updates main non-free-firmware

# Debian 12 "bookworm" dropped by Python2.  Adding Debian 11 "bullseye"
# removed bullseye non-free-firmware from each of the below bullseye lines
# due to errors on 7/24/25
deb http://deb.debian.org/debian/ bullseye main
deb-src http://deb.debian.org/debian/ bullseye main
deb http://security.debian.org/debian-security bullseye-security main
deb-src http://security.debian.org/debian-security bullseye-security main
deb http://deb.debian.org/debian/ bullseye-updates main
deb-src http://deb.debian.org/debian/ bullseye-updates main


# added 7/24/25
# https://fasttrack.debian.net/


deb http://fasttrack.debian.net/debian-fasttrack/ bookworm-fasttrack main contrib
deb http://fasttrack.debian.net/debian-fasttrack/ bookworm-backports-staging main contrib



# This system was installed using small removable media
# (e.g. netinst, live or single CD). The matching "deb cdrom"
# entries were disabled at the end of the installation process.
# For information about how to configure apt package sources,
# see the sources.list(5) manual.

End of File

Batch file with date and time for zipping

WinRAR offers great feature. It will create a zip file using a name mask.  That allows one to create a file with an excellent name via the right click menu.  Buying many WinRAR licenses becomes cost prohibitive.  This batch file will do the same thing using 7Zip on Windows. The batch file must be saved in the SendTo folder on Windows.  7Zip must be installed

@echo off
REM create a timestamped zip file of a directory
REM ^ is a line continuation mark
FOR /F "TOKENS=1* DELIMS= " %%A IN (^
'DATE /T') DO SET CDATE=%%B
FOR /F "TOKENS=1,2 eol=/ DELIMS=/ " %%A IN (^
'DATE /T') DO SET mm=%%B
FOR /F "TOKENS=1,2 DELIMS=/ eol=/" %%A IN (^
'echo %CDATE%') DO SET dd=%%B
FOR /F "TOKENS=2,3 DELIMS=/ " %%A IN (^
'echo %CDATE%') DO SET yyyy=%%B
for /f "tokens=1-3 delims=:." %%A in ("%time%") do (
    set hours=%%A
    set minutes=%%B
    set seconds=%%C)

SET date2=%yyyy%-%mm%-%dd%_%hours%%minutes%
"C:\Program Files\7-Zip\7z.exe" a -tzip^
 C:\archives\%~n1_%date2%.zip %1
pause

This will save the zip filed in C:\archives\zips with a filename that consists of the original directory name and a timestamp of the form directoryname_2022-01-28_2212.zip. To use it, right click a directory, and choose SendTo –> TheBatchFileName. In my case, the file is named 7zipBackup.bat

Data Science Time Warp Machine

Fedora 38 freezes up and crashes sometimes when using Gnome on bare metal.  This may be the result of Gnome reliability issues.  In a previous article I detailed creating a massive repo of Fedora 38, and I still have it.  I will not delete the 238GB repo because Fedora 40 is the last one with Python 2.7 in the repositories.  They elected to completely remove it in Fedora 41 and beyond.  I created some software in Python 2.7 that may never make it to Python 3 because I will be an old man by the time I could complete the conversion relative to my available time in the present day. I had migrated from bare metal to WSL with Fedora 36 a few years ago. I had created my own WSL instance using the Fedora 36 cloud init image, and then upgraded it over the years to Fedora 38 and then ceased updating it.  WSL crashes and cannot be relied upon to run tasks that require many hours of continuous processing.

WSL really was wonderful for development and running Linux applications with underlying Linux features.  I used it for development using Pycharm.  The problem is that I would often return after 12 hours and see a message that the terminal could be closed with a CTRL + D which indicated that the service had stopped for some reason.  I suspect these occurred when available RAM conflicted with the /dev/share features of Linux.  Troubleshooting it would take too long. I don’t trust the releases from the Windows store because forced updates in Windows can take features away or cause unexpected problems.  I upgraded my Windows 11 home desktop to Windows 11 Pro specifically so I could disable Windows automatic updates via group policies, service disablement, and registry modifications that fail to stop auto updates on Windows 11 Home.

To create a long use time capsule of sorts, I decided to switch to Alma Linux 8 from Fedora 38.  Alma Linux 9 follows the tradition of RHEL 9 and removes the easy support for Python 2.

I setup Alma Linux 8.10 Cerulean Leopard, installed from the KDE live DVD, and installed r Studio server to access via web browser.

edit /ect/dnf/dnf.conf and add keepcache=True

dnf install epel-release    
dnf config-manager -enable powertools    
dnf install R    
dnf install python2

The python2 install installs pip2.7 automatically. One calls pip2 via the pip2.7 command.

As regular user the following is required for a script I made because parsedatetime changed after version 2.5 and is no longer compatible with the previous versions.

pip2.7 install parsedatetime==2.5 --user

• Install rstudio-2024.12.0+467-1.rpm from direct download

• Install rstudio-server-rhel-2024.12.0-467.rpm from direct download

systemctl enable rstudio-server

Configure the firewall to allow 8787.

usermod -a -G rstudio-server <username> 
setenforce 0

The last instruction to turn off SELinux is temporary until I can ascertain the specific rules that will need modification to allow it work. With SELinux enforcing with the initial configuration, the server cannot be accessed via web browser remotely

Blog code and general code release note system

Today’s site updates including removing the RSS feed links. Kinsta provided source code.1  The code for functions.php to remove it is:

remove_action( 'wp_head', 'feed_links_extra', 3 );
remove_action( 'wp_head', 'feed_links', 2 );
remove_action('wp_head', 'wlwmanifest_link');

Kinsta also provided another very useful function2 and that was one that removed the various update notifications in the dashboard.

function kinsta_hide_update_nag() {
remove_action( 'admin_notices', 'update_nag', 3 );
}

add_action('admin_menu','kinsta_hide_update_nag');

Another very useful function for WordPress is one where you may add additional mime types for upload to the library.  This is useful for uploading compressed archives in different formats. Chris Meller’s venerable blog provides the source.3

add_filter('upload_mimes', 'custom_upload_mimes');
function custom_upload_mimes ( $existing_mimes=array() ) {

	// add your ext => mime to the array
	$existing_mimes['xz'] = 'application/x-xz';
        $existing_mimes['zip'] = 'application/zip';
	$existing_mimes['xml'] = 'application/xml';

	// add as many as you like
	// and return the new full result
	return $existing_mimes;

}

Somewhere along the way I picked up the following items to use as release notes within the scripts that I create.

E.g. 11/05/2024: [*] Changed URL to 1.1.1.1 from 8.8.8.8

[+] = Added
[*] = Changed  
[^] = Moved  
[=] = No Changes  
[x] = Deleted  
[!] = Bugs  
[_] = To Do  
[>] = Migrated  
[<] = Migrated

1. Kinsta®. “WordPress Disable RSS Feed,” August 30, 2016. https://kinsta.com/knowledgebase/wordpress-disable-rss-feed/.

2. Kinsta®. “How To Disable WordPress Update Notifications (Plugin or Code),” July 4, 2022. https://kinsta.com/knowledgebase/disable-wordpress-update-notification/.

3. Meller, Chris. “Modifying Allowed Upload Types in WordPress | Chris Meller,” July 26, 2007. https://blog.chrismeller.com/modifying-allowed-upload-types-in-wordpress.