Compass Navigation Streamline Icon: https://streamlinehq.com
applied cartography

Golinks

If you've never encountered golinks before: they're short, memorable URLs that redirect to longer ones. Instead of telling a coworker "the dashboard is at https://app.example.com/internal/analytics/v2/dashboard?org=us," you just say go/dashboard. Instead of bookmarking seventeen different Notion pages, you type go/onboarding or go/roadmap or go/expenses and trust that you'll end up in the right place.

flowchart LR
    U["go/dashboard"] --> R["Golink resolver"]
    R --> D["https://app.example.com/internal/analytics/v2/dashboard?org=us"]
    U2["go/pr/1234"] --> R
    R --> D2["https://github.com/acme/repo/pull/1234"]
    U3["go/expenses"] --> R
    R --> D3["https://app.expensify.com/reports"]

I discovered them at Stripe, though I believe they were invented at Google, and I have not stopped using them since.


One thing leads to another. You decide that you no longer need Tailscale because the main reason you spun up Tailscale was for a project that ended up shipping — and therefore spending per-seat pricing on a service that you literally only use for golinks seems a bit silly and prohibitive. Side note: I still really love Tailscale and think it's a great product and would be shocked if we aren't using it again by the end of the year. But!

And then you need to find a replacement for golinks, and you cannot get dragged back to golinks.io or Trotto, both of which are slow, cumbersome, and expensive besides.

So what was I to do? First, I looked at the open source options, none of which struck me as particularly compelling. I have a set of requirements that I don't think are esoteric, but others might:

  1. A reasonable price
  2. Persistence
  3. The ability to use golinks without a Chrome extension
  4. Variables
  5. Performance

And nothing quite fit the bill.


I had a revelation: I discovered that you could use a default search engine as the routing proxy instead of /etc/hosts or DNS interception like Tailscale's MagicDNS. For a week or two, I had this sitting within Django in our monorepo out of ease — simply intercept any incoming search query, redirect it if something's already in the database, and then if it's not but it looks like it could be, send to the empty state prompting the user to create a golink.

But frankly, this was just slower than I wanted. Not for any interesting reason, but just the usual Python request-response lifecycle stuff. I could, of course, invest in making it better and faster and was planning on doing so, but figured I would take one last trip around the internet to see if there was some other solution that I somehow missed.


And that's when I discovered GoToTools.

There is nothing really interesting to say about this product besides the fact that it is very good for what it does. Its author appears to have built it out of the same frustration that I had. And the highest compliment I can give it is that in a year where I've already cut down substantially on the number of services I pay for — in favor of those that I vend — I have absolutely no compunction about starting to use this. The pricing is extraordinary. The performance is really good. It works and is fast and lets me not spend time thinking about golinks and instead lets me spend time using them.


About the Author

I'm Justin Duke — a software engineer, writer, and founder. I currently work as the CEO of Buttondown, the best way to start and grow your newsletter, and as a partner at Third South Capital.

Colophon

You can view a markdown version of this post here.