OS Apps: Commafeed, TiddlyWiki

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

/content/images/2024/08/commafeed-01.png

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

/content/images/2024/08/commafeed-02.png

There we can go to the profile tab and change our email and password

/content/images/2024/08/commafeed-03.png

Next, I’ll subscribe to a feed. Why not our own? We can click the “+” to add a feed and type in the URL

/content/images/2024/08/commafeed-04.png

I can then change the name and click subscribe

/content/images/2024/08/commafeed-05.png

I can now see the feeds with the last 10 blog posts

/content/images/2024/08/commafeed-06.png

I can then just click the heading and read the blog post inline

/content/images/2024/08/commafeed-07.png

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

/content/images/2024/08/commafeed-08.png

I’ll make an isaac user this time

/content/images/2024/08/commafeed-09.png

When I log back in with that user, we can see the username in the upper right and that I still have admin powers

/content/images/2024/08/commafeed-10.png

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

/content/images/2024/08/commafeed-11.png

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

/content/images/2024/08/tiddlywiki-01.png

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)

/content/images/2024/08/tiddlywiki-02.png

I’ll start by creating a new wiki

/content/images/2024/08/tiddlywiki-03.png

This prompts me to save a file which I’ll do so back in Windows space

/content/images/2024/08/tiddlywiki-04.png

I then had two windows up for this Wiki

/content/images/2024/08/tiddlywiki-05.png

I’m going to pivot to a Windows client which I installed to see how it compares

Windows was quite suspicious of the file

/content/images/2024/08/tiddlywiki-06.png

I opened the saved TiddlyWiki I had made earlier. It looked very HTML 1.0

/content/images/2024/08/tiddlywiki-07.png

I decided to create a new one (this time picking Pre-release)

This looks much better

/content/images/2024/08/tiddlywiki-08.png

I’ll create a new Tiddler and add some Wiki code to it

/content/images/2024/08/tiddlywiki-09.png

And I can see it rendered when I click the checkbox to save

/content/images/2024/08/tiddlywiki-10.png

What is really nice is that the HTML file it is saving is completed readable in a browser

/content/images/2024/08/tiddlywiki-11.png

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

/content/images/2024/08/tiddlywiki-12.png

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.

Kubernetes Containers TiddlyWiki Commafeed

Have something to add? Feedback? You can use the feedback form

Isaac Johnson

Isaac Johnson

Cloud Solutions Architect

Isaac is a CSA and DevOps engineer who focuses on cloud migrations and devops processes. He also is a dad to three wonderful daughters (hence the references to Princess King sprinkled throughout the blog).

Theme built by C.S. Rhymes