Clojure for SRCC

11 August 2025

For our local art collective, Susquehanna River Creative Collective (SRCC), I setup some Raspberry PIs connected to televisions to display our flyers advertising benefits of membership and upcoming events.

Initial Setup for Displays

The machines are behind a firewall and running on a read-only overlay filesystem for resiliency, so I had the machines periodically pull the event images from the website, and I can change out the images on the website any time.

This was all done with desktop autostart scripts and cron for quite some time, but eventually, we needed more control.

The New Setup for Displays

We wanted to have different sets of images and to be able to choose them. For a show, we may want to only show the logo, while other times might call for all the normal advertisements.

The machines have no keyboards or mice, so they needed to be controlled by a web browser. I also don’t know if they’ll start up on the same IP addresses, so I needed a bit of Javascript in a static place to have the browser search and find running slide servers.

The service on each machine now runs as a babashka script that starts upon automatic login. It pulls new images from the website and from a Google Drive, periodically refreshes them, and starts Eye of Mate (eom) to run the slide show.

The babashka script also starts a small web server on http-kit to let us to choose image sets and to trigger a refresh of the images. http-kit is provided by default in babashka.

Updating the Website with More Clojure Code and AI

The SRCC website is a static site built with Hugo, so I add all the events to it via an image or 2 and some YAML. It’s hard to train another normal person to do this stuff, so the responsibility fell exclusively on me. I scripted it up with some bash, but that’s still only accessible to me.

Finally, I’ve been coding all Clojure code for the past couple weeks, and I’ve started playing with Gemini CLI to see what it can do with some Clojure code.

I now have a web form available to allow others to create events for the website, and it interacts with git for publishing to the Hugo site.

The service is deployed on my normal Linux servers as a container run by podman kube play and systemd quadlet.

I can direct Gemini to make changes or add features, and I review the code, ask for corrections or just make updates myself. It’s kind of like pair programming with someone who’s really good at Googling answers and jumping to some (mostly) useful conclusions. Having the AI agent has helped maintain some momentum and saved me jumping down some deep rabbit holes before I needed. I’m asking it for small changes and iterating, not trying to get it to do everything in one shot.

Gemini’s CLI interface makes it easy to switch to another project directory and let it try some stuff on lots of my projects recently.

I had also played with Claude CLI for a day, but Gemini’s free tier is proving capable enough for me so far.


Scaling for Small Displays

13 August 2024

I bought a very small laptop to use with radio work in the field, and the screen resolution is a bit small (1366x768). Pair the small display with current desktop environments' tendency toward chunky, touch-friendly interfaces, and it doesn’t allow one to cram much on the screen.

My desktop environment is Gnome, so I slimmed it down with some stylesheets:

headerbar {
  margin: 0 1em 0 1em;
  padding-top: 0;
  padding-bottom: 0;
  border-width: 0px;
  font-size: 12pt;
  min-height: 0px;
}

headerbar * {
  margin: 0;
  padding-top: 0;
  padding-bottom: 0;
  border-radius: 0;
  border-width: 0px;
  min-height: 0px;
}

headerbar box {
  padding: 0.1em 0.5em 0.1em 0.5em;
}

WSJT-X is a QT app, so I scaled the fonts there to make everything fit better by setting the DPI in a launch script:

#!/bin/sh

export QT_FONT_DPI=75
/usr/bin/wsjtx


Wireless Drops on Pop OS 20.10 and Later

12 July 2021

Upon the release of Pop OS 20.10, my System76 laptop and my Arris router started having some disagreements. The laptop would drop connection every couple hours and not reconnect itself. I’d see the little question mark in the WIFI indicator, and I needed to manually turn WIFI off and back on to restore the connection.

I found mentions of this behavior in Ubuntu and in Pop OS forums, and supposedly newer NetworkManager from Gnome would fix it, so I suffered and waited for the beta of Pop OS 21.04 to be available. That didn’t fix it, so I started digging around some more in System76’s page for Troubleshooting Wireless.

I picked my way through the tips and applied some of them. Disabling band steering in the router finally seems to have fixed the problem. I’ve kept my WIFI connection up and running for days now. I didn’t need to name the 5GHz and 2.4GHz networks differently.


Google Apps on Kindle Fire Tablet

28 June 2016

Ben’s birthday is approaching, so I picked up the inexpensive Amazon Fire Tablet from 2015. It’s running FireOS 5.1.x.

He played with it running stock for a week or so, using it to mostly read library books, and of course, to play some games from the Amazon Appstore.

Reading was the main purpose to have the tablet, but I also wanted it for communication and organization. That means getting the Google Apps installed on it. The only things available in the Amazon Appstore were these shell apps that were nothing more than a wrapper aronud a web pane, so I needed to proceed to install the Google Play framework and app store.

Before even buying the tablet, I had found some links, so I was pretty sure it could be done. I started with a post on XDA which got me the link to an all-in-one ZIP of everything I’d need.

It came with the APK files and directions to run a Windows BAT file, which obviously isn’t going to happen on any machine I have, so I cracked open the BAT, and followed the script running the important bits by hand:

  • Login to the tablet as the original login — Ben’s secondary login didn’t work.

  • Enable Developer Options — Settings → Device Options → tap serial number serveral times, and the Developer Options will appear.

  • Enable USB Debugging — Settings → Device Options → Developer Options → Enable ADB to Enabled

  • Enable Side Loading — Settings → Device Options → Developer Options → Enable Untrusted Sources

  • I was on a Mac, so the USB drivers were already good, and I had Android Developer Tools already installed.

  • Unpack the all-in-one ZIP.

  • Run the commands at the shell:

    # see that tablet device is listed
    adb devices
    adb install com.google.android.gms-6.6.03_\(1681564-036\)-6603036-minAPI9.apk
    adb install GoogleLoginService.apk
    adb install GoogleServicesFramework.apk
    adb shell pm grant com.google.android.gms android.permission.INTERACT_ACROSS_USERS
    adb install com.android.vending-5.9.12-80391200-minAPI9.apk
    
    # disable ads on cheap tablet, though I already paid to have it disabled.
    adb shell pm hide com.amazon.kindle.kso

After those couple commands, I found I had the Play Store icon, and fired it up, did the Play Services upgrade, and started installing the Gmail, Calendar, Hangouts, and Keep. I did find Inbox would crash after setup, but Gmail was fine.


All the Posts

August 2025

August 2024

July 2021

June 2016