Daddy’s got a brand new toy

On my recent work stint to Victoria it became apparent that my 13″ Macbook Pro (early 2015) was getting a bit long in the tooth. Surprisingly it still did everything I wanted it to, but it was a bit sluggish on the more data intensive tasks and the battery life was moderate. The nail in the coffin was my own bad habits—I like to open too many programs at once when doing ebook development. Typically I might have Photoshop, Word, Excel, Sigil, BBEdit, IA Writer, Preview, Calendar, Mail, NewsNetWire, iTunes and be popping in and out of InDesign and Visual Studio Code. It was just a bit too much for my poor old Macbook’s 2.9GHz Dual-Core intel i5 with 8 GM of memory and work slowed down noticeably.

And since I had been offered a work machine when I started at Orca I thought it might be time to take advantage of the deal. A few conversations later and I order this new beauty. Now this new machine is way over-powered for what I actually need it to do work-wise but since I got almost 8 years out of my old one I figured to go big and focus on longevity over price. I did have to top up the fund because  the company wasn’t that generous, but we worked out a more-than-fair deal.

 

 

Downsides

Of course every cloud has its tarnished lining … or whatever that saying is… In this case it is USB C ports and peripherals. One of the reasons to go with the Macbook Pro is that it at least comes with 3 thunderbolt (USB C) ports and a HDMI port. The Air’s only come with 2 ports… period. But as it stands I currently have 4 external HDs, cables for my iPhone and ereader, a webcam, an external keyboard, and second monitor and ethernet—that’s 10 in total and I still need spare ports for plugging in extra SSDs etc. <y current setup has a generous 4 USB C ports and 2 USB A ports and I have two USB A hubs and I still don’t have enough sometimes 🙂

And since the new Macbook supports USB 3.2 (with a super speedy 10 GB/S) I might as well take advantage of it and at least get the externals’ file transfer rates up to max speeds. So it means a new hub and a bunch of new dongles… But the choices seem pretty thin. Oh well… who doesn’t like researching tech on the web?

But… but… the Mac Mini?

Those of you who follow along (lol) will know I just bought a new computer (“just bought” being a relative thing) back in Nov. 2020. It was (is) a Mac mini (2018) 3.2 GHz 6-core Intel i7 with 16 Gb of RAM. The issue now is how do I divide the workload? I can’t see working on the slower computer when the new M2 chips are supposed to be so screaming fast. And switching from one machine to another is a bit of a pain (although I highly recommend Barrier as a virtual KVM).

It worked ok with the mini and two monitors being my main machine and using Barrier to control the old laptop, but if I want to use the monitors  with the. laptop (and I do…) then the mini either becomes a remote machine (which sucks for anything other than the most basic of tasks) or I need to invest in a real KVM so I can switch monitors as well.

And I don’t really need it as a media server although I suppose I could retire my old Mini (mid-2011). Decisions… decisions…


But regardless I  happily await the arrival of my new machine and the hours of setting up and settling in to get it just right

An Anniversary of sorts

My first blog post ever was over at: moreblaze.blogspot.com. That’s exactly 20 years ago. The 20-year anniversary for macblaze.ca has to wait until 2025. L has since taken over the original platform after I decided I wanted to host my own blog and not have to rely on external services—an unwarranted bit of paranoia as it turns out.

SATURDAY, NOVEMBER 29, 2002

Hi
Welcome to the Blog…
Hopefully this will house the daily diaries of (B)ruce (L)eslie (A)nd (Z)ak’s (E)lectronic (BLAZE) lives. Come back and visit whenever…

https://moreblaze.blogspot.com/2002/11/hi-welcome-to-blog.html

 

 

My last post there was this:https://moreblaze.blogspot.com/2005/11/blog-abandonment.html (https://moreblaze.blogspot.com/2005/11/), I might go back and export all my posts from there and add them in here…for posterity and unity’s sake. And because…why not…?

Markdown & a Pi update

Because I know you care…

Previous updates: December 2021: An Introduction To Dashboards; October 2021: Pi Update; August 2021: What’s Your Pi Doing?

So what’s up with markdown?

Way back in December 2014 (Markdown) I came across this simple markup language called Markdown. Since I wrote in text editors  anyway (Word makes me crazy!) it seemed like a good way to add some simple formatting. Fast forward 8 years or so and I am still using it and use it almost exclusively for note-taking and recording (for posterity) things I am doing. (I’ve got a cheat sheet posted for those who are more interested.

These days all my computer set-up and install notes are in Markdown, my yearly books read, and lately, all my ebook and accessibility research have been written in Markdown.

A few weeks back I had one of those “I wonder if…” thoughts and it transformed my world. You perceive, I had a lot of notes and note files going by now and it was getting worse and worse everyday… since I am basically being paid these days to make notes about ebooks and accessibility and I like to give my money’s worth. Frankly it was becoming a big mess of files, folders and disorganized gibberish.

I wondered if there is a way to render all those markdown notes on a simple website? I’ve done it with my notes on GitHub for Standard eBooks but that is a fancy Jekyll installation. And I mean, half the time I am pasting markdown into this WordPress blog and the Jetpack plugin I installed renders it as html so it shouldn’t be that complicated …should it? But a separate WordPress install was just too unwieldy and frankly I have having to log in all the time since WordPress helpfully built in a timer to kick you out after a certain period of time… sigh.

So that disqualifies my first two choices. So time to do a bit of googlin’

Enter MkDocs

https://www.mkdocs.org/

— MkDocs is a fastsimple and downright gorgeous static site generator that’s geared towards…

And is it ever. A quick docker install, a bit of reading about how to tweak the interface and voila! A clean, searchable interface that updates every time I hit save.

This:

Becomes this:

All organized, neat and tidy and most especially searchable. As you can imagine I am slowly making more and more sites and cleaning up a lot of old notes.

My world has been rocked.

What’s on the Pi these days?

I keep tweaking with things. I did pick up a Pi-400 as a machine to experiment on since I am trying to use the original Pi 4 as a production machine more and more.

A Pi-400 is a 4 GB Pi 4 in a keyboard case. For some reason they are actually available where as all the other Pi models are very hard to get.

The Dashboard Today

I’ve reorganized a bit but the essentials haven’t changed much. Notable new additions are VS Code Server, MeTube, Home Assistant and Snippet Box.

VS Code Server

VS Code Server is one of the code editors I use to  write python. Having it on my Pi as a web-based version is occasionally helpful but it is most useful for editing yaml files and configs for the docker containers so I don’t have to mount the Pi as a drive etc.

MeTube

Is a fast and easy YouTube downloader. Paste in the URL and it downloads the video. Great for archiving favourite shows like Taskmaster.

Home Assistant

I bought my first smart bulb. And since I am a cheapo I didn’t buy the expensive Hue that works with Macs, I had to do some hacking to get Siri to recognize it. I will probably do a post later about that whole adventure, but suffice it to say I landed on Home Assistant — which is a missive open source home automation software package with a huge community. All to control one single bulb.

But hey it turns on and off everyday all by itself and even turns on earlier if it’s cloudy outside! W00t!

 

MkDocs

See above 🙂

Snippet Box

Snippet box may not be long for the (Pi) world… It’s a great app that allows you to store snippets of code that you use fairly frequently but always forget the specifics of.

I was using it to store regex’s but I have a feeling I will replace it with a MkDocs site. We will see I guess…

 

CSS Magic

I haven’t been keeping up on my css learning but I saw a new one the other day that is so applicable to text design. One can only hope that ebook reading systems will eventually support it. From https://www.youtube.com/watch?v=OGJvhpoE8b4

Often you want a different spacing between a H1 and H2 than you want between an H1 and paragraph. This is actually quite hard to do:

Title

Subtitle

This is the paragraph.

Title

This is the paragraph.

Using the :has selector you can say if the h1 class has (not) a subtitle them change the space after:

<h1 class="article-title">Title</h1> 
    <h2 class="article-title">subtitle</h2>
    <p>Lorem ipsum baby.</p>

<h1 class="article-title">Title&</h1>
   <p>Lorem ipsum baby.</p>
.article-title{
  margin:0;

.article-subtitle{
  margin:0;
  margin-block-end: 3rem;
}

.article-title:not(:has(+ .article-subtitle)){
  margin-block-end: 3rem;
}

Magic Mouse

I finally am making a commitment for moving from an Apple Mouse:

to a Magic Mouse:

So far it isn’t as painful as last time I tried, but I have been banging my head against the crappy scroll speed. I finally found the setting:

System Preferences > Accessibility >Pointer Control > Mouse options. ..  Stupid place for it.

Hopefully I will get used to it. Now I need to head over to Photoshop and InDesign for the real test.

Saturday’s Python Lesson

I have been dabbling more and more with Python. Python is a programming language (that, FWIW, comes pre-installed on a Mac) that is used by a lot of data scientists. As programming languages go it isn’t too hard to learn and is really versatile. One of the things that makes it so versatile is that it can use outside modules and libraries easily and there seems to be a module that will do just about anything you can want.

Why

A few years back I tried to convince L to use the import function built into Blackboard (MacEwan’s LMS [Learning Management System]) to import quiz questions and move from paper-based marking to a more automated workflow. It didn’t work, but in the process I did build a php module to build quizzes.

Then COVID happened.

But, no, before you jump to conclusions, I didn’t manage to convince her to use the bulk import even though she started to use the quiz modules to deliver and mark the quiz. Baby steps.

Then Moodle happened.

MacEwan is in the process of giving up on Blackboard and transitioning to Moodle — which is an open-source LMS. As it happens L has another, temporary, teaching gig at a different institution that also uses Moodle — this was a lot of additional work and learning, so she was starting to come around to the idea I might be able to help.

As a result, eventually, with great sighs and heaving shoulders, she gave in to my pestering and allowed me to upload one of her quizzes… and lo and behold she was impressed at the ease! Minus a few technical glitches.

My End

What I had done was use the format info from my previous php project. Then I used her docx file and by saving it as a text file I was able to do a few search and replaces via regex to create an upload compatible file. Blackboard wants files to look like:

TF  True or false? For Niklas Luhmann, the individual agent is not integral to society.   TRUE
MC  In the sentence "Maybe I got mine, but you'll all get yours.", what part of speech is "yours"?  pronoun CORRECT adjective   INCORRECT   preposition INCORRECT   noun    INCORRECT

Version One

…of my process was simply to build the regex. Luckily she used a pretty standard format to write the questions so I just had to find the pattern and use it to change it to the proper format.

TRUE/FALSE

True or false? For Niklas Luhmann, the individual agent is not integral to society.

True
False

PRONOUNS

In the sentence “Maybe I got mine, but you’ll all get yours.”, what part of speech is “yours”?

pronoun
preposition
noun
adjective

Find:
(.*?)\n\n(.*?)\n(.*?)\n(.*?)\n(.*?)\n\n

Replace with:
MC\t\1\t\2\tCORRECT\t\3\tINCORRECT\t\4\tINCORRECT\t\5\tINCORRECT\n

In English this says find: anything (group1) followed by 2 line breaks followed by anything (group2) followed by 1 line break followed by anything (group3) followed by 1 line break followed by anything (group4) followed by 1 line break followed by anything (group5) followed by 2 line breaks

Replace it with: MC tab Group1 tab Group2 tab CORRECT tab Group3 tab INCORRECT tab Group4 tab INCORRECT tab Group5 tab INCORRECT line break

Easy, right? It was slightly different for the True/False questions as there was only two answers but followed the same principles.

Version Two

…added a python script that looked for the ALL CAPS and split the file into two separate files. At which point I also wrote in a search and replace of ‘’ and “” into ' and " since Blackboard didn’t like the special characters.

Version Three

…combined the original regexes with the python script and did it all in one pass. Success! I also added a randomization bit so she could leave the first Multiple Choice answer as the Correct one and the script would randomize them before upload.

Of course when I went to demo the speed and efficiency of my “wondrous creation” to L I forgot to convert the docx to a txt file and it failed. But I soldiered on, did the necessary step and then proceeded — but the “burning shame” of failure remained and so…

Version Four

…added a docx import module and that’s where I am now.

Given an Word docx file with sections delineated by titles in ALL CAPS, this script will divided it into several text files named after the sections, convert curly quotes , format the questions in Multiple Choice or True/False format, and randomize the MC answers.

The resulting files can be uploaded to Blackboard’s question pool for use in multiple quizzes. Of course now I have to do it all over agin for Moodle as it uses a completely different import format 🙂

# import necessary modules
import os
import random
import re

import pypandoc

# NOTE Sections must be in ALL CAPS. They must be named TRUE FALSE (or TRUE / FALSE)
# or else be in the Multiple Choice format.

# set directory to current path of python file
directory_path = os.path.dirname(__file__)

# get file name
print('Enter the filename (without.docx):')
filename = input()

# set docx file and output file
docxFilename = directory_path + "/" + filename + ".docx"
outputfilename = directory_path + "/" + filename + ".txt"

# use pandoc to convert docx to txt
output = pypandoc.convert_file(
    docxFilename, 'plain', outputfile=outputfilename,
    extra_args=['--wrap=preserve'])
assert output == ""

# Open the converted file
filecontents = open(
    directory_path + "/" + filename + ".txt", "r")

# Assigns the variable filecontents the contents of filename.txt, not just the location of the file
filecontents = str(filecontents.read())

# Finds all the ALL CAPS in the file and makes a list (section) of all the sections
sectionname = re.compile(
    r'\n(?=[A-Z])([/A-Z\s]+)\n')
section = re.split(sectionname, filecontents)

# Removes the preamble in list and starts with first ALL CAPS section
section.pop(0)

# Loops for the number of sections in the file, starting at the first split 
# looking for every 2nd section (the contents rather than the title)
for i in range(0, len(section)+1, 2):

    # Set section name and strip out extra characters
    sectionname = section[i-2][:-1]
    sectionname = re.sub("[/|\s]", "", sectionname)

    # Opens a file with the name of ALL CAPS sections; if it does not exist, it creates one
    writeFile = open(
        directory_path + "/" + "split-files/"+sectionname+".txt", "w+")

    # sets text to item (contents) in the list after ALL CAPS delimiter
    text = section[i-1]

    # strips out curly quotes
    text = text.replace('“', '"').replace(
        '‘', "'").replace('”', '"').replace('’', "'")

    # if the sectionname is TRUEFALSE then...
    # then use regex to  format questions as TF otherwise format as MC
    if sectionname == "TRUEFALSE":
        # Substitute all patterns in one go
        text = re.sub(r'(.*?)\n\n(.*?)\n\n(.*?)(\n\n|\n\Z|\Z)',
                      lambda x: 'TF \t' + x.group(1) + '\t' + x.group(2).upper() + '\n', text)
        writeFile.write(text)
    else:
        # else loop though text, match pattern and name capture groups. Uses ?P<name> to name groups
        for m in re.finditer(r'(?P<qq>.*?)\n\n(?P<one>.*?)\n\n(?P<two>.*?)\n\n(?P<three>.*?)\n\n(?P<four>.*?)(\n\n|\n\Z|\Z)', text):

            question = m.group('qq')
            # write capture groups of answer into a list so we can randomize it
            qlist = [m.group('one') + "\tCORRECT", m.group(
                'two') + "\tINCORRECT", m.group('three') + "\tINCORRECT", m.group('four') + "\tINCORRECT"]
            # randomize list
            random.shuffle(qlist)

            # construct question and answers
            text = "MC\t" + question + "\t" + qlist[0] + "\t" + qlist[1] + "\t" + \
                qlist[2] + "\t" + qlist[3] + "\t\n"

            # Write to file
            writeFile.write(text)

    writeFile.close()  # Finally, it closes the text file

Rsync…

Or, How tech support isn’t all that supportive

In our last exciting instalment we were quite happy with our new web home except for one feature…the lack of rsync. Today, the exciting conclusion…

The issue

I use Hugo to generate a static files for several of my sites. One Hugo site is hosted on Netlify and is based off GitHub. So all I do is edit the files and sync them to Github. Netlify then grabs the files, compiles them and updates the site. It’s a great system and, FWIW, completely free.

The other main site that employs Hugo is my professional site (astart.ca) and with it I went a different route. I make the changes and using a handy script from the Hugo site, I run a command — ./deploy — and it automatically compiles the site then uploads it immediately to my web host. Or at least it did. Rsync didn’t seem to work on my new host.

Call support

Of course in the new a modern age you can just click on a link and chat with support. So I did. They informed me that my shared hosting did not include root access and I would need root access to use rsync. If I wanted I could upgrade to a cloud server… only ~$43/month. Lol. Seriously ROTFL. I mean ROTFLMAO. That would magically transform my $148 cad investment into $1584. Did I mention Lol?

I thanked him politely and went looking for another solution.

Everything is somewhere on the internet

One search phrase and a couple of clicks later and I arrived here: http://oerinet.net/wordpress/synchronizing-files-with-rsync-on-godaddy-shared-hosting/. It was GoDaddy specific so I wasn’t 100% sure it work but what the heck. But it did. After following his instructions I had to change one word in my script as well as the login credentials and I was in like Flynn.

For posterity

So what I did was (all according to the above link):

ssh into the server — I had already set this up.

mkdir ~/bin

echo '#!/bin/bash'&gt;~/.bash_profile
echo 'PATH="$HOME/bin:$PATH"'&gt;&gt;~/.bash_profile
chmod +x ~/.bash_profile
cd ~/bin
wget http://www.oerinet.net/files/godaddy_bin/rsync.gz
gunzip *.gz
chmod +x *

Grab the path

cd ~/bin
pwd

and edit the deploy script.

Abracadabra!

Sweet, sweet success

Apparently I could also install nano this way. I will have to grab his copy of the rsync and nano installers and store them somewhere. I am not sure if they are commonly available in single packages although I would guess they are…

Because “Everything is somewhere on the internet”

A New Home!

But hopefully you won’t notice.

I decided it was time

For a number of reasons I have been maundering about moving my webhosting and I finally made the leap. The last time I moved was back in January 2014. So it was time, right? The first move was January 2010 from a home server to GoDaddy… that was barely 4 years. Complacency must have set in.

The reasons? Well, in no particular order:

Speed

My old host was dreadfully slow sometimes and I could never figure out if it was my site design and years and years of clapping odds and sods together and shoddily attaching them to the site or just them. Moving gives me a chance to experiment with a new provider and to clean up a bunch of crud that has accumulated.

Money

2 more years of hosting on the old site was going to be $216 usd ($276 cad). Taking advantage of a “new customer” deal netted me 3 years for only $148 cad.

Canadian laws

I have become increasing disturbed by the slowly eroding privacy laws in the U.S. L had needed a Canadian-based server for her research project last fall and I did a bunch of research on Can-based hosts. Since I was moving, why not move to a Canadian company and avoid any increasingly privacy-creep that seems to be the American judicial system. And I know, it really is more symbolic that actual, but still. Oh, and it’s “buy Canada” too! So I get loyalty points.

Python

One of the things I noted when I was doing my research was that some hosting companies allowed python and ruby apps. It was a point of great frustration a few years ago that I had to host my apps on my home server. This new host allows such apps to be hosted. I probably won’t move my old ones now but any new apps can be hosted off my home site.

Downsides?

Time and effort

It took half a day of planning most of a day work to move everything and I am still not sure its been 100% successful. But I like puttering and I learned some shit so why not.

rsync

So far the only big downside is rsync doesn’t seem o work on the new host. I will have to ask when I get to that point. Rsync was what I used to deploy my hugo website automatically: syncing my desktop files to the server. I can use ftp in the mean time but just typing deploy was a great way to update things.

What do I spend this money for?


My new host! Oddly enough L’s research project is hosted here and they suffered a nigh-on-catastrophic breach this past summer. Luckily, at least for us, everything was restored pretty thoroughly. So why did I pick them? Well I figured that the security breach probably taught them a huge lesson and, at least for a while, they are going to have some pretty hot and up-to-date security in place. And all the reasons above.

And I learned a lesson about my own back-ups as well. 🙂

webhosting

I host a number of sites.
macblaze.ca—my personal home since 2005
neverforever.ca—our boating site
astart.ca—my professional site
theboozephiles.com— my, L’s, C’s and Z’s cocktail site. Check it out if you like booze!
beakerwood.ca—my brother’s woodworking site. permanently under construction these days

And two more for C which are little more than placeholders but I keep hoping she will let me make her some spiffy sites.
reluctantlyyours.ca
littlefirecreative.ca

subdomains

I also use a bunch of subdomains to direct web traffic to various projects and my home server. This is an offshoot of my handy Pi Nginx project!

email

At least 4 site-specific email addresses. I have no idea why people shell out for mybusiness.com and then use mybusiness@gmail… seems a waste of resources. Most of them just forward to my existing addresses but at least one is standalone.

various projects

I have hosted api’s, static sites, otehr people’s domains etc. It gives me a lot of flexibility—and as I mentioned above I can now host python web apps.

A bit more complicated but…

So how was the move compared to last time? A bit more efficient, but also a bit more complex wth all the various sites. 3 of them were WordPress sites with associated mysql databases and structures and the other 4 were just static. So I did a massive host-wide backup and downloaded the 9-gig zip file to my desktop. I also exported the 3 mysql databases using the  backup tool.

After that I, one-by-one, starting with the smallest and easiest (beakerwood.ca), worked on a site:

  1. Create a subdomain
  2. Upload the files
  3. Changed the nameservers (on GoDaddy)
  4. Made a small edit to the index.html/php file for checking purposes
  5. And waited about 10–20 minuted for the domain name to propagate through the internet

And voila!

The WordPress sites started with creating a new, empty mysql database and the using phpMyAdmin to import the files downloaded from the old server. Then it was simply a matter of zipping the dowloaded wp installation, uploading it and then extracting the files. Like last time back in 2014 I tried uploading the un zipped files first and it was excruciatingly slow. But I clued in quicker this time. You would have thought I would go back and read those notes (since that is primarily what this site is for) but no… dumb, dumb, dumb  😉

The only thing I had to do was change the wp-config.php file to use the new database name and credentials. It all worked smoothly except for macblaze.ca but eventually I got my silly errors straightened out.

add emails

Since they were mostly forwards this was simply a matter of adding new emails tot eh new host. Everything else (smtp servers etc) stayed the same.

ssh

I had a bit of trouble getting ssh to work but it was because they use a different port. A quick chat with tech support straightened me out. Now I just have to figure out the rsync thing.

C’est tout

That’s pretty much it. So far, so good. I cancelled my account at Stablehost and already got back a “please don’t go, here is 6 months free…” note, but I am committed now. We shall see…

An introduction to dashboards

As I have been playing with my Pi I have been introduced to a bunch of new concepts and terminologies. The first is Homelab. Apparently it is a thing to build a your won server and set it up wth some high powered stuff. If you watch the YouTube videos you get the sense that these tare might powerful systems but reading between the lines you realize that’s just because they are YouTubers and need to keep ahead of the curve. My Pi and Shaw’s router qualify just fine as a homelab. It seems all I have to be doing is installing shit, breaking shit and adding even more shit. Check.

The next one, and more relevant to this post is dashboard. After you get your home server all set up you start to realize that most fo the services are web-based and it get to be a lot of book marks for things you go back to again and again. So the idea of a custom start page was born (reddit even has one of those reddit forums thingees dedicated to it: https://www.reddit.com/r/startpages/). Taking the idea further a bunch of developers have made apps to manage the underlying code as the whole idea of a homelab is that it changes pretty often and hand-coding a new webpage every time would get monotonous.

Homer

Homer was the first dashboard I encountered and frankly, IMHO, still the best. I will look at some of the others later. Homer is a project developed by Bastien Wirtz and is available as a docker container.

Out of the box it is pretty basic and frankly ugly:

But it does come with a bunch of easy configuration options to make improvements pretty quick. And if you dig deeper you can tweak it pretty significantly. I came across walkxcode’s modded theme and immediately started stealing some of his settings to get it the way I wanted.

The config is all based on yaml (yet another markup language) which I learned for my Hugo web pages so I was already pretty familiar with the format. Adding or deleting items on the page is simply a matter of editing the config file.

items:
- name: "Awesome app"
logo: "assets/tools/sample.png"
subtitle: "Bookmark example"
tag: "app"
url: "https://www.reddit.com/r/selfhosted/"
target: "_blank" # optional html a tag target attribute

It features colour-coded tagging, as many categories as you want 2, 4, 6 or 12 column layout, a link/menu bar, optional header and footer, additional pages and a list view. You can add in a custom background, use light or dark mode and a few cool applications like hooking up to a Open Weather api to display your local weather.

Homer does have a few major downsides. Although there is a search function it only searches the startpage. Many of the other dashboards integrate google or duck duck go searches into the search field so you can use it as your browsers’ default page. And it uses vue.js (which is Greek to me) and scss (which is more Spanish—I understand some of it, but wouldn’t dare try and speak it) so making changes is not as straightforward as I might like. Hence the borrowing of walkxcode’s work.

But all in all after I got it where I wanted to be. For now 🙂

Page2

The Competition

If you look in the fourth column you will see Flame, Heimdall and Dashboard, which are all other dashboards you could use and I tried them all to one degree or another.

Dashboard

Dashboard (https://github.com/phntxx/dashboard) is the simplest (and I think the oldest). It works from json files which I have played with but is harder to parse than yaml and much more visually complex which makes it harder (for me) to make quick edits without screwing up the format. Other than that I didn’t like the lack of custom icons and the strict layout format.

Flame

As far as I can tell Flame (https://github.com/pawelmalak/flame) is mostly a fork of Dashboard…at least visually. It added in a web interface so you could add icons and links using a browser rather than having to edit a config file. Which put it ahead of both Dashboard and Homer, but, in the end I didn’t like the restrictions imposed on the way info was displayed and was frustrated with what kind of info you had to show.

Heimdall

The last dashboard I tried was Heimdall (https://heimdall.site/) which seems to be pretty popular and much more professional. My big issue with it (and indeed with Homer but there I could fix it) was the size of the app “buttons.” I still run a 1920 x 1080 screen and you just can’t fit many buttons onto one screen. Add in a search bar (disabled in the screen shot) and it just looked bloated. But it did have the web interface, lots of custom tags and categories and would probably look way better on a higher resolution screen.