All posts

Why I built GoKlip instead of just using a notes app

The case for solving a small, specific problem well rather than tolerating a large general-purpose tool that almost fits.

Devesh2 min readengineering, products

There is a moment that happens frequently when you work across multiple machines.

You are at your development laptop, terminal open. You need to run a command on a different machine — a test server, a second monitor, a phone. The command is five lines. Your clipboard does not travel.

The options that exist:

  • Email yourself a snippet. (Works. Leaves clutter. Requires opening email.)
  • Paste into a messaging app. (Works. Involves opening the wrong app. Sometimes sensitive.)
  • Open a shared note in Notion, Apple Notes, or Google Keep. (Works. Opens a full-featured document editor to move five lines of text.)
  • ssh to the remote machine and type it manually. (Works. Takes longer than the task itself.)

None of these are bad options. But each of them has overhead that is disproportionate to the task.

The actual problem

The problem is not that a clipboard sync tool does not exist. The problem is that every tool that solves this also does dozens of other things, and you pay the overhead cost of those features every time you use it for this small task.

A clipboard is not a document. It does not need history, organization, collaboration, or persistence. It just needs to be accessible from another device, for a short time, without friction.

What I built

GoKlip is a real-time text buffer with a short room code.

You open a room. You get a 4-character code. You open that code on any browser or in the VS Code extension. Text typed in one syncs to all. When you close the room, everything is gone.

The scope is intentionally narrow. There are no accounts. There is no history. There is no rich formatting.

The constraint was the design decision.

What I learned

A few things came out of building this that I did not expect.

The VS Code extension changed how the tool was actually used. I initially thought the main use case was browser-to-browser. Adding the extension made it useful for an entirely different workflow — pasting something from your terminal output directly into your editor on a different machine. The extension was the feature that made the tool genuinely good.

Temporary by design requires explicit implementation. "Rooms expire automatically" sounds like a simple requirement. It involves room lifecycle management on the server, edge cases for stale connections, and a clear communication layer for when a room has expired versus never existed. The constraint is easy to state and not trivial to implement correctly.

Small scope does not mean small thinking. A tool that does one thing well still requires the same careful thinking as a larger product. The decisions about room codes, QR codes, connection state, expiry, and error states were each meaningful design choices, not defaults.

GoKlip started as a personal tool and is now open source. The repository is at github.com/devo-id/goklip if you want to read the implementation or run it yourself.