How to Add Custom Documentation Sources to Context Hub: A Complete Guide
Add custom documentation sources to Context Hub by defining them in ~/.chub/config.yaml and pointing to either a local directory containing a built registry or a remote CDN URL.
Context Hub is an open-source knowledge management system developed by Andrew Ng's team (andrewyng/context-hub) that aggregates documentation and skills from multiple sources. While it ships with public registries, organizations often need to add custom documentation sources to Context Hub to incorporate private APIs, internal wikis, or proprietary knowledge bases.
Understanding the Source Configuration System
Context Hub loads its knowledge base from one or more "sources" defined in the user-level configuration file. The system distinguishes between remote sources (CDN URLs) and local sources (filesystem paths).
In cli/src/lib/config.js, the loadConfig() function (lines 25-48) reads ~/.chub/config.yaml and constructs the config.sources array. Each source object must include:
name: A unique identifier for the sourceurl: For remote CDN-hosted registriespath: For local directory-based registries
Building a Custom Documentation Registry
Before you can add custom documentation sources to Context Hub, you must build a valid registry from your content files.
Step 1: Prepare Your Content Structure
Organize your Markdown files with front-matter in a directory tree. Each documentation entry should include a DOC.md file with metadata:
---
id: mycompany/internal-api
title: Internal API Reference
description: Authentication and endpoints for internal services
---
Step 2: Generate the Registry
Use the CLI build command to compile your content into a Context Hub-compatible registry:
chub build my-content/ -o .chub-local/
This command, implemented in cli/src/commands/build.js, generates three critical files in the output directory:
registry.json: The main registry containing all entries and metadatasearch-index.json: Optimized search index for fast queriesmeta.json: Version and configuration metadata
Configuring Multiple Sources in Context Hub
Once you have built your local registry, you must register it in the Context Hub configuration to add custom documentation sources alongside public ones.
Editing the Configuration File
Modify ~/.chub/config.yaml to include your custom source:
sources:
- name: community
url: https://cdn.aichub.org/v1
- name: internal
path: /home/you/.chub-local
source: community,internal
The source: field controls which sources are trusted for lookups. When you add custom documentation sources to Context Hub, including them in this list ensures they are available for search and retrieval operations.
How Context Hub Merges Multiple Sources
In cli/src/lib/registry.js, the getMerged() function (lines 97-112) handles the aggregation of all configured sources:
- Iterates over
config.sources - Calls
loadSourceRegistry(source)for each entry to read itsregistry.json - Tags every document with
_source(the source name) and_sourceObj(the full source configuration) - Caches the merged result in
_mergedfor subsequent lookups
The isMultiSource() helper (lines 107-110) returns true when config.sources.length > 1, enabling the CLI to display source labels for entries with colliding IDs (e.g., internal:openai/chat).
Accessing Custom Documentation
After you add custom documentation sources to Context Hub, you can query them using standard CLI commands:
Search Across All Sources
chub search "authentication"
This searches both the public CDN and your internal registry simultaneously.
Retrieve Specific Entries
chub get internal:mycompany/internal-api
If the ID is unique across all sources, you can omit the source prefix:
chub get mycompany/internal-api
Summary
- Configuration: Define custom sources in
~/.chub/config.yamlwithnameand eitherurl(remote) orpath(local) attributes. - Building: Use
chub build <input> -o <output>to generateregistry.json,search-index.json, andmeta.jsonfrom Markdown content. - Merging: Context Hub automatically merges all configured sources via
getMerged()incli/src/lib/registry.js, tagging entries with their origin. - Usage: Access custom documentation using source-prefixed IDs (
internal:doc-id) or search across all sources simultaneously.
Frequently Asked Questions
How do I structure my local documentation directory for Context Hub?
Create a nested directory structure where each documentation entry resides in its own folder containing a DOC.md file with YAML front-matter. The front-matter must include an id, title, and description. You can also include a references/ subdirectory for related Markdown files. Run chub build pointing to the parent directory to compile everything into a valid registry.
Can I mix remote CDN sources with local custom sources?
Yes. Context Hub supports hybrid configurations. In ~/.chub/config.yaml, define some sources with url pointing to CDN endpoints and others with path pointing to local directories. The getMerged() function in cli/src/lib/registry.js loads and combines all sources regardless of their origin, tagging each entry with its _source attribute so you can distinguish between them.
What happens if two sources define the same document ID?
When multiple sources contain identical IDs, Context Hub enters multi-source mode (detected by isMultiSource() in cli/src/lib/registry.js). You must use the source prefix syntax to disambiguate: chub get sourcename:document-id. The CLI will display the source label for colliding entries, ensuring you retrieve the correct documentation from your custom or public sources.
Is there a performance penalty for adding multiple custom sources?
Context Hub caches the merged registry in memory after the first call to getMerged(), so subsequent lookups are fast. However, initial startup time increases slightly with each additional source because loadSourceRegistry() must read and parse each registry.json file. Local file system sources generally load faster than remote CDN sources, which require network round-trips.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →