# Internal shell service

Shared, read-only data for every internal tool to fetch directly. Every
response is read-only, non-sensitive, and identical for every caller — there
is no per-user data, no authentication, and no filtering.

## Access model

The only protection is which hostname is calling: an allowed `Origin` (for
cross-origin calls) or an allowed request hostname (for same-origin calls,
e.g. hitting this docs hostname directly). Currently allowed hostnames:
`utm.basworld.online`, `shell.basworld.online`, `localhost`, `127.0.0.1`.
This stops other websites from embedding the data in a browser; it does not
stop a direct request, which is fine because nothing served here is
sensitive.

## Conventions

Every endpoint lives at `/{endpoint}/v{major}`. Additive changes
(new optional field, new node type) stay on the current version; breaking
changes ship as a new version alongside the old one. Consumers must skip
unrecognised fields/types rather than erroring.

## Endpoints

- [`GET /nav/v1`](/nav/v1/llms.txt) (current) — The shared navigation menu rendered by every internal tool. Read-only and identical for every caller.

Each endpoint's own `llms.txt` (linked above) has the full field reference,
an example response, endpoint-specific consumer notes, and a fetch/validate/
cache implementation walkthrough. The human-readable version of all of this
is at `/`.
