Site conventions

quick follows the conventions most static hosts use. There is no configuration file: everything is a file in your folder.

URLs

Not found and single-page apps

_redirects

A _redirects file at the root of the site defines redirects, rewrites and proxies, one rule per line, in the Netlify style:

/old      /new                            301   # redirect (302, 307, 308 too; 301 if omitted)
/*        /index.html                     200   # rewrite: catch-all for a single-page app
/api/*    https://api.example.com/:splat  200   # proxy: call an API from the same origin

_headers

A _headers file at the root of the site sets response headers per path, in the Netlify style: a path, then the headers indented under it.

/*
  X-Frame-Options: DENY
/assets/*
  Cache-Control: public, max-age=31536000, immutable
  Access-Control-Allow-Origin: *

Search engines

Sites on a quick address are drafts and internal work, so they stay out of search results: every response on <site>.<your-domain> carries X-Robots-Tag: noindex, nofollow, pages as well as images, fonts and scripts.

What is never uploaded

Exclusions are decided in three tiers:

  1. Security, always. Hidden files (.git, .env, .quick and so on, except .well-known) and secrets (*.pem, *.key, id_rsa, keystores). This tier cannot be overridden.
  2. Convenience, by default. node_modules/, vendor/, *.log and temporary files.
  3. .quickignore, if present. It replaces tier 2. Gitignore syntax, with ! to bring a file back. quick ignore writes one with the defaults already in it.

Run quick status or quick deploy --dry-run to see what is in and what is out. A folder named __quick/ at the root is refused: that path belongs to quick.

Precompressed files and Unity WebGL

x.js.br, x.wasm.gz, x.data.br, x.json.gz (Brotli .br or gzip .gz) are served with the type of the inner file and the right Content-Encoding, so the browser decompresses them itself. A Unity WebGL build deploys as it is, with any compression setting: Brotli, Gzip or "decompression fallback" .unityweb: when that file is compressed, quick serves it with the right Content-Encoding too, which starts faster than Unity's own loader. Other .gz files, such as archives, stay normal downloads.

Builds compressed as a whole change everywhere on every build, so they gain little from incremental deploys. Publish them uncompressed if upload time matters more than file size.

Size limit

A site can take up to 100 MB per version, unless the server sets another default. Bigger sites, such as game builds with video, need an administrator to raise that site's limit (quick limit <site> 1.5GB, or the site's page in the dashboard). quick limit <site> shows the current one and who the administrators are. A deploy over the limit is refused before anything changes on the site, and the message says who to ask.

Incremental deploys

The CLI splits files into content-defined chunks of about 64 KiB and uploads only the chunks the server doesn't already have in the published version. Changing part of a large file sends a few chunks; a renamed file sends nothing. The CLI reports what it really sent, for example uploaded 9.2 KB of 3.1 MB. Against an older server, or a busy one, it uploads the whole folder.

quick.js

Every site can import a small library from /__quick/quick.js (an ES module; types at /__quick/quick.d.ts).

<script type="module">
  import quick from "/__quick/quick.js";
  const user = await quick.id.me(); // { email } for signed-in visitors, null on public sites or after an access code
</script>

This page as Markdown