Blog
I wanted an API client that kept up with my typing
Beacon is a keyboard-first desktop API client for macOS, and I build it on my own. Those two facts explain most of what the app is and all of what it is not, so this post is both halves: what keyboard-first actually buys you once you are inside the app, where it stops buying you anything, and why the build you would download today is macOS-only, unsigned and free.
The thing I kept putting down
Composing an HTTP request is a small thought. A method, a host, a path, one header, a bit of JSON. The thought takes about four seconds to have.
Expressing it took considerably longer in every client I had used, and not because any single step was slow. The steps were in different places: a dropdown for the method, a field for the URL, a tab for the body. Each hop costs a fraction of a second and none of them is the work. What they cost is the thread — you look away to find the method selector, and the request you were holding in your head has to be picked up again when you look back.
The whole motivation is smaller than it sounds. Not speed; I do not type fast enough for milliseconds to matter. Just not putting the thing down between having it and sending it.
One field that reads what you type
So in Beacon the URL bar is the way in, and its placeholder says as much:
Enter URL, type > for commands, or search…
The field classifies what you type. There are six modes it detects for you — URL,
method-prefix, curl, > commands, {{variable}}, search. Detection is automatic; there
is no mode switcher, nothing to declare and nothing to remember, because the only thing
worse than a mouse round-trip is a mode you have to set first. Type
post api.example.com/orders and method-prefix mode sets the method to POST and strips
the prefix when you send. Type free text that is not a URL and it searches your saved
requests and history instead. Type {{ and it suggests matching variables.
A leading > opens the command palette, and so does ⌘K — a ⌘K palette for new tab,
theme, layout and the side panels. Those are two doors onto the same palette, not two
features: the prefix if you are already typing in the field, the chord if you are
anywhere else. One caveat travels with the chord. Monaco owns ⌘K while a code editor has
focus, so inside the script or body editor that chord belongs to the editor.
The same field is where a curl command goes. Paste a curl command straight into the URL
bar and it fills the tab, ready to send — the Send button relabels itself Import and
never fires the request, so sending is a second, deliberate keystroke. It is the point,
not an oversight I am dressing up. Pasting someone’s curl line out of a bug report and
having it execute against whatever host it names is a thing I would rather the app never
did to anyone.
A request, start to finish, without the mouse
In the order you would actually reach for them:
⌘Topens a new empty request tab.- Type
post localhost:3000/orders. Method-prefix mode sets the method and strips the prefix when you send. ⌘↵sends it. PressingEnterin the URL field sends it too.⌘Ffinds in the response.⌘\cycles Workbench focus: both panes → response → request → both.⌘Ssaves the request — in place if it is already saved, otherwise the Save dialog.⌘Pfocuses the Omnibox in search mode, to quick-open a saved request or a history entry.⌘1,⌘2and⌘Etoggle the Collections and History panels and the Environments panel.⌘/opens the shortcuts overlay, which is the version of this list you do not have to remember.
The bottom Status strip keeps a compact hint row for the ones you reach for most — among
them ⌘↵ Send, ⌘K Commands, ⌘P Open, ⌘\ Focus, ⌘E Env — on the theory that a
shortcut nobody can see is a shortcut nobody uses. The full reference is
the keyboard shortcuts chapter of the guide.
Where the keyboard stops
Step 2 above skipped the body, and that is the honest part of this post.
The keymap binds send, the two Omnibox modes, tabs, focus-cycle, environments, save, help and the digit keys that open the side panels and Settings. It binds nothing for the request-builder fields themselves — method, URL, params, headers, auth, body. If you want a JSON body, you reach for the request panel like you would anywhere else. “Keyboard-first” describes the way in — one field that takes a URL, a curl command, a command or a search — and it describes the way around. It does not describe every field in the app, and I would rather write that sentence than have you discover it on day two.
This is not a hypothetical, either. An earlier version of this site’s own home page said the request builder put six things one keystroke away — and none of the six had one. It was written from what the panel is for rather than from what the keymap actually binds. That copy is gone, and the correction is written down in the file the home page reads its feature list from, which is roughly how everything else on this site gets fixed too.
Why macOS, and only macOS
The FAQ answers it, and I would give you the same two answers in person:
Not currently. Builds are published for macOS only — Apple Silicon and Intel, both with every release — and there is no committed date for other platforms yet.
macOS 12 (Monterey) or later, on either an Apple Silicon or an Intel Mac.
The reason is arithmetic rather than principle: one person can build one good desktop app or several mediocre ones. macOS is the only platform Beacon runs on. The roadmap answer above is the honest one for that reason — a date I have not committed to, rather than a quarter I would like to believe in.
Why macOS calls it unsigned
The other cost lands before the app even opens:
Beacon is an indie project without a paid Apple Developer subscription, so it is not notarized, and macOS shows its standard warning for any unsigned app from the internet. The install script and Homebrew both clear that for you, so most people never see it. Only the manual DMG route hits it — one xattr -cr /Applications/Beacon.app in Terminal and it opens normally from then on.
Two of the three install routes handle it for you; the third is the one that leaves you with a job to finish, which is why it is listed last. I wrote up what that command does, and what the install script does line by line, in how Beacon ships a release.
While I am pre-empting questions, here is the other one:
No — the app’s source is private right now. The compiled builds are free and public on GitHub (quizuncle/beacon-releases), but the source itself isn’t open at this point.
What it costs and what it buys
The costs are the three above: one platform, an unsigned build, and a keyboard story that is real for navigation and partial for editing. Every one of them is a consequence of the same constraint — the app is built by one person — and that constraint is also why the Omnibox exists at all. Nobody had to be convinced that a URL bar should double as a command palette.
On price, the commitment is narrow enough to state exactly:
Free today. A pro tier is planned; nothing that is free now will be moved behind it.
That is the whole of it. Not a promise about forever, which I am in no position to make, but a promise about the specific things you would use tomorrow.
If four seconds of thought currently takes you twenty seconds of clicking, the app is on the download page.