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 examplegarmin-q3. - revision
- One archive landing on a bundle. The same slug again makes a new revision and moves the
currentpointer. - 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,linkorpin. One bundle, one state. - share link
- The one public path to a bundle, at
/v/<share-slug>/. It answers only while the state islinkorpin. - 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.