# `DocShell.Presentation.StaticExporter`
[🔗](https://github.com/futhr/doc_shell/blob/v2.0.0/lib/doc_shell/presentation/static_exporter.ex#L1)

Builds and atomically publishes a complete static documentation site.

Renderers only return bytes and logical assets. The exporter owns output
paths, content hashing, local-link admission, finite budgets, staging,
replacement and rollback. It never invokes a network client or external
build process. Search adapters follow the same rule: they return local assets
and an inert query contract rather than writing into the destination.

The completed tree includes rendered routes, redirects, a not-found page,
content-hashed renderer assets, search data, a deterministic manifest,
sitemap and robots files, and compact/full machine-readable documentation.
Publication happens only after the in-memory output and staged filesystem
tree pass validation. A failed replacement preserves the prior destination or
reports the retained recovery path.

# `manifest`

```elixir
@type manifest() :: map()
```

The deterministic manifest payload written as `site-manifest.json`.

# `export`

```elixir
@spec export(keyword()) :: {:ok, manifest()} | {:error, term()}
```

Renders, validates, and atomically replaces one static site destination.

Required options are `:site`, `:renderer`, and `:destination`. Optional
`:search_adapter`, renderer/search option lists, `:canonical_origin`, finite
`:limits`, and an explicit `:generated_at` value customize the build. The
exporter does not synthesize timestamps, contact a network service, or start
the host application.

On success, returns the decoded `doc-shell-static-site/v1` manifest. Expected
renderer, validation, resource, and filesystem failures return tagged errors;
callback exceptions are contained at the renderer/adapter boundary.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
