Skip to content

docs(readme): state the security posture the server actually has [skip-ci] - #518

Merged
RonenMars merged 2 commits into
mainfrom
docs/readme-security-posture
Aug 10, 2026
Merged

docs(readme): state the security posture the server actually has [skip-ci]#518
RonenMars merged 2 commits into
mainfrom
docs/readme-security-posture

Conversation

@RonenMars

Copy link
Copy Markdown
Owner

Closes #473.

Why

The README explained how to install the server and how to expose it to the internet, and never once said what that means.

No mention of the API key being equivalent to a shell on the machine, no mention that there is no spend limit, nothing about what the unattended permission modes remove, and nothing about auto_resume_on_boot being the one setting that starts an agent nobody asked for.

The defaults were already made correctly — bypass modes are unreachable from the first-run prompt, and auto-resume defaults to No and warns at the point it asks. They just were not written down anywhere a new user would meet them.

What this adds

A Security section covering the key as an SSH-grade credential and how to rotate it, the absence of any spend ceiling, what bypassPermissions and dontAsk actually remove, --add-dir widening filesystem scope, and auto_resume_on_boot.

The Remote Access section links to it, since that is the point where a reader decides to expose the server.

A false claim, found by checking rather than inheriting

While verifying the section I checked the README's existing statement that the server "only binds to 127.0.0.1:8766 by default".

It is wrong. src/server.ts:2450 calls this.httpServer.listen(port) with no host argument, which is Node's listen-on-all-interfaces default, and the live instance confirms it:

node  51360  ronenmars  12u  IPv6  TCP *:8766 (LISTEN)

There is also no --host or --bind flag, so an operator who wants loopback-only has no in-product way to get it.

That sentence was the one a reader would have relied on when deciding whether exposure was safe, and repeating it inside a security section would have been worse than leaving the section unwritten. The text now describes the real behaviour and names the consequence: on a home network the exposure is usually fine, on café Wi-Fi or a corporate VLAN it is not.

Whether to change the default is a separate decision with a compatibility cost — LAN access without a tunnel is a real workflow today — so it is tracked as #517 rather than changed here.

Also corrected

Persistence claimed sessions are in-memory and a restart drops them. That predates the managed-session registry: interrupted sessions now come back as resumable stubs from ~/.threadbase/runtime.db.

Verification

Every claim checked against main @ bbdb1e7: the first-run prompt offers only acceptEdits and manual (src/lifecycle/prompt.ts:60-69), auto_resume_on_boot warns and defaults to No (prompt.ts:86-100), POST /api/auth/rotate exists (misc.routes.ts:106), the key is written 0600, and the --max-budget-usd removal is real.

Docs-only, hence [skip-ci].

…p-ci]

The README described how to install and expose the server without once saying that the API key is equivalent to a shell on the machine, that no spend limit exists, or what the unattended permission modes do.

Adds a Security section covering the key as an SSH-grade credential, the absence of any spend ceiling, what bypassPermissions and dontAsk actually remove, and auto_resume_on_boot as the unattended-start switch it is.
The Remote Access section now links to it, since that is where a reader decides to expose the server.

It also corrects a false claim found while verifying the section rather than inheriting it: the README said the server binds 127.0.0.1 by default, but src/server.ts:2450 calls listen(port) with no host, so it listens on every interface and the live instance shows *:8766.
The text now says so, and #517 tracks whether to change the default or keep it.

Persistence was stale in the same direction and is corrected: sessions survive a restart as resumable stubs via the managed-session registry rather than being lost.
@RonenMars
RonenMars merged commit 8c28e42 into main Aug 10, 2026
12 checks passed
@RonenMars
RonenMars deleted the docs/readme-security-posture branch August 10, 2026 18:50
@RonenMars

Copy link
Copy Markdown
Owner Author

🎉 This PR is included in version 1.47.1 🎉

The release is available on:

Your semantic-release bot 📦🚀

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

P0: README states no security posture — no spend ceiling, permission modes, or unattended-start disclosure

1 participant