DEV Community

Cover image for Built My First CLI Tool in Go
Sindbad_X
Sindbad_X

Posted on

Built My First CLI Tool in Go

govibes tui app screenshot

Mechvibes, an open-source GUI program for simulating mechanical keyboard sound, is a program I've been using for the last 3-4 years. But since I switched to Linux, it stopped working(Wayland security issue). The program is essentially listens to keyboard inputs and plays keyboard sound on each key press. Moreover, MechVibes is built with Electron.js, so it's memory intensive(150 MB). The CLI I built only has a memory footprint of around 6 MB.

That said, I'm quite new to Go, as well as the Linux (and CLI tool) world. Since I switched from Windows to Linux, I find myself trying to accomplish a lot of things with the terminal. That also led me to try out NeoVim, which blew my mind and changed the way I look at terminals.

Do you know GoVibes is 100% developed using NeoVim?🤷‍♂️

While Go is known for its simplicity like C, coming from the Javascript/Frontend world, I struggled with it. I think mainly for two reasons: firstly, I don't truly know programming(I only know framework(React) and for the last 2 years, I've been writing memorized boilerplate code.); secondly, Go is my second language and web/js development have made me inflexible at picking new languages. So learning Go was like a paradigm shift for me, which exposed a lot of my insufficiencies and skill issues. And that's clearly apparent if you check out the codebase of GoVibes.

I’m referring to this as a CLI tool, even though it doesn’t fully meet standard CLI tool criteria. It's Linux-only(tested in Fedora, and my friend's machine, who uses Arch btw!), and requires manual compilation. On top of that, the code is awful.

There's a similar CLI tool written in Rust, called Rustyvibes. I tried it and because of the Wayland security issue, it failed on my Fedora Linux. Also, I had to kill the CLI program if I wanted to change the keyboard sound flavour. Coming from the frontend world, I'm biased toward pretty UIs, and I wanted the same experience in my CLI tool. So, to precisely highlight those issues, I build GoVibes.

The core of the program is simple. There's a continuous loop that's running in a separate channel, and it listens for the incoming keyboard input event. Based on the input event, the program plays a section from the audio file. What part to play, is defined in a separate config.json file. Now there can be multiple input devices in your system. So, the program also lists all the available input devices and you can choose what channel it should listen to. What I found interesting was, as I'm new to Linux, treating devices as files like objects. And, so all I had to do to mount a device was to open it as a directory.

file, err := os.Open("/dev/input/event2")
Enter fullscreen mode Exit fullscreen mode

Most of the development time went into making GoVibes interactive and look pretty. Perhaps, that effort could have been better spent on making it cross-platform and functional, but again, I'm its sole user, so it doesn't matter. Anyway, I found BubbleTea, a library for building interactive CLI(TUI) tools in Golang. The library surely had a learning curve. It took me a week to wrap my head around how all things tie together. There are also a lot of prebuilt components(Bubbles) which makes it super easy to build a pretty, user-friendly TUI.

hxh reference - Bungee Gum possesses the properties of both rubber and gum.

Overall, it was a good learning experience.

  • For the first time, I built something other than a CRUD.
  • This time around, I actually learned some Go(file handling, go routine, channels, context, WaitGroups),
  • Got a confidence boost exploring new things. Figuring out bubble tea felt foreign and overwhelming, but once it clicked, I envisioned my portrait in the Hall of Great Programmers.

Top comments (0)