Skip to main content

GitHub

Sync pipeline

What happens between git push and your site going live — step by step, including incremental syncs, .nookignore, and how to read a deploy that did nothing.

Every deploy starts the same way: a push lands on the branch your project syncs from, GitHub notifies NookDocs, and a sync run works through the commit. This page walks the run in order — useful when a deploy didn't do what you expected and you want to know which step decided that.

The steps, in order

A deployment opens

The push event creates a deployment record — that's the "building" row you see under Deployments, tied to the commit SHA it is processing.

Find the config

The sync lists the repository tree and locates nookdocs.config.json. In a monorepo the folder containing the config becomes the base — everything else resolves relative to it, which is how subtree setups work without extra configuration.

Config first, content second

The config is fetched, validated and stored before any page is read — it decides the contentRoot the rest of the run filters by. Validation never rejects a deploy: errors and ignored-key warnings go to the deploy log, and the site keeps serving the last good config for anything broken.

Apply .nookignore

Patterns in a .nookignore file exclude matching paths from sync — gitignore syntax, relative to the base.

Filter to content

Only Markdown/MDX inside the content root becomes pages. Repo noise — README.md at the root, AGENTS.md, planning folders — never turns into a docs page by accident.

Incremental or full

A normal push syncs only the files that changed in it — added and modified pages are re-fetched, removed pages are deleted, everything else is untouched. The first sync of a project, and a manual Resync, scan everything.

Pages upsert

Each changed file's frontmatter is parsed and the page row updated — this is the moment a page's Updated date changes, search indexes the new text, and the URL starts serving the new content.

OpenAPI, when it changed

If the config names an api.openapi spec and this push touched it, the spec is re-fetched and re-parsed — that's what feeds the generated API reference and the playground. Untouched specs are left alone.

The deployment closes

The record flips to ready with counts of what happened. The log keeps the per-file detail.

Reading a surprising deploy

The pipeline is the same for managed and self-hosted repos, and the same whether the commit came from git push, the editor's Save, or an agent. One write path, one set of rules.

Was this page helpful?

Last updated August 11, 2026