The Early Access module enables the GitHub Docs team to publish documentation for features that are in limited access (beta, technical preview, etc.) without exposing the content in the public github/docs repository.
This system allows for:
- Private Content Hosting: Storing sensitive or unreleased documentation in a separate, private repository (
github/docs-early-access). - Seamless Integration: Merging this private content into the main site build so it appears native to the user (e.g., under
/en/early-access). - Access Control: Hiding these pages from public navigation and search engines, making them accessible only via direct links or specific "Early Access" index pages.
Early access content lives in a separate private repository: github/docs-early-access.
- Structure: It mirrors the main repo's structure (
content/,data/,assets/). - Integration: During the build process (or local development), files from the private repo are copied or symlinked into the main
docs-internaldirectory.
The logic for serving and listing these pages is handled in src/early-access/middleware/early-access-links.ts.
earlyAccessContext: This middleware runs on requests to/early-access. It:- Checks if the user is on an early access path.
- Retrieves a list of hidden pages whose path starts with
early-access. - Injects these links into the rendering context (
req.context.earlyAccessPageLinks), allowing index pages to dynamically list available early access content.
A suite of scripts in src/early-access/scripts manages the workflow:
clone-locally: Clones the privatedocs-early-accessrepo for local development.symlink-from-local-repo.ts: Symlinks the cloned content into the maincontent/andassets/directories so the Next.js server can see them.merge-early-access.sh: Used in CI/CD to physically move files from the checked-out private repo into the build directory.update-data-and-image-paths.ts: A utility to fix up paths when moving content between the main repo and early access.
To work on Early Access content locally:
-
Clone the Repo:
npm run clone-early-access
This clones
github/docs-early-accessinto a sibling directory. -
Symlink Content:
npm run symlink-from-local-repo
This links the content into
docs-internal. -
Run the Server:
npm start
You can now access pages at
http://localhost:4000/en/early-access.
- Create markdown files in the
docs-early-accessrepo. - Ensure the frontmatter includes
hidden: trueto prevent it from appearing in the main sidebar navigation (unless specifically desired). - Use the
early-accessdirectory prefix.
github/docs-early-access: The private repository containing the actual content.- CI/CD Workflows: The deployment process must have access to the private repo to merge the content before building.
- Team:
@github/docs-engineering - Content Owners: The Writers and Product Managers responsible for the specific early access features.
- "Hidden" but Public: While the source is private, once deployed to
docs.github.com, the pages are technically public if you know the URL. They are "security through obscurity" (hidden from nav/search), not authenticated. - Build Complexity: The merging process adds complexity to the build pipeline and can sometimes cause confusion with path resolution or asset loading if files are moved incorrectly.