Skip to content

docs: the documentation of spawner.run, and Traefik 3.7 - #22

Merged
Flosk6 merged 9 commits into
masterfrom
docs/launch-review
Oct 10, 2026
Merged

Flosk6 merged 9 commits into
masterfrom
docs/launch-review

Conversation

@Flosk6

@Flosk6 Flosk6 commented Oct 10, 2026

Copy link
Copy Markdown
Owner

What and why

The website (spawner.run, a separate repository) builds its documentation from docs/*.md and CHANGELOG.md. An adversarial review of that site found what this pull request fixes: pages that were false or missing, a quick start that cannot work (it never registers the project), no guide for previews of pull requests, and links that lead to a stale branch. It also found that the installer pins Traefik 3.5, which no longer gets security fixes.

Traefik 3.7

  • TRAEFIK_IMAGE moves to traefik:v3.7@sha256:575fa15b… (3.7.14, the digest of the index from docker buildx imagetools inspect). The advisories published since 3.5's end of support are fixed in 3.6 and 3.7 only, among them a bypass of path-scoped routing and middlewares, request smuggling and a header sanitization bypass.
  • Every entry point drops request headers whose name holds a character other than a letter, a digit or a dash (aliasheadersstrategy=delete, from 3.7.12): PHP or CGI read X_Spawner_Preview or X.Forwarded.For as the dashed name, which the middlewares remove or set. Spawner's own headers are dashed. An application that relies on a header with an underscore would stop receiving it (nginx drops them by default too). The development stack runs the same option.
  • Traefik 3.7 embeds lego v5, which dropped the DNS providers azure (use azuredns), dnspod, googledomains, cloudxns, brandit, iwantmyname and iij (use iijdpf): in the changelog.
  • Follow-up, not here: Traefik 3.7 logs two warnings per forwardAuth middleware at each configuration rebuild while trustForwardHeader and maxResponseBodySize are unset (router.service.ts).

Installer

  • Below 4 GiB of memory, the defaults fit no environment: it says so and names SPAWNER_ENV_MEMORY and MIN_REQUIRED_FREE_MEMORY_GB.
  • An /opt/spawner holding only .env and dns.env is accepted, as on a new server restored from a backup (the marker is read from .env); --upgrade stops when compose.yaml is missing.
  • Messages: links to spawner.run, the Let's Encrypt e-mail is the account's contact, the Compose hint for Ubuntu's Docker, --purge says it deletes the secrets.

CLI, dashboard, release

  • spawner init links spawner.yaml to https://spawner.run/docs/manifest/ instead of the v1 branch; the agent instructions say what to do on exit code 6; a 90-day token no longer expires "in 89d 24h".
  • The dashboard's Docs button opens https://spawner.run/docs/ (the latest release's docs, rather than the running tag's directory on GitHub).
  • npm: homepage https://spawner.run, the description, keywords people search with, and mcpName. A last release job publishes server.json to the official MCP Registry (GitHub OIDC, stable releases, after npm, unable to block it); 2.1.0 on npm has no mcpName, so the first listing comes with the next release.
  • Release notes open with what Spawner is, give the install and upgrade commands apart, list the files, and verify them with the attestations or SHA256SUMS. Image labels point to the site.

Documentation

  • New pages: quickstart.md, ci.md (GitHub Actions and GitLab CI), examples.md, troubleshooting.md.
  • Corrections: 4 GiB minimum; a restore the installer accepts; uninstall and local install from the release URL; the compose policy as the code applies it (build.platform is refused); memory shared between services; public URLs never wake an environment; GitHub login creates accounts for members of its organization; every key of spawner.yaml; every CLI option, variable and error code; the nine MCP tools; more agents; "capacity" instead of "room"; the dashboard's names since 2.1.0.
  • The facts of fix: sources a project lists, connections that lose access, uploads that stop at a limit #18 to fix(install): the low findings of the review on the installer, the image and the data #21 carried into the rewritten pages: source repositories, CPU and process budgets, NET_RAW, the firewall, no bootstrap token by default, attestations, the local secrets that stay home, the 5 queued uploads. configuration.md no longer says the Settings page overrides SPAWNER_ENV_CPUS and SPAWNER_ENV_PIDS: only the environment sets them.
  • README and npm page: what Spawner is, links to the site, the quick start with the registration, the MCP tools.

Before merging

  • The README, spawner init and the Docs button point to https://spawner.run, which is not online yet: the site goes live right after this merges, then follows each release.
  • .github/assets/dashboard-*.png are the site's current screenshots, whose sidebar still says v2.0.0: to retake on a 2.1 stack.

Checks

  • Tests next to the code (format.spec.ts, init.spec.ts), and the end-to-end check below still to run

  • Documentation and CHANGELOG.md updated when the behaviour changes

  • pnpm lint, pnpm typecheck and pnpm test pass: 578 tests (core 231, api 219, utils 24, cli 104).

  • install.sh: bash -n after the merge with master; shellcheck 0.11.0 was clean on the version before it. The secret prompts were checked through a pty and the non-interactive paths in a Debian container; the installer's compose.yaml renders and parses in the three TLS modes.

  • release.yml is valid YAML and its 12 run blocks pass bash -n.

  • The site builds from these docs with no broken link or anchor.

  • Not run: scripts/e2e-engine.sh with Traefik 3.7 (docker compose pull traefik && scripts/e2e-engine.sh), needed before merging; the workflows of ci.md were checked statically, never run on GitHub or GitLab.

- Traefik 3.5 no longer gets security fixes: TRAEFIK_IMAGE moves to
  traefik:v3.7, pinned by the digest of its index (3.7.14). Its entry
  points drop the request headers whose name holds a character other than
  a letter, a digit or a dash (aliasheadersstrategy=delete): PHP or CGI
  read X_Spawner_Preview or X.Forwarded.For as the dashed name, which
  Traefik's middlewares remove or set. The development stack runs the
  same option.
- Below 4 GiB of memory, the default settings fit no environment: the
  installer says so, at the check and in its summary, and names
  SPAWNER_ENV_MEMORY and MIN_REQUIRED_FREE_MEMORY_GB.
- An /opt/spawner holding only .env and dns.env is an installation of
  this installer, as on a new server restored from a backup: the marker
  is read from .env, and --upgrade stops when compose.yaml is missing.
- Messages: links go to spawner.run; the Let's Encrypt e-mail is the
  account's contact (no expiry e-mails since 2025); the missing Compose
  hint names docker-compose-v2 for Ubuntu's Docker; --purge says it
  deletes the secrets too.
… code 6

- The spawner.yaml that init writes links to
  https://spawner.run/docs/manifest/ instead of the v1 branch of the
  repository; init ends with the address of the quickstart, and --help
  with the CLI reference.
- The instructions init writes for coding agents say what to do on exit
  code 6, and call what `url --with-token` gives the preview token
  header, as the docs do. The help says 6 is quota or capacity.
- spawner_up's path says it defaults to the first root the client shares.
- A 90-day token expires "in 90d", not "in 89d 24h": rounded hours carry
  into a day.
It opened the docs/ directory of the running version's tag on GitHub; it
opens https://spawner.run/docs/, which describes the latest release.
…Spawner is

- The published package.json: homepage https://spawner.run, the
  description of Spawner, the keywords people search with, and mcpName
  io.github.Flosk6/spawner.
- A last job publishes server.json to the official MCP Registry through
  GitHub OIDC, for stable releases, once npm has the version: it cannot
  undo or block the publish.
- The notes open with what Spawner is and links to the docs and the
  changelog, give the install and upgrade commands apart, list the files,
  and show how to verify them, with the attestations or SHA256SUMS.
- Image labels carry the same description, and the url and documentation
  of spawner.run, in the Dockerfile as in the workflow.
- The Documentation link of the issue chooser opens the site.
…bleshooting

- quickstart.md: from a fresh server to a first environment, with the
  steps no page gave: an admin registers the project (each field of the
  dialog, deploy keys for private repositories, source repositories),
  then spawner init and spawner up.
- ci.md: a preview per pull request from GitHub Actions and per merge
  request from GitLab CI, with a CI account and a token restricted to the
  project, the quota, forks, and pull_request_target never.
- examples.md: what the two example projects run and show, and how to try
  one.
- troubleshooting.md: the message of each usual failure and what to do.
- install: 4 GiB of memory at least, not 2; uninstall and the local
  install download the installer from the release, as upgrades do, and
  the local install needs Linux; --purge also deletes /opt/spawner, its
  backups and the master secret; the ports, the outbound connections and
  no telemetry; answers given through the environment.
- operations: a restore on a new server that the installer accepts;
  GitHub login set up step by step; admin.js invite links last 24 hours.
- manifest: every key of spawner.yaml with its type, default, rules and
  refusal; the codes of a refused .spawner/; what an application needs
  behind Spawner; the Dockerfile example builds again; services without
  mem_limit share what is left; public URLs never wake an environment.
- security: the compose policy lists what it allows, refuses and sets,
  with its limits (build platform is refused); accounts also come from
  GitHub login for members of its organization.
- concepts: what Spawner is, the words readers search with, and what
  Spawner does not do, moved from the README.
- cli and agents: every command and option, the environment variables
  and files, the error codes, the nine MCP tools; VS Code, Gemini CLI and
  Devin Desktop; Codex's tool timeout; permission rules for Claude Code.
- "capacity" instead of "room", named table headers, and the dashboard's
  names since 2.1.0.
The README opens with the mark, what Spawner is, links to the site, the
dashboard in both themes and the terminal; its quick start registers the
project; its documentation links go to the site, and "What Spawner does
not do" to the page of concepts that now holds it. Both pages give the
nine MCP tools and the line that adds the server to Claude Code.
The repository tests with Vitest.
@Flosk6
Flosk6 merged commit 76d5814 into master Oct 10, 2026
4 checks passed
@Flosk6
Flosk6 deleted the docs/launch-review branch October 10, 2026 12:00
@Flosk6 Flosk6 mentioned this pull request Oct 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant