Robert Soane

Ducker

Oct 11, 2025

Reflections on accidentally creating an open source tool

Post image

About 18 months ago I decided I wanted to experiment with Rust. I had been using Axum for a few things at work, but most of my job was split between Python, Bash, Terraform, YAML, Jira and meetings. In any case, I wasn’t exactly going to go to my boss and say, “Hey, this five‑year‑old project — let’s rewrite it in Rust.” I still wanted to experiment with the language. The small amount I’d used professionally had somehow whet an appetite for systems‑level programming languages I didn’t know existed.

At the time I was spending a fair amount of time debugging issues with a Helm chart I had written. A colleague had put me onto K9s, a terminal UI for managing your Kubernetes cluster. This was invaluable for my little brain as I tried to grasp all the kubectl commands.

K9s screen grab A screen grab of K9s taken from the K9s website

I often want to work on a side project of sorts. I want to learn a new technology, experiment with a new framework, or find an excuse to procrastinate trimming the front garden hedge. However, I always find it very difficult to come up with an idea. I’m not after a good idea — just a sufficiently plausible one that I can kid myself into thinking it’s worthwhile. Now on one of these days, when the itch to experiment with Rust was particularly irksome (around the same time I came across the Ratatui library), I had a thought: K9s but for Docker?

Kubernetes is sufficiently complex that I’d barely scratch the surface if I tried to rewrite K9s in Rust. Besides, I barely knew the language; I couldn’t dive in and fulfill the “rewrite it in Rust” stereotype. But what about K9s for Docker? Thinking along the animal theme my mind went “K8s -> K9s -> dogs” => “docker -> DUCKS!” The image of the duck and the Docker whale spurred me on.

Ducker was born

To recap the scene: I had little experience in Rust, none with Ratatui, and just a rough idea of what I wanted to build. The aim? Learn a bit, have a bit of fun, and keep out of my wife’s hair. I spent about a week spending my evenings tinkering with what was (and likely still is) a pretty messy codebase; after a couple of days it had a K9s‑esque look and I could list running Docker containers. I had spent a few evenings of my free time automating the docker container list command.

While the proposition didn’t appear to be the most compelling, out of a completionist urge I decided to add pages for images, networks and volumes. At the same time I wanted to add some structure to the codebase. Returning to the project after a summer hiatus, I’m aware I may have failed at the latter! At some point I needed help with something in Ratatui. I joined their Discord server, asked my question, and shared a link to the work‑in‑progress repo.

The next day after work I got home to a few unexpected emails from GitHub. Someone had not just forked this mangle of Rust and Ratatui — they had raised a PR against my repo. On closer inspection I also saw that the repo had about 20 stars on GitHub. To say the least, that was a surprise. I cannot remember the exact rate of starring, ut I do remember that within a couple of days it had surpassed 50 stars. I later found out that one of the Ratatui maintainers had shared Ducker on social media.

This caused a mixture of elation and trepidation. Elation that my “sufficiently plausible” idea had a slamm amount of traction. Trepidation at the thought that some people might be using Ducker; some anonymous fellow professionals might see and judge the mess of learning. That said, the elation significantly outweighed the trepidation.

The Ducker Demo An early demo of ducker

Intermittent maintenance

Given the fact that people actually seemed interested in Ducker, I wrote a README with some instructions on using Ducker. I quickly set up some basic CI using a fork of joshka’s rust workflows. At work we use GitLab, and thus I know a thing or two about GitLab CI, but GitHub CI was (and still is) very new to me. I created an account on crates.io and configured my repository to push the ducker crate. And as issues were raised, I started to incorporate them into the program, accutely aware of the amount of technical debt and scope for bugs. On the plus side, with Rust, if it compiles it probably works (ish).

I did feel some pressure to maintain Ducker. Significantly less pressure than when, six months out of university, I took down production during an out‑of‑hours system upgrade and ended up on the phone to the CTO while he was on holiday. But I felt some pressure all the same.

Pressure isn’t innately a bad thing; it has driven me to add to Ducker over time. I never intended to create a project people would actually use, nor did I have the time to maintain it continuously. The aim had always been to learn about some interesting technologies. That said, as there appeared to be interest in what I’d built, I wanted to present the best I could.

Various issues and feature suggestions were raised. While I attempted to close some of them, others got neglected. The best way to describe this is “intermittent maintenance”: every few months I return to the project and make a few changes, but it hasn’t been in significant active development. This has been balanced with the other things I occupy my free time with.

Plans for the future?

So that’s the story of Ducker: how it started, how I perceive it, and what it’s for. Why write this somewhat self‑serving blog? A few reasons. First, I want to share the learning journey — it’s interesting how a small exercise created something people might actually use. Second, I wanted to provide a summary in case anyone wonders what this Ducker malarkey is. Finally, I wanted to provide a background in case people stumble across this and wonder, “Is this still maintained?”

What is next? I’m glad I created Ducker and know it’s far from perfect; there are many enhancements that could be made. For now I intend to continue maintaining it intermittently — every now and then I’ll “do a sprint” and add to it. Hopefully, over time, it will continue to grow. Maybe at some point I’ll get the Ducker duck printed on some stickers!

For now? If you haven’t already, please do try Ducker, and let me know what you think!