A site is a source tree with no server build. Ordinary files are published to the edge CDN; files whose first line is a #! shebang become handlers at the same hostname. This page covers file routing and static delivery; the handlers guide covers executable routes. HTML or Markdown files with data bindings become server-rendered HTML applications on the same site.

routes from paths

index.html             -> /
about.html             -> /about
guide.md               -> /guide
logo.png               -> /logo.png
api/visit.sh           -> /api/visit      (handler)
blog/[...].py          -> /blog/*         (handler catch-all)

.html and handler extensions are stripped. index is the directory index, so about/index.html serves /about/. A bracket catch-all owns its subtree and receives the remaining path as PATH_INFO. Two files claiming one route fail the deploy.

The deploy output prints the resolved route table.

Markdown and public files

Markdown renders to HTML at publish time. index.md, _index.md, or README.md can be a directory index, making a documentation tree a static site with no build step.

A public/ directory is copied to the site root verbatim. Its files are served as-is rather than Markdown-rendered.

fallback routes

For a site with no services, a Kedge Compose extension can set an SPA fallback:

x-kedge:
  static:
    fallback: /index.html

An unmatched path then serves that static file. Without a fallback, the edge answers 404 without waking compute.

If repository scripts contain shebangs but are not web handlers, exclude their directories explicitly:

x-kedge:
  static:
    handler-excludes: [scripts, tools]

publishing a tree

kedge up deploys a local directory through Git. For a one-off upload, scp the tree to the SSH endpoint; a trailing remote directory names the app. A single piped page is the smallest case in the quickstart. See deploy workflows for Git history, previews, and other source paths.

Static responses carry validators and edge-cache headers. Deploying updates the route manifest and purges stale objects automatically; there is no cache configuration step. Network & domains describes the global serving path.