Home Lab Chorin Part 2

Published: Aug 7, 2025 by Isaac Johnson

When I setup CoreControl a few weeks ago as part of the Chorin post, I realized how many abandoned workloads and ingress’s I was maintaining. This happens when you run a Home Lab for several years.

Many apps have made the cut and I use often, some need updates and other just removal.

Today we’ll review those. I’ll look at some GIT apps such as OneDev, Gitness (Harness), utility apps likeAirstation and Smokeping and lastly do a big of digging on Dokemon.

GIT apps

I use a combination of Gitea and Forgejo as my in-home GIT solution. You can read about those in

One I’ve had for some time but I really didn’t use is OneDev. The pricing was fine for EE but I just didn’t find a need for it.

I might argue this is very much an Azure DevOps play in that we have CICD Builds

/content/images/2025/08/onedev-01.png

Issue management with Boards

/content/images/2025/08/onedev-02.png

And artifact management very much like Azure Artifacts (but with container support)

/content/images/2025/08/onedev-03.png

But there are a few features they lock out of the Community Edition like time management

/content/images/2025/08/onedev-04.png

I mean, this is a good suite and I’ve been running version 11.5.3 since we wrote about OneDev in 2024.

Upgrading OneDev

Let’s try upgrading OneDev first with helm

builder@LuiGi:~/Workspaces/jekyll-blog$ helm list -n onedev
NAME    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION
onedev  onedev          2               2024-11-24 07:23:38.444282758 -0600 CST deployed        onedev-11.5.3   11.5.3
builder@LuiGi:~/Workspaces/jekyll-blog$ helm upgrade onedev -n onedev onedev/onedev
Release "onedev" has been upgraded. Happy Helming!
NAME: onedev
LAST DEPLOYED: Thu Jul 31 10:26:18 2025
NAMESPACE: onedev
STATUS: deployed
REVISION: 3
TEST SUITE: None
NOTES:
CHART NAME: onedev
CHART VERSION: 11.9.0
APP VERSION: 11.9.0
###################################################################
#
# CAUTION: If you are upgrading from version <= 9.0.0, please make
# sure to follow https://docs.onedev.io/upgrade-guide/deploy-to-k8s
# to migrate your data
#
###################################################################

** Please be patient while the chart is being deployed **

Get the OneDev URL by running:

  kubectl port-forward --namespace onedev svc/onedev 6610:80 &

  URL: http://127.0.0.1:6610
builder@LuiGi:~/Workspaces/jekyll-blog$ helm list -n onedev
NAME    NAMESPACE       REVISION        UPDATED                                 STATUS          CHART           APP VERSION
onedev  onedev          3               2025-07-31 10:26:18.049304707 -0500 CDT deployed        onedev-11.9.0   11.9.0

Right after upgrading, I see a pod up

$ kubectl get po -n onedev
NAME       READY   STATUS    RESTARTS   AGE
onedev-0   1/1     Running   0          58s

I see a 502 error at launch

The pod is up

$ kubectl get po -n onedev -l app.kubernetes.io/instance=onedev,app.kubernetes.io/managed-by=Helm,app.kubernetes.io/name=onedev
NAME       READY   STATUS    RESTARTS   AGE
onedev-0   1/1     Running   0          2m38s

But moments later the site was live again. Logging in presents me a page of “Incompatibilities”

/content/images/2025/08/onedev-05.png

11.8.0
Query Syntax
Multiple order by clauses now connects via , instead of and
Pull request status criteria of form "Status" is "<name>" is removed, use open, merged, or discarded instead
Build status criteria of form "Status" is "<name>" is removed, use respective status criteria instead, such as successful, failed, running
In case these changes prevent you accessing the dashboard, suffix the url with ?failsafe=true to access the dashboard without rendering, and then edit settings of relevant widget to fix the queries

Issue
Custom field type Working Period is removed, as it depends on time tracking setting which is a EE feature. Existing working period fields will be converted to integer fields with value set to number of minutes

Build Spec
Build spec param type Working Period is removed for same reason as above. Existing working period params will be converted to integer params

11.6.12
RESTful API
The ability to edit existing user authorization is removed as any project owner can use it to remove authorization of other projects

11.6.10
RESTful API
Format of contributed project settings inside project settings (refer to endpoint to get and set project settings) has been changed
Format of contributed administration settings (refer to endpoint to get and set contributed administration settings) has been changed
11.6.6
Incoming box settings of various mail services removed additional target addresses for simplicity reason. Configure mail relay/forward at mail server side if you are using this feature previously

11.6.0
SQL Server support is removed due to added complexity and inability to test with full version. If you are using SQL Server, please switch to use MySQL/PostgreSQL/MariaDB

However, once dismissed, the code and history were present

/content/images/2025/08/onedev-06.png

More Cleanups

What about all the containers that have no ingress on my primary docker host?

/content/images/2025/08/cleanup-01.png

Definitely not used

Let’s clear out some definitely unused tools. For instance, Airstation.tpk.pw actually runs on my Ryzen9 mini PC so the one on Dockerhost T-100 is totally unused.

builder@builder-T100:~/airstation$ docker compose down
WARN[0000] The "AIRSTATION_PLAYER_TITLE" variable is not set. Defaulting to a blank string. 
[+] Running 2/2
 ✔ Container airstation-app-1  Removed                                                                                                                                                                                                                                                                            0.4s 
 ✔ Network airstation_default  Removed                                                                                                                                                                                                                                                                            0.2s 
builder@builder-T100:~/airstation$ docker compose rm
WARN[0000] The "AIRSTATION_PLAYER_TITLE" variable is not set. Defaulting to a blank string. 
No stopped containers

Smokeping is an interesting tool in that it just pings out and keeps track of our latency over time we wrote about in May

/content/images/2025/08/smokeping-01.png

And sometimes it’s good to see if our internet is bad because of us or some external system

/content/images/2025/08/smokeping-02.png

But isn’t that for what we use Downdetector?

There have been some big updates to Smokeping as they moved to release 2.9.0.

But now that I’m really looking, I realize I’m actually running this in K8s now at https://smokeping.tpk.pw/ so the Docker Host version is unused.

So let’s clean that up

builder@builder-T100:~$ docker ps | grep smoke
f3989c434dbd   lscr.io/linuxserver/smokeping:latest                             "/init"                  2 months ago    Up 5 weeks             0.0.0.0:8099->80/tcp, :::8099->80/tcp                                              smokeping
builder@builder-T100:~$ docker stop smokeping
smokeping
builder@builder-T100:~$ docker rm smokeping
smokeping

OpenWebUI

I was reminded that the OpenWebUI on the Dockerhost

/content/images/2025/08/openwebui-01.png

was just a webui around the Ollama on my Ryzen9 box

$ docker inspect open-webui | grep -A 10 '"Env"'
            "Env": [
                "OLLAMA_BASE_URL=http://192.168.1.143:11434",
                "PATH=/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "LANG=C.UTF-8",
                "GPG_KEY=A035C8C19219BA821ECEA86B64E628F8D684696D",
                "PYTHON_VERSION=3.11.11",
                "PYTHON_SHA256=2a9920c7a0cd236de33644ed980a13cbbc21058bfdc528febb6081575ed73be3",
                "ENV=prod",
                "PORT=8080",
                "USE_OLLAMA_DOCKER=false",
                "USE_CUDA_DOCKER=false",

Gitness

I wrote about Gitness from Harness.io back in Oct 2023.

But now https://gitness.com/ just redirects to “Harness Open-Source”.

It appears that in Oct 2024 the rebranded the whole thing as Harness Open-Source.

If we look back at my 2023 article, we can see we launched it as

docker run -d \
  -p 3000:3000 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /tmp/gitness:/data \
  --name gitness \
  --restart always \
  harness/gitness

The new(er) Open-Source is launched with docker in a really similar fashion

docker run -d \
  -p 3000:3000 -p 3022:3022 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /tmp/harness:/data \
  --name opensource \
  --restart always \
  harness/harness

And if we want to do the HTTPS SSL forwarding I often do with K8s, we can pass the URL Base into the docker invokation

docker run -d \
  -e GITNESS_URL_BASE=https://harness.tpk.pw \
  -p 3000:3000 -p 3022:3022 \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v /mnt/harness-data:/data \
  --name harness-opensource \
  --restart always \
  harness/harness

I am interested in checking out Harness “Open Source” but until then, let’s delete this old unused “gitness” as they clearly sidelined it as a separate offering.

builder@builder-T100:~$ docker ps | grep gitness
5bcb5bf109cc   harness/gitness                                                  "/app/gitness server"    19 months ago   Up 5 weeks             3001/tcp, 0.0.0.0:3333->3000/tcp, :::3333->3000/tcp  

builder@builder-T100:~$ docker stop gitness
gitness
builder@builder-T100:~$ docker rm gitness
gitness

Dokemon

I wrote about Dokemon and Firefly back in Jan 2024. As I recall, it was a pretty nifty Docker monitoring offering.

However, there have been no updates since 2025 and the dockemon.dev site has been taken over by a spammer. The “ProductiveApps.com” site which is the home of several projects times out on cloudflare and there have been no updates to any of that group or persons apps in a while.

Actually, I find this interesting - the wayback archive shows an Indian-based contact number (+91 7208483359) which was serviced by Tata Docom. Their former LinkedIn page rings unavailable too.

I cannot tell who owns the domain, but Whois suggests they have had it since 2005. I think it was created and supported by Salil Ponde who has a pretty rich LinkedIn.

I’m curious enough I plan to reach out and ask…

Update: I did speak with Salil and this was a project from some time ago when he was between jobs but he has not kept it going since

In the meantime, I found it useful in helping me find and remove old unused images by using the “Images” page

/content/images/2025/08/dokemon-01.png

Because this app is open-source and typescript, it should be easy to use Gemini CLI to update it with some features I would like - like sortable columns and search

/content/images/2025/08/dokemon-02.png

It did the work and even cleaned up issues found with eslint using Node 20 (lts/iron)

/content/images/2025/08/dokemon-03.png

I’ll test the changes by building the server

builder@DESKTOP-QADGF36:~/Workspaces/dokemon$ docker build -t harbor.freshbrewed.science/freshbrewedprivate/dokemon:update1 -f Dockerfile.server .
[+] Building 104.4s (43/43) FINISHED                                                                                                docker:default
 => [internal] load build definition from Dockerfile.server                                                                                   0.1s
 => => transferring dockerfile: 2.33kB                                                                                                        0.0s
 => resolve image config for docker-image://docker.io/docker/dockerfile:1                                                                     1.2s
 => [auth] docker/dockerfile:pull token for registry-1.docker.io                                                                              0.0s
 => docker-image://docker.io/docker/dockerfile:1@sha256:9857836c9ee4268391bb5b09f9f157f3c91bb15821bb77969642813b0d00518d                      1.5s
 => => resolve docker.io/docker/dockerfile:1@sha256:9857836c9ee4268391bb5b09f9f157f3c91bb15821bb77969642813b0d00518d                          0.0s
 => => sha256:9857836c9ee4268391bb5b09f9f157f3c91bb15821bb77969642813b0d00518d 8.40kB / 8.40kB                                                0.0s
 => => sha256:176b5004df55ffa561c121dd12c0fad3ffe3c014318721c3c3d566008ce2627a 850B / 850B                                                    0.0s
 => => sha256:a7a871c4f80fb0fd80a56efe8fc598eefc7be2ff7d36af617a31da498c779c68 1.26kB / 1.26kB                                                0.0s
 => => sha256:724f0f61ffc85cf6ad0032c9063f7a74cd6d3590fd1138154820556e0a92073b 13.16MB / 13.16MB                                              0.7s
 => => extracting sha256:724f0f61ffc85cf6ad0032c9063f7a74cd6d3590fd1138154820556e0a92073b                                                     0.5s
 => [internal] load metadata for docker.io/library/node:18-alpine                                                                             0.4s
 => [internal] load metadata for docker.io/library/golang:1.21                                                                                0.9s
 => [internal] load metadata for gcr.io/distroless/base-debian11:latest                                                                       1.1s
 => [auth] library/node:pull token for registry-1.docker.io                                                                                   0.0s
 => [auth] library/golang:pull token for registry-1.docker.io                                                                                 0.0s
 => [internal] load .dockerignore                                                                                                             0.3s
 => => transferring context: 2B                                                                                                               0.0s
 => [build-stage  1/17] FROM docker.io/library/golang:1.21@sha256:4746d26432a9117a5f58e95cb9f954ddf0de128e9d5816886514199316e4a2fb           41.7s
 => => resolve docker.io/library/golang:1.21@sha256:4746d26432a9117a5f58e95cb9f954ddf0de128e9d5816886514199316e4a2fb                          0.0s
 => => sha256:4746d26432a9117a5f58e95cb9f954ddf0de128e9d5816886514199316e4a2fb 9.75kB / 9.75kB                                                0.0s
 => => sha256:6ed93aa58a52c9abc1ee472f1ac74b73d3adcccc2c30744498fd5f14f3f5d22c 64.14MB / 64.14MB                                              6.3s
 => => sha256:e6ba96dde4af9f4e06caba475fa65e94e4c54fe4aa3e9f4f504c02178eb8934e 2.32kB / 2.32kB                                                0.0s
 => => sha256:246ea1ed9cdb1164bb5cb7e1f45d7914b98c6d9418c8e1cc443105e820bbd9d1 2.82kB / 2.82kB                                                0.0s
 => => sha256:903681d87777d28dc56866a07a2774c3fd5bf65fd734b24c9d0ecd9a13c9f636 49.55MB / 49.55MB                                              5.5s
 => => sha256:3cbbe86a28c2f6b3c3e0e8c6dcfba369e1ea656cf8daf69be789e0fe2105982b 24.05MB / 24.05MB                                              2.8s
 => => sha256:1f46bd02dde39f0741d70614fc607bf03c1a0cd60d52e7dd06c44f8fb9358709 92.23MB / 92.23MB                                             10.1s
 => => sha256:54bf7053e2d96c2c7f4637ad7580bd64345b3c9fabb163e1fdb8894aea8a9af0 67.01MB / 67.01MB                                             10.1s
 => => extracting sha256:903681d87777d28dc56866a07a2774c3fd5bf65fd734b24c9d0ecd9a13c9f636                                                     6.4s
 => => sha256:532d43a0bc41875119c835fd75616e87d5df2a3714ddea3a0b5a68c7c5982649 126B / 126B                                                    6.5s
 => => sha256:4f4fb700ef54461cfa02571ae0db9a0dc1e0cdb5577484a6d75e68dc38e8acc1 32B / 32B                                                      6.7s
 => => extracting sha256:3cbbe86a28c2f6b3c3e0e8c6dcfba369e1ea656cf8daf69be789e0fe2105982b                                                     1.5s
 => => extracting sha256:6ed93aa58a52c9abc1ee472f1ac74b73d3adcccc2c30744498fd5f14f3f5d22c                                                     6.8s
 => => extracting sha256:1f46bd02dde39f0741d70614fc607bf03c1a0cd60d52e7dd06c44f8fb9358709                                                     6.6s
 => => extracting sha256:54bf7053e2d96c2c7f4637ad7580bd64345b3c9fabb163e1fdb8894aea8a9af0                                                     9.9s
 => => extracting sha256:532d43a0bc41875119c835fd75616e87d5df2a3714ddea3a0b5a68c7c5982649                                                     0.0s
 => => extracting sha256:4f4fb700ef54461cfa02571ae0db9a0dc1e0cdb5577484a6d75e68dc38e8acc1                                                     0.0s
 => [build-release-stage 1/6] FROM gcr.io/distroless/base-debian11:latest@sha256:ac69aa622ea5dcbca0803ca877d47d069f51bd4282d5c96977e0390d7d  14.6s
 => => resolve gcr.io/distroless/base-debian11:latest@sha256:ac69aa622ea5dcbca0803ca877d47d069f51bd4282d5c96977e0390d7d256455                 0.0s
 => => sha256:2eebbdaceeec718d203fd32370a1c1960b7d9d550d6acb1bca4957ab8560e3fb 2.42kB / 2.42kB                                                0.0s
 => => sha256:ac69aa622ea5dcbca0803ca877d47d069f51bd4282d5c96977e0390d7d256455 1.51kB / 1.51kB                                                0.0s
 => => sha256:2a6de77407bff82fecc48d028fde7b88366509bffff4337d0e809db77ccfdbe3 1.81kB / 1.81kB                                                0.0s
 => => sha256:83f8d4690e1f293d0438aef7d1075e590ce77fdec97bb4d90b1d227aeba343fd 5.85MB / 5.85MB                                                7.9s
 => => extracting sha256:83f8d4690e1f293d0438aef7d1075e590ce77fdec97bb4d90b1d227aeba343fd                                                     4.7s
 => => sha256:a4ba90834fb4abf3d80bbdaaaef36560ab1bb682f5279d44114d768e119639b9 2.06MB / 2.06MB                                                8.5s
 => => sha256:df368711b36276ed02b2040d3e3296b919042d2a05a2bbe9f758e708436c12cf 968.57kB / 968.57kB                                            9.0s
 => => extracting sha256:a4ba90834fb4abf3d80bbdaaaef36560ab1bb682f5279d44114d768e119639b9                                                     0.1s
 => => extracting sha256:df368711b36276ed02b2040d3e3296b919042d2a05a2bbe9f758e708436c12cf                                                     0.1s
 => [internal] load build context                                                                                                            12.3s
 => => transferring context: 251.25MB                                                                                                         8.6s
 => CACHED [base 1/1] FROM docker.io/library/node:18-alpine@sha256:8d6421d663b4c28fd3ebc498332f249011d118945588d0a35cb9bc4b8ca09d9e           0.0s
 => [deps 1/4] RUN apk add --no-cache libc6-compat                                                                                           12.3s
 => [deps 2/4] WORKDIR /app                                                                                                                   0.9s
 => [deps 3/4] COPY web/package.json web/yarn.lock* web/package-lock.json* web/pnpm-lock.yaml* ./                                             0.6s
 => [deps 4/4] RUN   if [ -f yarn.lock ]; then yarn --frozen-lockfile;   elif [ -f package-lock.json ]; then npm ci;   elif [ -f pnpm-lock.  19.6s
 => CACHED [react-builder 1/4] WORKDIR /app                                                                                                   0.6s
 => [react-builder 2/4] COPY --from=deps /app/node_modules ./node_modules                                                                     7.1s
 => [build-stage  2/17] RUN go install github.com/GeertJohan/go.rice/rice@latest                                                             10.3s
 => [react-builder 3/4] COPY ./web .                                                                                                         13.4s
 => [build-stage  3/17] WORKDIR /temp                                                                                                         0.2s
 => [build-stage  4/17] RUN if [ "amd64" = "amd64" ]; then       wget https://download.docker.com/linux/static/stable/x86_64/docker-24.0.7.t  4.2s
 => [build-stage  5/17] RUN if [ "amd64" = "arm64" ]; then       wget https://download.docker.com/linux/static/stable/aarch64/docker-24.0.7.  0.5s
 => [react-builder 4/4] RUN npm run build                                                                                                    22.5s
 => [build-stage  6/17] RUN cd /bin && tar xvzf /temp/docker-24.0.7.tgz --strip-components 1 docker/docker                                    1.8s
 => [build-stage  7/17] RUN if [ "amd64" = "amd64" ]; then       curl -SL https://github.com/docker/compose/releases/download/v2.23.3/docker  2.8s
 => [build-stage  8/17] RUN if [ "amd64" = "arm64" ]; then       curl -SL https://github.com/docker/compose/releases/download/v2.23.3/docker  0.4s
 => [build-stage  9/17] RUN chmod 755 /bin/docker-compose                                                                                     0.6s
 => [build-stage 10/17] WORKDIR /app                                                                                                          0.0s
 => [build-stage 11/17] COPY go.mod go.sum ./                                                                                                 0.0s
 => [build-stage 12/17] RUN go mod download                                                                                                  13.5s
 => [build-stage 13/17] COPY . ./                                                                                                             4.4s
 => [build-stage 14/17] COPY --from=react-builder /app/dist ./web/dist                                                                        0.0s
 => [build-stage 15/17] RUN /go/bin/rice embed-go -i ./web                                                                                    0.3s
 => [build-stage 16/17] RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o /dokemon ./cmd/server                                          14.5s
 => [build-stage 17/17] RUN mkdir -p /data                                                                                                    0.3s
 => [build-release-stage 2/6] COPY --from=build-stage /dokemon /dokemon                                                                       0.1s
 => [build-release-stage 3/6] COPY --from=build-stage /data /data                                                                             0.0s
 => [build-release-stage 4/6] COPY --from=build-stage /bin/docker /bin/docker                                                                 0.2s
 => [build-release-stage 5/6] COPY --from=build-stage /bin/docker-compose /bin/docker-compose                                                 0.3s
 => exporting to image                                                                                                                        0.2s
 => => exporting layers                                                                                                                       0.1s
 => => writing image sha256:a06c58ebd009d32435e0e82ed2189850430d5c7ba0aa2b387b0c82b2e9f2c1c8                                                  0.0s
 => => naming to harbor.freshbrewed.science/freshbrewedprivate/dokemon:update1                                                                0.0s

I’ll push it to Harbor so I can test

$ docker push harbor.freshbrewed.science/freshbrewedprivate/dokemon:update1
The push refers to repository [harbor.freshbrewed.science/freshbrewedprivate/dokemon]
554b300d44f3: Pushed
3262ad702326: Pushed
354afe8bad91: Pushed
315aedec29bd: Pushed
6835249f577a: Pushed
24aacbf97031: Pushed
8451c71f8c1e: Pushed
2388d21e8e2b: Pushed
c048279a7d9f: Pushed
1a73b54f556b: Pushed
2a92d6ac9e4f: Pushed
bbb6cacb8c82: Pushed
ac805962e479: Pushed
af5aa97ebe6c: Pushed
4d049f83d9cf: Pushed
9ed498e122b2: Pushed
577c8ee06f39: Pushed
5342a2647e87: Pushed
update1: digest: sha256:c6bdf086f5eaf112b8ba634f2452058459de8bbbf8e839ea2a8ef17fb1a5a218 size: 4076

I went and launched it on the Dockerhost

builder@builder-T100:~$ docker volume create dokemondata2
dokemondata2
builder@builder-T100:~$ sudo docker run -p 9092:9090 -v dokemondata2:/data -v /var/run/docker.sock:/var/run/docker.sock --restart unless-stopped --name dokemon2 -d harbor.freshbrewed.science/freshbrewedprivate/dokemon:update1
Unable to find image 'harbor.freshbrewed.science/freshbrewedprivate/dokemon:update1' locally
update1: Pulling from freshbrewedprivate/dokemon
804c8aba2cc6: Pull complete
2ae710cd8bfe: Pull complete
d462aa345367: Pull complete
0f8b424aa0b9: Pull complete
d557676654e5: Pull complete
c8022d07192e: Pull complete
d858cbc252ad: Pull complete
1069fc2daed1: Pull complete
b40161cd83fc: Pull complete
5318d93a3a65: Pull complete
307c1adadb60: Pull complete
2772bd5fb3df: Pull complete
8852bb06a792: Pull complete
4ba7d6eb0859: Pull complete
32443d37f55a: Pull complete
fdf5814be559: Pull complete
4a8631cde7a8: Pull complete
3c4453ffc448: Pull complete
Digest: sha256:c6bdf086f5eaf112b8ba634f2452058459de8bbbf8e839ea2a8ef17fb1a5a218
Status: Downloaded newer image for harbor.freshbrewed.science/freshbrewedprivate/dokemon:update1
52f08c0490db9c99980465b89e8ed313d310f664f05afd30433820ecd0ea9591

And we can see that in action

I also realize that I really wish I can do similar for Containers which have a lot of columns, but no sort

/content/images/2025/08/dokemon-05.png

Again, I went back to Gemini CLI for this

/content/images/2025/08/dokemon-06.png

I’m getting a bit worried about going too far so I decided to fork the repo to my own space

I’ll do a quick test of the existing updates

$ docker build -t harbor.freshbrewed.science/freshbrewedprivate/dokemon:update2 -f Dockerfile.server . && docker push harbor.freshbrewed.science/freshbrewedprivate/dokemon:update2

Gemini CLI deleted a file it didn’t think it needed:

/content/images/2025/08/dokemon-08.png

But now I have Docker build errors. This is where I pivot over to Gemini Code Assist

/content/images/2025/08/dokemon-07.png

Gemini Code Assist was not that helpful, it just wants me to remove the icon

/content/images/2025/08/dokemon-09.png

Gemini CLI offered to put it back tho

/content/images/2025/08/dokemon-10.png

and the build and push succeeded.

I’ll update the image on the dockerhost

builder@builder-T100:~$ docker stop dokemon2
dokemon2
builder@builder-T100:~$ docker rm dokemon2
dokemon2
builder@builder-T100:~$ sudo docker run -p 9092:9090 -v dokemondata2:/data -v /var/run/docker.sock:/var/run/docker.sock --restart unless-stopped --name dokemon2 -d harbor.freshbrewed.science/freshbrewedprivate/dokemon:update2
Unable to find image 'harbor.freshbrewed.science/freshbrewedprivate/dokemon:update2' locally
update2: Pulling from freshbrewedprivate/dokemon
804c8aba2cc6: Already exists
2ae710cd8bfe: Already exists
d462aa345367: Already exists
0f8b424aa0b9: Already exists
d557676654e5: Already exists
c8022d07192e: Already exists
d858cbc252ad: Already exists
1069fc2daed1: Already exists
b40161cd83fc: Already exists
5318d93a3a65: Already exists
307c1adadb60: Already exists
2772bd5fb3df: Already exists
8852bb06a792: Already exists
4ba7d6eb0859: Already exists
0f8a607e9660: Pull complete
503c6c9f9bc8: Pull complete
fc94d6a614b3: Pull complete
e568feb8f7e1: Pull complete
Digest: sha256:312ae35ed8955890927268aa4e157abdc5667156d1f96ad1757dad1cb42d26f6
Status: Downloaded newer image for harbor.freshbrewed.science/freshbrewedprivate/dokemon:update2
eb1c2eda09ddcc21de1229611b527ceb74f57c7acc45bab2df639ca20db7945b

And we can see it in action

I replicated the changes to my fork and pushed.

builder@DESKTOP-QADGF36:~/Workspaces/idjohnson-dokemon$ git status
On branch main
Your branch is up to date with 'origin/main'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   web/package-lock.json
        modified:   web/package.json
        modified:   web/src/app/containers/container-list.tsx
        modified:   web/src/app/images/image-list.tsx
        modified:   web/src/app/networks/network-list.tsx
        modified:   web/src/app/volumes/volume-list.tsx

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        web/src/components/widgets/sortable-icon.tsx

no changes added to commit (use "git add" and/or "git commit -a")
builder@DESKTOP-QADGF36:~/Workspaces/idjohnson-dokemon$ git commit -m "Updates for sortable and search"
[main a24d117] Updates for sortable and search
 7 files changed, 705 insertions(+), 291 deletions(-)
 create mode 100644 web/src/components/widgets/sortable-icon.tsx
builder@DESKTOP-QADGF36:~/Workspaces/idjohnson-dokemon$ git push
Enumerating objects: 34, done.
Counting objects: 100% (34/34), done.
Delta compression using up to 16 threads
Compressing objects: 100% (15/15), done.
Writing objects: 100% (18/18), 6.16 KiB | 1.54 MiB/s, done.
Total 18 (delta 13), reused 0 (delta 0)
remote: Resolving deltas: 100% (13/13), completed with 10 local objects.
To https://github.com/idjohnson/dokemon.git
   e800d3e..a24d117  main -> main

I also worked a bit on Issue #42 about password changes and setup but got hung up on the password bcrypt library so set it aside.

I did see I have thus implemented half of Issue #39

So it seems I should do a little housekeeping and maybe lump a bit of my compose files into one… but i don’t want to :|

in the Compose Library, can we add a search (like when we add the compose when we are in the node) node running containers… can we put a search there to quickly show the container we want to see instead of doom scrolling? still loving this.

I spent a lot of time trying to get Gemini 2.5 Pro to help but it just kept getting worse and worse and i had to pull the plug

/content/images/2025/08/dokemon-12.png

According to Vertex AI pricing that likely cost about US$8-10 for all that churn.

I tried Sonnet 3.5 and GPT 4.1 of which I have access to no avail.

What finally worked was starting to do the code myself and realizing I could probably get really specific in my ask to Copilot with Sonnet 3.5:

/content/images/2025/08/dokemon-13.png

I didn’t add search, but I did add sort which is good enough for me

/content/images/2025/08/dokemon-14.png

I created a PR with my changes and let the author know.

I reached out and Salil told me he has been pretty busy with work, thus no time for the hobby projects. That said, he pointed me to Dokemon NG which is a more active project.

I’ll try running interactive to start

builder@builder-T100:~$ mkdir dokemon
builder@builder-T100:~$ pwd
/home/builder
builder@builder-T100:~$ mkdir dokemon/data
builder@builder-T100:~$ sudo docker run -p 9093:9090 -v /home/builder/dokemon/data:/data -v /var/run/docker.sock:/var/run/docker.sock --name dokemon-server javastraat/dokemon-server:latest
Unable to find image 'javastraat/dokemon-server:latest' locally
latest: Pulling from javastraat/dokemon-server
1c56d6035a42: Pull complete
e33bce57de28: Pull complete
473d8557b1b2: Pull complete
b6824ed73363: Pull complete
7c12895b777b: Pull complete
33e068de2649: Pull complete
5664b15f108b: Pull complete
27be814a09eb: Pull complete
4aa0ea1413d3: Pull complete
9ef7d74bdfdf: Pull complete
9112d77ee5b1: Pull complete
83f8d4690e1f: Pull complete
a4ba90834fb4: Pull complete
df368711b362: Pull complete
86ab3af5ffb9: Pull complete
c23ef8de911c: Pull complete
af4850dfa3c8: Pull complete
d7cea9c5bf08: Pull complete
Digest: sha256:ad8e43b406f3ef9b04767b2e22ae0668e2bee1f12df9b41a7b389a1480e7b54c
Status: Downloaded newer image for javastraat/dokemon-server:latest
{"level":"info","level":"","time":"2025-08-04T14:28:31Z","message":"Setting log level"}
{"level":"info","version":"1.6.0b","os":"linux","arch":"amd64","time":"2025-08-04T14:28:31Z","message":"Starting Dokémon"}
{"level":"info","interface":"lo","flags":"up|loopback|running","hardware":"","ips":["127.0.0.1"],"time":"2025-08-04T14:28:31Z","message":"Network interface details"}
{"level":"info","interface":"eth0","flags":"up|broadcast|multicast|running","hardware":"02:42:ac:11:00:03","ips":["172.17.0.3"],"time":"2025-08-04T14:28:31Z","message":"Network interface details"}
{"level":"info","time":"2025-08-04T14:28:31Z","message":"Starting Dokémon Server 1.6.0b-amd64"}
{"level":"info","time":"2025-08-04T14:28:31Z","message":"key file does not exist. Generating new key."}
{"level":"info","time":"2025-08-04T14:28:31Z","message":"Refreshing container stale status"}
{"level":"info","address":":9090","time":"2025-08-04T14:28:31Z","message":"Starting HTTP server"}
⇨ http server started on [::]:9090
{"level":"info","address":":9443","time":"2025-08-04T14:28:32Z","message":"Starting HTTPS server"}
⇨ https server started on [::]:9443

Honestly, it has pretty much all the features I implemented and more

/content/images/2025/08/dokemon-15.png

The lesson, I think, is to not try and vibe code your way up from an older Open-Source project - rather see if there are active forks and go from there.

I did some cleanup and relaunched with the Dockemon NG project

builder@builder-T100:~$ docker rm dokemon-server
dokemon-server
builder@builder-T100:~$ sudo docker run -p 9090:9090 -v /home/builder/dokemon/data:/data -v /var/run/docker.sock:/var/run/docker.sock --name dokemon-server --restart unless-stopped -d javastraat/dokemon-server:latest
35c6cb67e7a774dddbb024eda5239c26f8cda3f6bd40b6a491cd2670f8e9d69b

Summary

Today we did a bit of cleanup removing Gitness, OneDev, an unused Airstation and more. We upgraded some apps including OneDev and Dokemon and really spent (too much time and AI tokens) trying to update Dokemon before finding Dokemon NG.

I know there are more things to update but just a bit at a time. Twice in the last week I had to reboot the primary node of my production K3s and I’m starting to worry about it’s long term health.

chorin gitness dokemon

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