Website

The public site, rynhult.dev, is a static site built from site/ and this wiki. It has no JavaScript, cookies, analytics or third-party requests, and works in light and dark at phone width. The docs live on the same site at rynhult.dev/docs/; docs.rynhult.dev only redirects there (see Serving). It is not deployed from here: An owner-operated static web server serves a built copy after approval.

What it contains

Path Source
/ site/pages/index.html: what Rynhult is, its main features and the v1.0 scope table
/install/ site/pages/install.html: requirements and links into the Install pages
/download/ site/pages/download.html plus site/release.json
/security/, /license/ site/pages/security.html, site/pages/license.html (the licence text comes from LICENSE)
/docs/… Every page of docs/wiki, generated at build time

Copy on the site follows the same rule as the Guide: describe only what is on main and qualified. Features that are off by default and not fully supported carry a Preview tag; native apps are Later; remote access in v1 is through a VPN or Tailscale.

Build and check it

The build uses the Markdown parser the app's Guide already ships (micromark with GFM, from web/node_modules), so it adds no dependencies. With npm ci done in web/:

node site/build.mjs                 # writes site/dist (ignored by git)
node --test site/test/site.test.mjs # links, anchors, no external resources, AA contrast, no premature release claims
python3 -m http.server <your port> --bind 127.0.0.1 --directory site/dist
PLAYWRIGHT_BROWSERS_PATH=… node site/test/review.mjs http://127.0.0.1:<your port> <screenshot folder>

review.mjs runs axe (WCAG 2.2 A/AA) and a sideways-scroll check on sample pages at 1440 and 390 px, light and dark, and saves screenshots.

How the wiki becomes /docs/

  • Each Name.md becomes /docs/<route>/index.html; Home.md becomes /docs/. Folder order follows .order.
  • Absolute links such as /User-Guide/Sessions#worktrees and relative Page.md links are rewritten to /docs/User-Guide/Sessions/#worktrees. Heading ids use the same algorithm as the Guide inside Rynhult, so shared anchors agree.
  • Images from /.attachments/ are copied to /docs/media/ with their pixel size, and load lazily.
  • Wide tables and code blocks scroll inside a focusable region, not the page.
  • The build fails on a link to a page outside the wiki, a missing image or a missing anchor. Run it after wiki changes; it complements acc-wiki-check.

Phases

site/release.json sets phase (or pass --phase to the build):

  • coming-soon (current): only the landing page, Security, Licence and 404 are built: no /docs/, Install or Download, because the wiki isn't cleared for publication yet. Navigation, buttons and the footer point to the GitHub repository in follow ("Follow on GitHub"), and the hero says a release candidate is coming soon. Until then the site says Rynhult will be open source under the MIT licence when the release candidate ships (footer, landing page and Licence page), never that it already is.
  • release: the full site described above, including /docs/.

Pages that exist only in the release phase say "phases": ["release"] in their header; {{#soon}}…{{/soon}} and {{#release}}…{{/release}} keep text for one phase. The site tests build both phases and check that neither links to a page it doesn't contain.

Releases

site/release.json also drives the release notice and the Download page. While version is null, the site says the release candidate is in preparation and lists no files. At release, set version, channel and assets (name, URL, description and SHA-256 for each file) and rebuild.

Typeface

Noto Sans, the brand typeface, is self-hosted as one variable-weight Latin subset (about 35 KB, site/assets/fonts/), preloaded and shown with font-display: swap. Other scripts fall back to system fonts. Provenance and its SHA-256 are in site/assets/fonts/README.md; the OFL licence is in THIRD_PARTY_NOTICES.md (generated by scripts/third_party_notices.py).

Serving

Owners deploy the built site by hand; nothing in this repository deploys. The following is a generic deployment example, not a record of the public host.

Example static-site host

  • Server. A supported Caddy release, configured in /etc/caddy/Caddyfile. It serves the built files from /srv/rynhult-site.
  • Names. rynhult.dev serves the site; www.rynhult.dev redirects to it.
  • Certificates. Caddy's automatic Let's Encrypt certificates.
  • Headers. Strict-Transport-Security: max-age=31536000, X-Content-Type-Options: nosniff, Content-Security-Policy: frame-ancestors 'none' (the rest of the policy is in each page's meta tag) and Referrer-Policy: no-referrer.
  • Errors. handle_errors serves /404.html.
  • Deploys. Copy a fresh site/dist to /srv/rynhult-site.new, then swap directories: the live copy becomes /srv/rynhult-site.prev and .new becomes /srv/rynhult-site. To roll back, swap .prev back in.

At the release

  • Docs. docs.rynhult.dev will permanently redirect to the same path under https://rynhult.dev/docs/, so docs.rynhult.dev/User-Guide/Install lands on rynhult.dev/docs/User-Guide/Install. In Caddy, for example:

    docs.rynhult.dev {
    	redir https://rynhult.dev/docs{uri} permanent
    }
    
  • Paths. Release-phase pages live at folder addresses with a trailing slash (/docs/User-Guide/Install/). Redirect a path without one to the slash form when that folder exists.

  • Caching. Cache the hashed stylesheet (site.<hash>.css) and the font for a long time; pages briefly.

This page is generated from docs/wiki/Internal/Website.md; the same page is under Guide inside Rynhult.