Published: Aug 22, 2024 by Isaac Johnson
Today we’ll do a quick look at a couple of Open-Source tools that have been on my list to check out; Commafeed and TiddlyWiki. The first, Commafeed is a simple container-based RSS/Feed reader that can run as a single container. I take a moment to convert that to a Kubernetes manifest and host it showing how it works and how to add users.
With TiddlyWiki, it has a desktop client we’ll look at in WSL as well as Windows and compare the look and feel. I didn’t understand this tool at first, but now I find it really clever. It’s building a self-contained HTML wiki (single HTML file) that can be updated in the client or just in a browser (albeit you have to save it yourself).
Let’s dig in.
CommaFeed
I saw an article on MariusHosting on adding CommaFeed to a NAS
From the Docker hub docs we can see a one-liner:
$ docker run --name commafeed --detach --publish 8082:8082 --restart unless-stopped --volume /path/to/commafeed/db:/commafeed/data --memory 256M athou/commafeed:latest-h2
Or Docker-compose
services:
commafeed:
image: athou/commafeed:latest-h2
restart: unless-stopped
volumes:
- /path/to/commafeed/db:/commafeed/data
deploy:
resources:
limits:
memory: 256M
ports:
- 8082:8082
That can be turned into a Kubernetes YAML manifest
apiVersion: apps/v1
kind: Deployment
metadata:
name: commafeed
spec:
replicas: 1
selector:
matchLabels:
app: commafeed
template:
metadata:
labels:
app: commafeed
spec:
containers:
- name: commafeed
image: athou/commafeed:latest-h2
ports:
- containerPort: 8082
volumeMounts:
- name: commafeed-data
mountPath: /commafeed/data
volumes:
- name: commafeed-data
persistentVolumeClaim:
claimName: commafeed-pvc
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: commafeed-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi # Adjust storage size as needed
---
apiVersion: v1
kind: Service
metadata:
name: commafeed-service
spec:
selector:
app: commafeed
ports:
- protocol: TCP
port: 80
targetPort: 8082
type: ClusterIP
I’ll now install it
isaac.johnson@WS-P262MXQFLV 2024-08-miscapps % kubectl apply -f ./commafeed.yaml -n commafeed
deployment.apps/commafeed created
persistentvolumeclaim/commafeed-pvc unchanged
service/commafeed-service unchanged
Which came up
isaac.johnson@WS-P262MXQFLV 2024-08-miscapps % kubectl get pods -n commafeed
NAME READY STATUS RESTARTS AGE
commafeed-7797fddbf4-6w55g 1/1 Running 0 10m
I can then port-forward to test
isaac.johnson@WS-P262MXQFLV 2024-08-miscapps % kubectl port-forward svc/commafeed-service -n commafeed 8888:80
Forwarding from 127.0.0.1:8888 -> 8082
Forwarding from [::1]:8888 -> 8082
Handling connection for 8888
Handling connection for 8888
Handling connection for 8888
We can login with the default admin
login and admin
for password
I’ll want to change that password. To do so, go to our settings
There we can go to the profile tab and change our email and password
Next, I’ll subscribe to a feed. Why not our own? We can click the “+” to add a feed and type in the URL
I can then change the name and click subscribe
I can now see the feeds with the last 10 blog posts
I can then just click the heading and read the blog post inline
Users
If we wish to use something other than admin, or add more users, we can go to “Manage users” under the admin user profile, then click “+” to add a user
I’ll make an isaac
user this time
When I log back in with that user, we can see the username in the upper right and that I still have admin powers
Ingress
This seems like a pretty solid app. Let’s expose it with a TLS ingress
I need to make an A Record. Today I’ll use GCP CloudDNS
$ gcloud dns --project=myanthosproject2 record-sets create commafeed.steeped.space --zone="steepedspace" --type="A" --ttl="300" --rrdatas="75.73.224.240"
NAME TYPE TTL DATA
commafeed.steeped.space. A 300 75.73.224.240
I can then create the Ingress YAML with the CloudDNS Cluster Issuer and apply it
$ cat commafeedingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
cert-manager.io/cluster-issuer: gcpleprod2
ingress.kubernetes.io/proxy-body-size: "0"
kubernetes.io/ingress.class: nginx
kubernetes.io/tls-acme: "true"
nginx.ingress.kubernetes.io/proxy-body-size: "0"
nginx.ingress.kubernetes.io/proxy-read-timeout: "3600"
nginx.ingress.kubernetes.io/proxy-send-timeout: "3600"
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.org/client-max-body-size: "0"
nginx.org/proxy-connect-timeout: "3600"
nginx.org/proxy-read-timeout: "3600"
nginx.org/websocket-services: commafeed-service
name: commafeedingress
namespace: commafeed
spec:
rules:
- host: commafeed.steeped.space
http:
paths:
- backend:
service:
name: commafeed-service
port:
number: 80
path: /
pathType: ImplementationSpecific
tls:
- hosts:
- commafeed.steeped.space
secretName: commafeed-tls
$ kubectl apply -f ./commafeedingress.yaml
ingress.networking.k8s.io/commafeedingress created
Soon I see the cert issued
builder@LuiGi:~/Workspaces/jekyll-blog$ kubectl get cert -n commafeed
NAME READY SECRET AGE
commafeed-tls False commafeed-tls 45s
builder@LuiGi:~/Workspaces/jekyll-blog$ kubectl get cert -n commafeed
NAME READY SECRET AGE
commafeed-tls True commafeed-tls 3m8s
I can now login to commafeed.steeped.space and access my feeds
Tiddly Wiki
I saw a post on the NewStack about TiddlyWiki
I was interested in checking out the Desktop client in both WSL and Windows.
We can go to releases and download a client. Here I’ll use the 20th release and download it to WSL
I can then unzip it
builder@LuiGi:~/Workspaces/TiddlyWiki$ unzip tiddlydesktop-linux64-v0.0.20.zip
Archive: tiddlydesktop-linux64-v0.0.20.zip
creating: TiddlyDesktop-linux64-v0.0.20/
creating: TiddlyDesktop-linux64-v0.0.20/pnacl/
inflating: TiddlyDesktop-linux64-v0.0.20/pnacl/pnacl_public_x86_64_pnacl_sz_nexe
inflating: TiddlyDesktop-linux64-v0.0.20/pnacl/pnacl_public_x86_64_libpnacl_irt_shim_a
inflating: TiddlyDesktop-linux64-v0.0.20/pnacl/pnacl_public_x86_64_crtbegin_o
inflating: TiddlyDesktop-linux64-v0.0.20/pnacl/pnacl_public_pnacl_json
inflating: TiddlyDesktop-linux64-v0.0.20/pnacl/pnacl_public_x86_64_crtend_o
inflating: TiddlyDesktop-linux64-v0.0.20/pnacl/pnacl_public_x86_64_pnacl_llc_nexe
inflating: TiddlyDesktop-linux64-v0.0.20/pnacl/pnacl_public_x86_64_crtbegin_for_eh_o
inflating: TiddlyDesktop-linux64-v0.0.20/pnacl/pnacl_public_x86_64_libcrt_platform_a
inflating: TiddlyDesktop-linux64-v0.0.20/pnacl/pnacl_public_x86_64_libgcc_a
inflating: TiddlyDesktop-linux64-v0.0.20/pnacl/pnacl_public_x86_64_ld_nexe
inflating: TiddlyDesktop-linux64-v0.0.20/pnacl/pnacl_public_x86_64_libpnacl_irt_shim_dummy_a
inflating: TiddlyDesktop-linux64-v0.0.20/credits.html
... snip ...
In order to run, I needed some missing packages install, like libnss3
$ sudo apt update && sudo apt install libnss3-dev libgdk-pixbuf2.0-dev libgtk-3-dev libxss-dev
I could then run it (./nw
)
I’ll start by creating a new wiki
This prompts me to save a file which I’ll do so back in Windows space
I then had two windows up for this Wiki
I’m going to pivot to a Windows client which I installed to see how it compares
Windows was quite suspicious of the file
I opened the saved TiddlyWiki I had made earlier. It looked very HTML 1.0
I decided to create a new one (this time picking Pre-release)
This looks much better
I’ll create a new Tiddler and add some Wiki code to it
And I can see it rendered when I click the checkbox to save
What is really nice is that the HTML file it is saving is completed readable in a browser
The difference is that if you edit things then “save” just downloads a fresh HTML file which would be up to you to save somewhere
Summary
We took a quick look at two good OS tools: commafeed and tiddlywiki. They are both quite nice for what they do. I’ll likely use my Commafeed like a self-hosted Google Reader and I’ll want more time to play with TiddlyWiki to see if I keep it over some of my other Wiki tooling.