As is tradition for this time of year, I've started picking up on side coding projects once again, including Glowbug - my custom CMS for this blog. I did some backend tweaking - fixing a few lingering bugs and adding some admin functionality which I needed.
I also did the (somewhat) yearly update of the About Me page. Adding a TLDR at the top, and then adding my short summation for 2025 to the end.
"Write 'Freehold' Software"
A blog entry where the author dives into the need to support software which is not a service, a term he proposes be 'freehold' to make use of the term's definition as it relates to real estate: "Permanent and absolute tenure of land or property with freedom to dispose of it at will."
"The Art of Lisp & Writing"
A wonderful essay that discusses the creative process, the process of discovery, of sharing knowledge and more.
I loved this paragraph:
As people need or want to do things with materials and the world, people with special skill take the fore and devise or discover how to manipulate the physical world to make those things. To avoid future mistakes, these makers write down rules of thumb, patterns of creation and making, and safety factors as a practical matter. Today we call them engineers. When we think of engineering today we think of carefully planned scientific engineering such as building bridges, where it is a fairly linear though costly and complicated process to go from the planning stage to a completed bridge. We forget the centuries of tinkering with bridge design in prehistoric and ancient times when bridges were gingerly tested as designers searched for principles. Even still, on November 7, 1940, at 11:00AM, the Tacoma Narrows Bridge collapsed from wind-caused vibrations after being open to the public for a few months, showing that even sophisticated engineering techniques—one could even call them contemporary engineering techniques—can fail.
This reminds me I was meaning, one day, in my plentiful free time to return to programming Lisp. I did some of it in college, and I recall enjoying it on a technical / logic level, though I never reached any real capabilities that had it do more than just things like simple terminal applications, or using Alan Kay's Smalltalk. Without a doubt, I saw the great power and potential. Lamba functions were a revelation for college-me.
Now more languages have similar functionality, and I don't know how Lisp has grown and evolved over the past twenty years (oh god, I can now refer to the time since I was in college as 'decades') -- but I am adding a note to myself to go looking into it again.
Boneheaded mistake on the new search - the server code required a user to be logged into the backend. Oops.
That works for me, but not so much for you. (Whoever you may be.)
RSS Middle Layer
I posted a few days ago about my hassle trying to figure out a FreshRSS extension before finally giving up.
The problem is there is one RSS feed I follow which keeps HTML entities in the titles of posts. So rather than "This isn't a bad example", I get "This isnXXX;t a bad example"
Today I wrote code which solves it by being a MITM script that fixes the text before feeding the URL to the RSS Reader. It feels like a silly solution, and the "right" way is definitely the integrated extension for FreshRSS, but when I can't get it to work it's time to go back to the next best working solution.
"The Monster-Slaying Game You Can Play Almost Anywhere"
A neat article that delves into the story of how Doom became the game which the world loves to run on any gadget that can.
Id had programmed Doom to be easily modifiable by players. Four years after its debut, the company took the radical step of releasing the game's source code to the public for noncommercial use; an international community of fans suddenly had access to the guts of the game, and could retrofit it to all kinds of hardware. "It was not only a gracious move but an ideological one — a leftist gesture that empowered the people and, in turn, loosened the grip of corporations," David Kushner wrote in his book "Masters of Doom."
Site search is live
Well, here it is. It's not perfect. But it's mine. I am particularly proud of the integration of my social posts from X, Bluesky, and Mastodon. The system auto updates my social posts from Mastodon and Bluesky nightly. X requires me to do a manual update process, which is fine as I don't post there almost at all anymore.
It doesn't yet handle pagination which I still need to do, but I've run out of steam for it tonight and it's completely usable without it.
I did manage some more work on the search for the blog last night, mostly fixing bugs and working on the front end. I also realized that while I needed to make pagination based searches, I also needed a way to determine the total number of pages in a search for the pagination, so figuring out how I would handle that took a bit.
Secondly, and perhaps embarrassingly, I finally spent time relearning branches and how to use them with git. As a solo developer, I don't make a lot of use of them, and I am trying to get better, especially when it comes to new features which touch a lot of things.
I plan to put more time into it tonight and hopefully get it to the launch point? We'll see.
Search update
I am still working on Glowbug's site search, I did some more programming for it last night. I've got the back end largely built, and the basics of the front end for the search interface, but still have more to do. And tonight is D&D, so possibly tomorrow I'll hammer it out and finish it. We'll see.
To Do:
- Finish display of matching social posts
- Pagination of search
- Anti spam/abuse protections
- Other things I've forgotten I need to do
After spending 30 minutes trying to troubleshoot adding a new extension to my selfhosted FreshRSS I finally abandoned it and just did a quick 30 second Userscript that does it client side with Javascript.
I don't know what is going on with the FreshRSS extension, but sometimes it isn't worth doing it right - I just want to fix my problem.
Adding Search
Tonight I started work on writing code to add a search function to this blog. However, not just posts on the blog, also posts I make on social media. So I wrote code for importing posts from Bluesky and Mastodon, the latter mainly for completeness as I don't post there much anymore. It imported my backlog and then I modified the same code to be usable for a nightly cron job.
The search itself is still something I'm wrestling with. Aside from the added sources of content, I am trying to figure out how to best do this.
It's no secret that search is complicated. Which makes this a fun mental challenge.
So I have the most basic parts done, and now it is the gritty details of adding logic for ordering these posts, as well as adding things like spam protection, caching, XSS protection, etc. And then it will be writing the client side code and display functionality.
I'd guess I'm like 30% done.... famous last words. We'll see.
Windows has its own 'Vim' (sort of)
It's definitely not vim. I'm just being snarky. But interesting to see how it does as it rolls out.
Testing to see if my blog posting to bluesky now properly handles links, like trickjarrett.com - as well as handle hashtags in copy: #programming
Update: It does!
Radar Charts
Okay, the radar in the previous post was generated out of my test code. Now comes the real test, integrating it into the blog itself... Let's see.
Here's my rating for the movie G20, that we watched last month.
Update: Tada! It works. I did have to go into the database and change some stuff, but cool to get it implemented in the blog. Now I can generate radar graphs in the back end of my blog.
Example COBOL Program
After coming across an article about the COBOL code used in government and banking, I decided to go see what its code looked like. It's, as expected, very old. And this code takes me back to my earliest days of programming, though I never wrote COBOL.
**********************************************************
* COBCALC *
* *
* A simple program that allows financial functions to *
* be performed using intrinsic functions. *
* *
**********************************************************
IDENTIFICATION DIVISION.
PROGRAM-ID. COBCALC.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 PARM-1.
05 CALL-FEEDBACK PIC XX.
01 FIELDS.
05 INPUT-1 PIC X(10).
01 INPUT-BUFFER-FIELDS.
05 BUFFER-PTR PIC 9.
05 BUFFER-DATA.
10 FILLER PIC X(10) VALUE "LOAN".
10 FILLER PIC X(10) VALUE "PVALUE".
10 FILLER PIC X(10) VALUE "pvalue".
10 FILLER PIC X(10) VALUE "END".
05 BUFFER-ARRAY REDEFINES BUFFER-DATA
OCCURS 4 TIMES
PIC X(10).
PROCEDURE DIVISION.
DISPLAY "CALC Begins." UPON CONSOLE.
MOVE 1 TO BUFFER-PTR.
MOVE SPACES TO INPUT-1.
* Keep processing data until END requested
PERFORM ACCEPT-INPUT UNTIL INPUT-1 EQUAL TO "END".
* END requested
DISPLAY "CALC Ends." UPON CONSOLE.
GOBACK.
* End of program.
*
* Accept input data from buffer
*
ACCEPT-INPUT.
MOVE BUFFER-ARRAY (BUFFER-PTR) TO INPUT-1.
ADD 1 BUFFER-PTR GIVING BUFFER-PTR.
* Allow input data to be in UPPER or lower case
EVALUATE FUNCTION UPPER-CASE(INPUT-1) CALC1
WHEN "END"
MOVE "END" TO INPUT-1
WHEN "LOAN"
PERFORM CALCULATE-LOAN
WHEN "PVALUE"
PERFORM CALCULATE-VALUE
WHEN OTHER
DISPLAY "Invalid input: " INPUT-1
END-EVALUATE.
*
* Calculate Loan via CALL to subprogram
*
CALCULATE-LOAN.
CALL "COBLOAN" USING CALL-FEEDBACK.
IF CALL-FEEDBACK IS NOT EQUAL "OK" THEN
DISPLAY "Call to COBLOAN Unsuccessful.".
*
* Calculate Present Value via CALL to subprogram
*
CALCULATE-VALUE.
CALL "COBVALU" USING CALL-FEEDBACK.
IF CALL-FEEDBACK IS NOT EQUAL "OK" THEN
DISPLAY "Call to COBVALU Unsuccessful.".
It seems my code yesterday broke the automated post function. Oops. I'll fix that tonight.
Edit: Was able to debug it remotely!
Small blog updates
Made some small blog updates today:
- I tweaked some small CSS display things which were bothering me.
- I removed the social links at the top for the platforms I don't use (X, Threads.)
- I've attempted to reintegrate my writing tracking into the end of day automated post. It's not quite as robust as it was, but this was meant to be quick and simple.
- Modified our url code to include the github user when it shows the github.com url after a link.
Update: One more idea I am messing with, but I like the idea of displaying my blog posts by day similar to the Github activity grid. I started messing around with it but it's a bit more complicated.
Update 2: Okay, the Github heatmap grid is now done. It's on the sidebar and will fill through the year, but also I have added it to the date archive page under each year header.
The Desk, my new writing tool
So, I have been working on something. This week, with the inspiration to dive back into my writing, I also whipped up this new project thanks to the help of Claude.ai. The idea is to have a central hub for tracking the progress of my writing, as I find the charts and data about my progress very motivating. But, as you'll see, it has some more features built in, including the ability for me to do my writing inside the tool if I want to.
It's not perfect, the AI generated code base always means there are bugs and pain points to be hunted down. But, it works for the base needs. I can refine and fix the remaining issues in the coming days.
Alright, let's take a look at things.
Here is the main dashboard. The red blobs are titles for my projects. I went back and forth on hiding them. Aside from suggesting the writing genre, I don't think they give anything major away, but also - I figured I may as well keep some mystery.
Right now I'm only actively working on the first project. The other four in the system are either ideas I have, or ones I have worked on previously and just haven't brought into the system yet.
The next view is the project specific one.
So, here is the project view for the current book. It gives the full overview of the data it has collected, shows how each writing session has gone, and even lets me look at previous versions of the story (so long as I am uploading them.)
I don't have to upload the manuscript, I can also manually enter the data for each writing session. But the advantage of uploading is that it acts as a backup in case something happens, and also allows the system to measure both words written as well as words removed from the most recent previous version. This is relevant as one of my pain points with a system like this is that sessions which were predominately editing, weren't easy to track as we were just tracking the total word counts, and so revisions, and cuts, and additions which come during editing were largely missed.
I'll also note, the first session here is misleading as I had done a few bits of writing on this project before importing it into the system and thus the first session is heavily inflated. But I didn't feel it was really worth diving into. It'll even out the more I write.
And the last feature, the one I am most happy with, is the in-browser writing tool.
Normally, I write using an app called FocusWriter, which blocks out all other apps and notifications and just lets you focus on writing. But, with the integration of my own selfhosted tool, I decided to recreate the base parts of it in browser.
Yep, retro CRT green on black. I don't know why, but I really like that scheme for writing. Additionally, I'm using the fantastic Monaspace Neon font, which is also my preferred font for programming. So far, it's been quite comfortable to write in.
That's really it. There are a few other small features (milestones are in the code, but not something I've fully implemented.) There are the rough corners I mentioned which still need addressing, but overall - I'm happy with the core functionality.
Previously I had my code integrated into Glowbug (this blog's admin tools), but it is very rough and barebones. Nowhere near as fleshed out as the above system. The main benefit was I could easily integrate it into the automated end of day posts where it would record the amount of writing I had done during a day.
I still can do that with this system, they're on the same system, but it will just take some reworking of the system. But I'm deciding what I want it to be and if I want to keep the same format, or maybe make the Sunday post a special edition with more information for writing from the past week, etc.
We'll see. I'm still deciding on the implementation. But now, back to writing for a bit.
Last night I finally sat down to resume work on the rewrite of a novel I've been working on. That interview with Sanderson left me feeling inspired and motivated. I was able to write almost 3,000 words. In addition, thanks to some help from Claude.ai, I was able to throw together a new tracker which I can use for recording progress on my writing.
I had a version of it that I had previously written and integrated with this blog, but the UI was very rough and I had some core feature updates I wanted. The biggest of which is now it more elegantly will record progress for both new writing and when I go back and edit to change things. The way it does this is I can now upload a copy of the document I'm working on, and it parses the file and compares it to the most recent version, counting new words and words removed.
I'll share more about it after I've been using it a bit longer, and I make sure it's all working how I want. This is the sort of project where I do think AI coding support is useful. It wasn't perfect and I've had to chase a few random bugs, but it is a promising new tool for me.
Glowbugging While Sick
I've been fighting a bug and slept the majority of the past two days. I'm back mostly functional today, but I can tell I'm still less than 100%.
One thing that came out of the past day was I managed to make progress on two things on the blog:
First, the tag specific archives now (partly) work. I haven't linked to them anywhere yet, that is still coming. I also added the ability for me to choose which tags get archives. The archives need a bit more tweaking, and I want to add pagination to the tags which are larger (for example, there are 200+ posts with the programming tag currently.) But we've made solid progress.
I also want to add the ability to do combined tags. For example, the system currently recognizes 'review' and then a medium such as 'tv', 'movie', 'book.' But that is hardcoded, and I will need to find a way to streamline making those into special archives, etc.
Second, I upgraded the admin-side search functionality of posts. It was previously very simple and now it includes logic for handling and/or/not, as well as more. I've found a few bugs still to work out but excited to have gotten this far.
So, it's progress.
Glowbug Tag Archives
Last night I began the work of adding tag based archives to the blog. For example, my "social post" tag is meant for me to use whenever I write a quick post here which is also sent out to my Bluesky and Mastodon accounts. For that tag specifically the idea is you could have this page bookmarked and basically get a (somewhat) complete feed of my social posts.
The functionality also lays the groundwork for an eventual "photolog" view, where you'd just see a page which are photo posts I made where the photo is the focus.
The functionality has a lot of benefits, and it's been on the backlog for years. I've never gotten around to it. And, the reality is. It isn't complex to add, there isn't a lot of new logic needed. The work breaks down to:
- Create the template file
- Add a section to the publish code which does the actual publishing and making of files
- Add tag archive links to the archive page
- Add administration tools for selecting which tags get their own archives
There's obviously more to each step, but that is generally the process.
So, step one. The template is very similar to what I use for the date archives. I just made a few small tweaks and introduced a new template tag for placing the tag name on the page. So the top can say "Posts tagged: [Insert tag]".
Check. Easy.
Step two, adding the section to publishing. This should also be fairly easy, it's basically the same code as I use for date archives. Except... something isn't right. I copied the Dates archive section and went through to modify it. And then when I began testing it wasn't working. I tried to bugfix it for about an hour and couldn't find where my error was. I rolled it back and stopped there for the night.
So, we're on the cusp of adding that functionality to the blog. I'll get back to it tonight, likely. But, not there yet.




