Recently, I’ve been dealing with an interesting problem. I have a large number of websites that I want to randomly visit a few of each day. It’s not an unsolvable problem - I copied the sites into Google Sheets and used ChatGPT to write a script that randomly selects ten sites and opens them in a new window.

Although I don’t really know how to script in App Script (which is Google’s JavaScript equivalent for Google Drive), defining what I wanted, generating it, and then modifying it wasn’t much of a problem. However, I encountered one issue that I’d like to discuss. In Google Sheets, you can create a button and map it to your script. But in practice, it often fails and doesn’t work - nothing happens when you click the button, and even refreshing the page doesn’t help. Often the only solution is to delete the button-script connection, rename the function, reconnect it, wait a week, and after a week it stops working again. This frustrated me.

Application Screenshot

It frustrated me because I value consistency highly. Through these random websites, I monitor a lot of financial data (like US employment) and other websites (such as FeedReader for RSS, etc.). So I decided to program something of my own. In case you don’t know, I spent about a year learning NextJS (which is basically a FullStack React JavaScript framework), but eventually realized that as a DevOps engineer, I would never be great at it (unless I devoted myself to it full-time, which I don’t want to do right now), so I abandoned that technology.

However, when deciding what to use to program my Bookmark manager, NextJS came to mind. Time was limited, so I generated the basic application through Claude AI. Some things worked, some didn’t, but with AI collaboration, I managed to generate a fairly solid application where I can edit links, and with the press of a button, it opens ten random ones in a new window.

AI is peculiar - first it generates everything in JavaScript, so you have to insist on TypeScript; then it writes classic SQL queries, so you have to insist on using ORM; it makes a lot of mistakes and forgets context. But honestly, with my high-level overview, it’s not such a problem to create in one day an application that might otherwise take me weeks, because I don’t have all the commands etc. in detail in my head.

What was probably the worst for me was setting up the entire DevOps. At home, I have my own Kubernetes server built on MicroK8s, and I had to solve several issues. The first was connecting to the database - I chose MySQL, which meant creating a special user and permissions - AI helped again, although I could have probably pieced it together more slowly with documentation or notes.

And then deployment. I have my own registry set up at home where I can upload. But as a proper DevOps engineer, I wanted to create my own CI/CD pipeline. That’s not such a problem when you have your own local GitHub runner, so I built everything, uploaded it to GitHub, and it sent it to my home via webhook (I have a static IP) and ran it locally and uploaded it to the registries.

The last thing I struggled with a bit was creating the entire deployment for Kubernetes in ArgoCD. If you have the feeling that I’m running an enterprise-level environment at home like a bank would, you’re right. On top of that, storing and synchronizing passwords in HashiCorp Vault through Kubernetes Vault Operator, setting up GitOps, configuring RBAC for the GitHub runner for Kubernetes so it could restart deployment, and we have a complete pipeline.

Given that this is a home project, you can probably see how complex it is. But that’s exactly what I want - I want to learn from it. I want to do it properly, the way it should be done. In the end, I deployed everything, with my own SSL certificate, and I’m attaching a preview of what it looks like.

So what do you think about it?