GitHub Pages and other hosts

Reading time 4 min

GitHub Pages serves static files, not the optional Node editor. Build the reader with selected MarkStack source, then publish only its reviewed artifact through the chosen GitHub Pages workflow. Hosting a private source repository does not by itself make its website private.

Choose repository and path

Site shape Configured prefix
User, organization root Empty path prefix
Project under repo name Matching repository path
Root custom domain Empty path prefix, configured final origin
Private project site Observed unique address, access policy; recheck prefix

Example project reader at https://example.github.io/field-guide:

{
  "siteTitle": "Field Guide",
  "headerTitle": "Field Guide",
  "siteUrl": "https://example.github.io/field-guide",
  "baseUrl": "/field-guide",
  "showHero": false
}

This is illustrative config, not a verified live address. Merge intended fields into the selected full config, not a blind overwrite that loses policy/customization. Templates use baseUrl; authored Markdown URLs need /field-guide deliberately. Test images/search/deep reload at the actual prefix. A local root-only check is insufficient.

The pin’s 404 Return Home link is literal /. Verify it and other authored paths rather than claiming complete automatic subpath conversion. Metadata uses configured siteUrl, not the GitHub deployment URL automatically.

Publishing options

Route Contract
Branch root Reviewed generated files at selected branch root
Branch /docs Reviewed artifact at that selected folder
Actions Build, upload, deploy complete reviewed artifact
External CI to branch Reviewed rendered commit plus Pages deploy workflow

GitHub’s current documentation recommends a custom Actions workflow for non-Jekyll generation. For branch publishing of prebuilt output, an empty .nojekyll at publishing root disables the default Jekyll build. Branch source folder is root or /docs, not an arbitrary presumed dist selector.

# In a disposable reviewed rendered-artifact root only.
touch .nojekyll

This creates a file; it does not push, enable Pages or deploy. Review the exact repository/branch/folder and final commit before sending to a production-connected source. Keep source/private runtime out of an artifact repository.

Branch setup sequence

  1. Prepare reviewed generated files with home index.html at publishing root.
  2. Confirm selected repository and existing publishing branch.
  3. In repository Pages settings, select branch publishing and intended branch/root or /docs.
  4. Inspect the triggered deployment/workflow status.
  5. Use the observed Visit site URL and test the complete reader.

The Pages site is deployed through an Actions workflow even with branch publishing. Current guidance says workflow commits using GITHUB_TOKEN do not trigger a Pages build. If an external CI process pushes output, review that trigger/identity behavior rather than assuming any commit fires the same deployment.

Repositories containing symbolic links require an Actions publishing workflow under current GitHub guidance. Do not use public output symlinks to reach private files. Copy/select intended artifact bytes and inspect their audience.

Actions build boundary

Phase Requirement
Checkout Selected intended source revision
Node, install Supported pin requirement and committed lockfile
Tests, build Failure stops deployment
Artifact Complete generated output, no private runtime
Deploy Actual Pages environment, permissions, approval
Verify Observed URL, status and current reader bytes

Choose current supported official actions/permissions for your organization. This page does not invent an untested workflow version/policy or create one in your account. The key MarkStack commands are locked install, tests and build, with output dist unless explicitly selected otherwise. Reader hosting needs no editor/account process.

Public versus private reading

Choice Audience consequence
Ordinary Pages publish Public internet, even with private repo when allowed
Enterprise private project Eligible org project with repository-reader access
Organization site Current private access-control option does not apply
External private host Host gate must cover pages, index, assets
noindex/hidden sidebar Not confidentiality controls

Current GitHub private project publication requires GitHub Enterprise Cloud and eligible organization-owned private/internal project repositories. Enterprise Managed Users have additional enterprise-only policy. Verify your plan/org policy before relying on it; do not infer privacy from a repository lock icon.

Private Pages uses an observed unique subdomain, which may require changing build prefix. Custom domains remain a separate Pages settings/API operation; a repository CNAME file alone does not add/remove the domain. Record actual returned URL rather than deriving a guessed path from the repository name.

Host acceptance

Target Check
Entry Current home content at actual URL
Deep route Direct reload and directory index handling
Search Current JSON and real heading, page target
Assets CSS, scripts, fonts, notices and media
Missing path Actual 404 status and intended page
Paths Prefix, authored links and 404 home link
Audience No source, accounts, runtime exposed
Browser Both themes, phone, controls and new cache context

Keep generated 404.html with the artifact and inspect real status, not a homepage fallback. A provider success or pushed commit is not reader acceptance. Retain prior reviewed artifact and supported rollback, then verify actual live result after any return.

Other static hosts

Apply the same artifact/audience/path/404/cache requirements. Use a host’s current official build/output/MIME/HTTPS rules. Cloudflare _redirects/_headers are not universal rule files; nginx, Caddy and Apache use their own configuration. Do not paste one format into another host and call it tested.

An already-rendered directory needs no npm build at the host. A source host needs selected Node/lockfile/config/build inputs but not production accounts in public output. Static deployment and Review and release supply release gates.

Official sources

Checked 12 October 2026; no GitHub Pages account or deployment changed: