Skip to content

Privacy and egress

The one sentence: when a request runs on a machine somebody shared with you, that person's machine sees your prompt. Everything below is the detail behind that sentence, including how to turn it off.

This page describes the running system in the current public beta. The formal policy is at /privacy; this is the operator's-eye version.

What leaves your machine, and when

Saylek serves a request locally when it can. When your own machine cannot serve the model you asked for, the request goes through Saylek's registry to a machine that can: another machine of your own, one belonging to someone who shares with you, or, if you joined a group (one an organization runs or one anyone can join), one belonging to anyone in it. Nowhere else, and you do not switch this on. To leave a group, run saylek circles leave <id> (find the id with saylek circles list), or turn on local-only mode (below).

What travels:

  • Your prompt, and everything your tool put in the context window with it. For a coding agent that routinely means file contents, diffs, stack traces, and anything else it read on the way to the task.
  • The completion comes back the same way.

That machine handles both in the clear. It has to: that is how it computes the answer. It is a peer running saylek host, not an opaque cloud endpoint, but it is still a different person's computer.

It does not go straight there

Your request reaches that machine by way of our registry, which routes it. So your prompt is on Saylek's server too, not only on their machine. We do not read it and we do not train on it, but it would be wrong to let you picture a direct machine-to-machine hop.

The routing queue is trimmed by count (about 10,000 entries) and never by age. A busy queue displaces your prompt in moments. A quiet one can hold it indefinitely, because nothing deletes it for being old. The privacy notice states this in the same terms.

What the serving machine learns about you

Your display name, beside each request. On that machine's page in Saylek, its owner can see each of your requests from the last 7 days, with its model, tokens, time, outcome and measured speed, under your display name. If the machine is no longer shared with you, or you have no display name, those entries show "Member · " and the first 4 characters of your account id instead, and they stay listed.

The list never shows your prompt or reply, or your email. Their machine still reads each prompt it serves, as above, and its own records of those requests can be matched to the list by time, model and tokens.

Not using that person's machines is the only way to stay off their list. Choose Stop using their compute on their page in Sharing, or run saylek sharing stop-using --person <name>. Requests already on the list stay there until they are more than 7 days old.

Someone who shares with you chose to, and their Sharing page lists you by the name you set in your account, never by your email. The registry, which does the routing, knows which member you are.

What is kept afterwards

Nothing on a machine is deleted automatically. Receipts and activity logs stay until someone removes them by hand (saylek wipe), on your machine and on the serving one alike. Receipts hold hashes, not text, so they are not a transcript of what you typed. The full inventory is in the privacy notice.

What a shared machine sends Saylek

When you share a machine with saylek host, its agent sends Saylek figures about the machine and the engines it runs. Each row says when it is sent, why, who reads it, where it is kept and for how long. Placement is the part of Saylek that picks which machine serves a request. Live state is where Saylek holds each connected machine's current figures.

What Saylek receivesWhenWhyWho reads itWhere it is keptHow long
Machine status: its status, quota, priority, capacity and admission settingsEvery 10 seconds while the machine is connectedPlacementPlacement and Saylek staffLive stateUntil 30 seconds after the machine disconnects
How busy the machine is, including counts of the work its engines do outside Saylek (home use)Every 10 seconds while the machine is connectedCapacity planning and staff diagnosisSaylek staffLive state and the measurement store35 days in the measurement store
A record of each request it serves for SaylekEach request it serves for SaylekMeasurement and staff diagnosisSaylek staff and Saylek's measurement systemThe measurement storeEach request's row about 2 to 3 hours, longer during an outage. The kept samples (the last 20 per model and machine) and the counters: 35 days
Engine facts (each engine's configuration and model list, and whether its metrics endpoint is on) and the agent's versionWhen the machine connects, and when one of them changesPlacementPlacement and Saylek staffLive stateUntil 30 seconds after the machine disconnects
The engines and models found on your machine, including models you have not chosen to shareWhen your machine connects, and whenever the engines or models on it change, even if you are not sharing the machineTo show you which models we found, and to help you share themYou and Saylek staff. It is not used to send requests to your machineLive stateUntil 30 seconds after your machine disconnects
A failure reportWhen something failsStaff diagnosisSaylek staffThe report storeNo fixed limit
Engine readings: each engine's token totals, its start time, how many requests are running and waiting, how full its cache memory is, and, for each slot, the tokens it holds and its task number; whether each shared model is loaded. The engine's address on your local network identifies itOnce per check of each engine, every 60 seconds give or take 20%, while you share the machine and Saylek's server has accepted readings on its connectionPlacement and staff diagnosisPlacement and Saylek staff onlyLive stateUntil the engine leaves the machine's routes, 30 seconds after the machine disconnects, when you stop sharing it, or when Saylek's server stops accepting readings
End stamps: each request's reference to the engine's latest reading at the end of the request. Saylek stores each check's reading once, and only when a request refers to it: every request the engine finishes before its next check refers to that one copyEach finished request on an engine Saylek routes to, while Saylek's server accepts readingsStaff diagnosis, and placement through the live readingsSaylek staffThe measurement storeEach request's reference about 2 to 3 hours, and the reading it refers to up to an hour longer: about 2 to 4 hours in all, longer during an outage
Reading counts: how many readings arrived or were missing, per value and per reason, and three counts about the machine's status updatesEach reading, and each status updateStaff diagnosisSaylek staffThe measurement store35 days
Saylek's server log of parts it dropped: the machine's id, the reason and how manyWhen Saylek's server drops part of what a machine sentStaff diagnosisSaylek staffThe log storeRotated by size, no time limit
Backups of everything above that sits in Saylek's databasesEvery nightRecoverySaylek staffNightly copies of Saylek's databases, and each Saylek region's own backupsNo fixed maximum. Each nightly copy is kept 14 days; snapshots of those copies are then pruned to 7 daily, 8 weekly and 12 monthly ones. A region's own backups keep 7 daily and 4 weekly copies

Engine readings and end stamps hold no prompts and no replies. Their token totals do show how much each engine worked between checks, your own use of it outside Saylek included.

Engine readings and end stamps start only when Saylek's server accepts them. A machine sends them only on a connection where the server has accepted readings, and the server accepts them on no connection before the privacy notice states them.

Stopping sharing is the only way to stop engine readings and end stamps. Run saylek host stop. Your machine then starts no new reads of its engines and sends none, Saylek's server releases the live readings it holds for the machine, and end stamps still waiting on your machine to be sent are removed rather than sent.

Deleting your account does not yet remove them. End stamps, reading counts and live readings stay after your account is deleted, and they keep arriving for as long as the machine stays connected. To stop them arriving, stop sharing before you delete your account; what is already kept then ends on the times in the table.

If you run TensorRT-LLM with its statistics turned on: Saylek reads those statistics first, on every check. Each read empties them for every other reader, so any other tool on your machine that reads them sees only what built up since Saylek's last read. A read takes seconds.

The boundary is social, not cryptographic

Saylek's answer to "who can see my requests" is who runs the machine that serves them, not encryption:

  • Your requests go to machines of people who share with you, or to your own machines.
  • If you joined a group, one an organization runs or one anyone can join, they also go to everyone in it.
  • The person whose machine serves your request can see what it serves. No setting changes that.

The honest rule of thumb: do not send anything you would not hand to the person whose machine runs it. It is the same judgement you already make about who you let watch your screen. See Sharing and access for how to see who that is.

Turning egress off

Two controls, and both can only force a request to stay local. Neither can ever force a request out.

Persistent: local-only mode

Set in ~/.saylek/config.toml:

[federation]
local_only = true

With this on, Saylek will not route a request through your machine to anyone else. It serves locally or it fails.

Be precise about the scope, in three directions.

It covers requests that go through your machine, because that is where it is read. A request an application sends straight to Saylek's hosted API with an application key never passes through your machine, so local-only does not apply to it.

It stops your prompts, uploads, and completions going to another member. Saylek still talks to our servers for the ordinary running of your account, such as signing in, checking who shares with you, and looking for updates. Local-only is a content control, not an airgap.

It also does not override an upstream you configured yourself. If you have registered a proxy upstream in upstreams.toml and you call a model that resolves to it, the request is forwarded there, local-only or not. That is deliberate in the sense that you set it up, but it is not what "local-only" sounds like, so: local-only governs Saylek's routing, not a destination you added by hand. If you want nothing forwarded anywhere, turn the upstream off as well.

Be clear about the trade: if your machine has no GPU capable of serving the model, every such request now fails. That is the honest semantics, not a bug. Local-only means local, including when local cannot answer.

Per request: a header

For a single call, without changing your config:

curl http://127.0.0.1:8443/v1/chat/completions \
  -H "x-saylek-local-only: 1" \
  -H "Content-Type: application/json" \
  -d '{"model": "MODEL_ID", "messages": [{"role": "user", "content": "hello"}]}'

The header forces that one request local. It cannot override persistent local-only mode to force egress.

Giving up access withdraws it

Giving up access withdraws that person's machine, not egress. With nobody sharing with you, a request your machine cannot serve can still run on another machine of your own. With no other machine of your own either, it has nowhere to go and is refused.

Once Saylek tells you that you have given up access, none of your later requests reaches that person's machine. A request that was already running there when you gave up access is not stopped. If Saylek's registry cannot confirm that its record of who shares with you is current, it sends your requests to nobody who shares with you until it can. Such a request fails with an error that asks you to retry, or it runs on another machine of your own. If you want requests through your machine to stay on it, set local-only, which takes effect at once because it is read on your side.

What receipts prove

Every request that goes through your machine and completes mints a signed receipt. One that fails or is stopped part-way does not, and neither does a request an application sends straight to Saylek's hosted API. A receipt served elsewhere names the serving machine by its key fingerprint, co-signed by both sides. Verifying is offline, and the command depends on whether you want one receipt or all of them:

saylek receipt show <id> --verify   # one receipt, with the signature check appended
saylek receipt verify --all         # walk every receipt under ~/.saylek/receipts/

saylek receipt verify on its own does nothing on purpose: batch verification is the kind of thing you should have to ask for explicitly, so it refuses without --all.

Receipts proveReceipts do not prove
This request ran on this machine, on this model, at this timeThat the content stayed private from that machine
Both parties attest to itAnything about confidentiality

A verified receipt means "this is who ran it". It does not mean "this was private". The machine signing your receipt is the same one that saw your prompt. saylek receipt show <id> says exactly this in plain language before it prints the audit body.

You do not need the daemon, or an account, to check a receipt. saylek-verify is a separate program built from the receipt code alone, and a test in the repository fails the build if it ever links daemon code, so what checks a receipt cannot be what produced it. Download it from https://saylek.com/b/VERSION/saylek-verify-TARGET, where TARGET is macos-arm64 or linux-x86_64 and https://saylek.com/m/stable names the current VERSION. Its minisign signature is at the same path with .minisig added. No sample receipt is published yet, so without an account there is nothing to run it against.

What we do not claim

  • Not encrypted from the machine that serves it. A request served elsewhere is readable there. It is TLS-encrypted in transit, which protects it from anyone in between, not from the people it is travelling to.
  • Not confidential compute. Making a serving machine unable to read what it runs (enclaves, content-blinding) is a V-Next direction under assessment. It is not in the current release, and nothing here depends on it.
  • Not "your prompt is never written to disk anywhere." Saylek has an opt-in debugging setting ([debug] traces = true) that writes prompts and replies to a plaintext file so an operator can see what their own machine is doing. It is off by default, and as the code stands another person's request does not reach that writer. But that is because of how the request happens to be shaped, not because a rule stops it. We are turning that into an actual rule.

If you point Saylek at a different registry with an http:// address it will use an unencrypted connection and will not warn you. Do not do that outside a trusted local network.

Next steps

Last checked 2026-10-08 · read as markdown at /docs/privacy-and-egress.md