Manifest Specification
Every connector requires a manifest.yaml file describing its metadata, permissions, and configuration.
Full Schema
# === REQUIRED ===
name: string# Unique identifier. Lowercase, underscores allowed.# Example: "notion_export"
version: string# Semantic version: MAJOR.MINOR.PATCH# Example: "1.0.0"
description: string# Short description (< 100 chars)# Example: "Import Notion workspace from export ZIP"
author: string# Author name or handle# Example: "community" or "alice@example.com"
license: string# SPDX license identifier# Example: "MIT"
# === COMPATIBILITY ===
requires_hoard: string# Hoard version constraint (pip-style)# Example: ">=1.0.0,<2.0.0"
requires_python: string# Python version constraint# Example: ">=3.11"
# === PERMISSIONS (INFORMATIONAL IN v1) ===
permissions: filesystem: read: list[string] # Paths connector needs to read. # Example: ["${config.export_path}"]
write: list[string] # Paths connector writes (usually empty).
network: domains: list[string] # Domains connector accesses. # Example: ["api.notion.com"]
can_emit_sensitive: boolean # Can set sensitivity="sensitive" on entities. # Default: false
# === CONFIGURATION ===
config_schema: object# JSON Schema for user configuration.
# === ENTRY POINT ===
entry_point: string# Python import path to connector class.# Example: "connector:NotionExportConnector"
# === DEPENDENCIES ===
dependencies: list[string]# pip package requirements.# Example: ["beautifulsoup4>=4.12"]
# === OPTIONAL ===
repository: string# Source repository URL.
documentation: string# Documentation URL.
tags: list[string]# Searchable tags.# Example: ["notion", "export"]Example Manifest
name: notion_exportversion: "1.0.0"description: "Import from Notion export ZIP"author: "community"license: "MIT"
requires_hoard: ">=1.0.0"requires_python: ">=3.11"
permissions: filesystem: read: ["${config.export_path}"] write: [] network: domains: [] can_emit_sensitive: false
config_schema: type: object required: [export_path] properties: export_path: type: string description: "Path to Notion export ZIP or folder" include_attachments: type: boolean default: false description: "Index file attachments"
entry_point: "connector:NotionExportConnector"
dependencies: - "beautifulsoup4>=4.12" - "lxml>=4.9"
repository: "https://github.com/hoard-project/connectors"tags: ["notion", "export", "knowledge-base"]Config Schema
Use JSON Schema to define user configuration:
config_schema: type: object required: [vault_path] properties: vault_path: type: string description: "Path to Obsidian vault" include_daily_notes: type: boolean default: true description: "Index daily notes" chunk_max_tokens: type: integer default: 400 minimum: 100 maximum: 1000Validation runs when connector is enabled.
Permissions
Filesystem Permissions
permissions: filesystem: read: - "${config.export_path}" # User config value - "${config.backup_dir}/*" # Glob patterns - "/tmp/hoard-${connector.name}" write: - "/tmp/hoard-cache/*"Network Permissions
permissions: network: domains: - "api.notion.com" - "*.notion.so"Sensitive Entities
permissions: can_emit_sensitive: trueAllows setting sensitivity="sensitive" on entities.
Config Interpolation
Manifests support ${...} interpolation:
| Variable | Description |
|---|---|
${config.field} | User config value |
${connector.name} | Connector name |
${connector.version} | Connector version |
Example:
permissions: filesystem: read: - "${config.export_path}" # /Users/me/export.zip - "/tmp/${connector.name}-*" # /tmp/notion_export-*Entry Point
Specifies where to load the connector class:
entry_point: "connector:NotionExportConnector"This imports NotionExportConnector from connector.py in the connector directory.
For nested modules:
entry_point: "src.main:MyConnector"Dependencies
List pip packages the connector requires:
dependencies: - "beautifulsoup4>=4.12" - "lxml>=4.9" - "requests>=2.28"These are installed when the connector is enabled.
Validation
Manifests are validated when connectors are loaded. Hoard checks:
- Required fields present
- Version formats valid
- Config schema valid
- Entry point importable