Building a Go Link Toy with Deno

• ~800 words • 3 minute read

Screenshot of my Go Links Web Manager tool

For some reason I've been thinking about go links, which are really just a fancy word for link shorteners. They're useful at larger companies for providing static, easy-to-remember URLs that can take employees directly to pages for benefits explanations, requesting time-off, internal documentation and all sorts of things.

Some companies go the extra mile and make these links available on aesthetically pleasing URLs that only work when you're plugged into the corporate network. Something like:

If you work at a company utilizing go links, there's a chance these links might even work for you! If that last link works, you might want to consider finding a new job.

Projects > Solutions

I wanted a simple personal go link system I could run on my machine, mostly for fun. I decided I wanted to make my own go link implementation just for me, local only to my network and perhaps even just my particular machine.

You might be thinking "Why not just bookmark the links in your browser?" to which I would say "Hey, I'm looking for a Sunday afternoon project, not a solution!"

Other requirements:

  • go/whatever URLs, because they feel fancy
  • A cute little web-interface I can navigate to for managing the URLs, shortcodes
  • A CLI-driven component to the tool so I could manage and even access the links from the shell by invoking golinks [shortcode]
  • Some basic stat tracking every time I use one of these, just because

If you want to cut to the chase and play with the toy I built, check out the repo:

I also used this as an opportunity to continue exploring Deno. I've been intrigued with it ever since it came on the scene, and I've found it particularly nice for building little one-off CLI toys.

Another fun aspect is you can run the following and install my golinks tool globally:

deno install --global --allow-read --allow-write --allow-env --allow-net --allow-run jsr:@georgemandis/golinks

I published the package on JSR just to get a feel for what's going on over there. Might save that for a different blog post.

Fancy URLs

Half the fun is having those fancy TLD-less URLs. I elaborate a little bit in the README for the repo, but it boils down to adding additional aliases for the loopback address (i.e. localhost) on your machine.

To do that in Unix and MacOS environments all you have to do is add a row to your /etc/hosts file:

echo "127.0.0.1 go" | sudo tee -a /etc/hosts

Note, tee command is just a nice way to write our input to a file and stdout at the same time. It’s not a command I use often, so I thought I’d explain it.

Running the Server

For me, I'm happy to just run it in the background and forget about it:

golinks --server &

I always have my terminal open, so this very lazy solution is Good Enough™ for me. The & runs it as a background process and if I want to stop it I can ps -e | grep "golink" it, find the PID and kill -9 it.

But a few more fun options are available if you want to be less lazy:

  • Set it up as a proper service at launch. I actually went down this route, implemented it and decided I didn't want to commit. Maybe it's irrational, but I like keeping my at-launch processes as clean and minimal as possible.
  • Run it on a second computer on my network. This is actually my favorite approach, conceptually, and combined with Tailscale it's surprisingly powerful. I have my "under the bed" computer that handles some home automation and other projects. I can run golinks on this machine and map the Tailscale IP address to http://go in my /etc/hosts file. Neat!

Future Considerations

Like any good project, this one has plenty of rabbit holes to fall into. Here are some other ways I could continue to invest in the project:

  • I'm really bothered by the "insecure" nature of these links. Getting SSL certificates working for local URLs was a pain last I checked, and many years ago I had a script to automate this. I'm pretty sure no longer works.
  • When in doubt, add AI. I actually added the "description" field with this somewhat in mind. It wouldn't take very much to open up the list of shortened links to an LLM and start querying over it.

I don't foresee myself investing more time in this unless I really find it useful or people start contributing to/forking/using it, but it was a fun Sunday afternoon project.

--

Published on Sunday, July 13th 2025. Read this post in Markdown or plain-text.

If you enjoyed this consider signing-up for my newsletter or hiring me