What hosti is

Hosti is a self-hosted catalog for the static bundles AI agents generate. An agent pushes a folder, the folder gets a URL, and the owner browses everything ever pushed and shares single bundles by link.

There are no users. There is the owner, and there are people holding links. Hosti runs as one container with one data volume, on your own VPS.

Push, catalog, share

agent  hosti push ./out --slug q3-report
         |
hosti  new revision, lands private
         |
owner  previews it in the catalog
         |
agent  hosti share q3-report --mode link
         |
reader opens /v/q3-report/

1. Push

An agent runs hosti push on a folder with an index.html at its root. The CLI sends it as one gzipped tarball. The slug names the bundle. Pushing an unknown slug creates the bundle. Pushing the same slug again adds the next revision and moves current onto it, then prunes: the newest five revisions stay by default and the rest are deleted.

The owner can also drop a .zip or a .tar.gz on the catalog in the browser. Both ways in go through the same limits and the same entry-file rule.

2. Catalog

The owner logs in with the owner password and sees every bundle, newest push first. Each card runs the bundle's current revision, scaled down, in a sandboxed frame. That preview needs the owner's login, so it works on a private bundle too.

3. Share

A push never changes the sharing state, so every bundle arrives private and answers 404 at its share link. The owner, or an agent whose push token has the share scope, moves it to link or pin. The share link is /v/<share-slug>/, and the share slug is the bundle slug until a rotate replaces it.

The words hosti uses

The catalog, the CLI and these docs use the same words.

bundle
One static site: a directory of files with an entry file, normally index.html. Named by a slug, for example garmin-q3.
revision
One archive landing on a bundle. The same slug again makes a new revision and moves the current pointer.
catalog
The full set of bundles, and the owner's web UI that browses it and takes uploads.
collection
A flat, named group of bundles, such as reports. A bundle is in zero or one.
sharing state
One of private, link or pin. One bundle, one state.
share link
The one public path to a bundle, at /v/<share-slug>/. It answers only while the state is link or pin.
rotate
Minting a fresh share slug. The old address stops answering at once.
pin
Four to eight digits the owner types to guard a bundle's link. Hosti stores only a hash.
push token
The bearer secret an agent or the CLI uses to write. It carries scopes. A browser never uses one.

The catalog's pages

Every page here needs the owner's login.

/login                   the owner password, one field
/                        every bundle, newest push first
/c/reports               one collection; /c/- is the bundles no push put in one
/b/garmin-q3             one bundle: preview, revisions, sharing, collection, delete
/b/garmin-q3/preview/    the bundle itself, for the owner's eyes only
/upload                  drop an archive here; the drop zone posts to it
/tokens                  the agent prompt, every push token with its scopes, revoke
/connect/<id>            approve or deny one agent connection

What hosti leaves out

  • Accounts. The owner password is the only login.
  • View counts. Hosti keeps no record of who opened a link: no counters, no hit table, no addresses.
  • Expiry. A share link answers until the owner goes private, rotates or deletes the bundle.
  • Subdomains. Bundle URLs are paths on one domain, so links inside a bundle must be relative.