Skip to content
Horon

Designing for the machine you own

7 min readdesign, local-first

The work runs where the files already are#

Point the assistant at a folder and it works inside that folder. The read tool opens the path you named and hands back the bytes that are there. The edit tool rewrites the same path. A shell command runs in the same directory. Nothing is imported into a workspace first, and no sync step has to finish before the first call.

The program sits on your machine as well. horon-agent serve opens two local sockets, one that clients attach to and one for the part behind it, and it opens no port that accepts connections from the network. The socket paths are resolved from the runtime directory, so they follow your environment instead of a fixed location.

That arrangement is the argument. A tool that edits your file runs next to the file, which is a different claim from "your data never moves." The first is a fact about placement, and you can check it with ls. The second is a promise about the network, and the second half of this post names the step that still breaks it.

The first cost: the machine has to be on#

Nothing runs on your behalf while the laptop is closed. The assistant is a program you start, not a service someone else keeps warm. Shut the lid and the turn stops. No one queues your request until morning.

Today that program is a command in a terminal, or code you write against the TypeScript SDK. The desktop app exists as a test bench and has no installer, so there is nothing to download and double-click yet. Setup is on you: one process to start, one folder to choose, one account to sign in with.

Hosted tools invert the relationship. You trade the running process for a bill and an upload, and you get something that answers at three in the morning without your laptop. That is a real convenience. It is also the thing this design gives up, because its price is that the work moves to someone else's disk.

The second cost: the setup is yours#

A model needs an account, and the key for it stays on the machine. setApiKey writes the provider key to a file only your user can read. If you would rather keep several provider accounts in one place, the local router holds them and makes the outbound call itself.

The rest of the setup is a set of decisions you now make instead of a vendor. Which folder the assistant may touch. Which model address it talks to. Whether a second device may reach it at all, through an optional gateway that ships turned off.

Your laptop has no status page. When the process is not running, or the key expired, or an environment variable moved the socket path, you are the one who notices. That is the honest cost of owning the setup, and it does not shrink as the product matures.

What it buys: the upload step disappears#

The missing step is the one you would otherwise repeat all day: export the folder, upload it, wait, edit, upload again. There is no copy on a server to keep in step with the copy on your disk, because there is no second copy.

Edits land in the files you were going to commit anyway. git diff shows every line the turn changed, and that is the whole record of the work. The safety net is an undo journal that holds the bytes before and after each write in memory, with a 64 MiB budget, for one session in one running process. It is a short buffer, not a backup, so the copy that matters is still the one on your disk.

The practical result is that the file you review and the file that ships are the same file. There is no drift to reconcile and no merge between the tool's version and yours.

What it buys: storage stops being a line item#

An account on horon.ai keeps identity, not work. The tables behind it hold the user, the session, the linked provider account, verification codes, passkeys, signing keys, device codes, a rate-limit record, and a download record. None of them holds a file you edited.

So there is no storage tier to compare and no per-seat storage to buy. Plans are advertised at $0, $12, and $20 per seat per month, and the team plan's shared workspace is marked in progress: there is no way to create or join one, and the database has no member or workspace table. Nothing is billed at all yet, because checkout is not built.

The honest correction: the disk is yours, but the model is not free. Every answer is made by a model outside your computer, and that provider bills you under its own terms. What you stop paying for is storage of your own work, not the compute that reads it.

The step that still leaves the machine#

A model can only reason about what is in the conversation, and the conversation is what gets sent. When a tool reads a file, that file's contents join the request. When a command prints output, the output joins it too. The request goes over HTTPS to the address you signed in to.

This checkout registers one provider runtime, so that is the path model traffic takes. The local router changes the first hop and nothing else: it holds your accounts and makes the outbound call, and the provider still receives the request. Local inference is not built, so the model does not run on your laptop.

Read that as a constraint of the design rather than a defect waiting for a patch. Pointing a task at a folder of client material is a decision about what that provider will see. Make a copy and work on the copy, or keep the folder out of reach.

Who this is not for#

If you want a browser tab that opens your project from any machine, this is not it. There is no server-side copy of your files to open, and that is the point. If you want zero setup, or a support desk that answers when the process will not start, this is not it either.

If you need a team workspace today, it is not usable: no way to create or join one, no member table, and no seat to buy. If you are on Windows and want the desktop client, it connects over Unix sockets only, and macOS is the one platform it has been run on.

It is for one person with a folder, a machine that stays on while work runs, and enough judgment to know which folder is safe to point at. A one-person business fits that shape better than a platform team does, because there is no procurement step, no shared drive to reconcile, and no administrator who needs to see everyone's disk. The trade is legible: you keep the machine running and you own the setup, and in exchange the tool sits next to the work instead of in front of it.