# site
Source for [runner.kjanat.dev](https://runner.kjanat.dev/).
Static site bundled with Bun (`build.ts`) and deployed to a Cloudflare
Worker (`name = "runner"` in `wrangler.jsonc`) via the Static Assets
binding. `src/` is the editable source; `dist/` is the build output and
the directory the Worker actually serves.
## Build
```sh
bun --cwd=site build # bundles src/ → dist/, copies public/ on top
bun --cwd=site dev # local dev server with WS live-reload
bun --cwd=site deploy # build + wrangler deploy
```
The build templates `{{version}}`, `{{repo}}`, `{{authorName}}` etc.
from the workspace `Cargo.toml` so the site and the crate share one
source of truth for metadata. Other scripts live in
[`package.json`](./package.json) (`check`, `lint`, `fmt`, `typecheck`,
`tail`).
First deploy creates the `runner` Worker and provisions the
custom-domain route `runner.kjanat.dev` (Cloudflare auto-issues the
TLS cert; DNS is managed in the same zone). The `.com` route remains
active as a secondary alias.
## Layout
```text
site/
├── src/
│ ├── index.html # landing page (templated by build.ts)
│ ├── 404.html # branded not-found page
│ ├── app/copy.ts # client-side click-to-copy
│ ├── assets/icon.svg
│ └── styles/
├── public/
│ ├── _headers # cache + security headers (CF native)
│ └── robots.txt
├── build.ts # Bun bundler + token substitution
├── dev.ts # dev server + watcher + WS live-reload
├── biome.json # lint config
├── package.json # scripts
└── wrangler.jsonc # Static Assets binding, custom domain
```
`dist/` is gitignored — produced by `build.ts`, consumed by
`wrangler deploy`.