Extension Specification

This document describes the homeboy.json extension manifest format used by the Homeboy CLI and (via the CLI) the desktop app.

Overview

Extensions extend Homeboy with custom functionality. Each extension is a self-contained directory with:

  • homeboy.json – Manifest file (required)
  • Optional scripts (executed by the CLI based on runtime.* commands)
  • Optional assets and configuration

Installation location

Homeboy Desktop is macOS-only.

The desktop app stores installed extensions under its AppPaths root:

  • Desktop config root (single source of truth: AppPaths):
    ~/Library/Application Support/Homeboy/
    
  • Extensions:
    ~/Library/Application Support/Homeboy/extensions/<extension-id>/
    

Homeboy Desktop installs/links extensions by running the CLI (homeboy extension install ...), but the desktop app does not assume it shares the same on-disk config root as the CLI (dirs::config_dir()/homeboy).

Note: the CLI embeds its core documentation in the binary (see homeboy docs).

Extension responsibilities

Homeboy extensions can:

  • define project type behavior for the platform (discovery, CLI templates, DB templates, deploy verification, version parsing patterns, etc.)
  • define executable tools (optional runtime.* section) runnable via homeboy extension run

The manifest is a single unified homeboy.json file; extensions include only fields they need.

For the authoritative runtime behavior, see homeboy/docs/commands/extension.md.

Manifest Schema

Root Object

FieldTypeRequiredDescription
idstringYesUnique identifier (lowercase, hyphens)
namestringYesDisplay name
versionstringYesSemantic version (e.g., "1.0.0")
iconstringYesSF Symbol name
descriptionstringYesShort description
authorstringYesAuthor name
homepagestringNoURL to documentation/repo
configSchemastringNoProject-type config schema identifier (platform behavior)
discoveryobjectNoProject discovery commands (platform behavior)
cliobjectNoProject-type CLI template (platform behavior)
databaseobjectNoProject-type DB templates (platform behavior)
deployarrayNoDeployment verification rules (platform behavior)
versionPatternsarrayNoVersion parsing rules by file/extension (platform behavior)
buildobjectNoBuild behavior (platform behavior)
commandsarrayNoAdditional CLI command names this extension provides (platform behavior)
runtimeobjectNoExecutable runtime configuration (for homeboy extension run)
inputsarrayNoInput field definitions (for executable extensions)
outputobjectNoOutput configuration (for executable extensions)
actionsarrayNoAction button definitions (for executable extensions)
settingsarrayNoPersistent settings (merged across scopes by the CLI)
requiresobjectNoExtension/component requirements for activation

Runtime Object

Executable extensions use the CLI runtime contract described in homeboy/docs/commands/extension.md.

The manifest’s runtime object configures shell commands that the CLI runs (for example runCommand, setupCommand, and optional readyCheck). The CLI injects execution context and merged settings via environment variables.

Requirements Object

Extensions can declare dependencies on project configuration (components, feature flags, and project type). Extensions with unmet requirements appear disabled in the sidebar.

FieldTypeRequiredDescription
componentsarrayNoComponent IDs that must exist in the active project config
featuresarrayNoRequired feature flags (supported: hasDatabase, hasRemoteDeployment, hasRemoteLogs, hasCLI)
projectTypestringNoRequired project type (e.g. wordpress)

Input Object

FieldTypeRequiredDescription
idstringYesUnique input identifier
typestringYes"text", "stepper", "toggle", or "select"
labelstringYesDisplay label
placeholderstringNoPlaceholder text (for text inputs)
defaultanyNoDefault value
minintNoMinimum value (for stepper)
maxintNoMaximum value (for stepper)
optionsarrayNoOptions for select type
argstringYesCLI argument name (e.g., "--tag")

Output Object

FieldTypeRequiredDescription
schemaobjectYesOutput data schema
displaystringYes"table", "json", or "log-only"
selectableboolYesWhether rows can be selected

Schema Object

FieldTypeDescription
typestringAlways "array"
itemsobjectColumn definitions as {column_name: "string"} (null for console-only output)

Action Object

FieldTypeRequiredDescription
idstringYesUnique action identifier
labelstringYesButton label
typestringYes"builtin" or "api"

Builtin Actions

FieldTypeDescription
builtinstring"copy-column", "export-csv", or "copy-json"
columnstringColumn name (for copy-column)

API Actions

FieldTypeDescription
endpointstringAPI path (e.g., "/admin/newsletter/bulk-subscribe")
methodstringHTTP method ("POST", "GET", etc.)
requiresAuthboolWhether authentication is required
payloadobjectRequest body with template interpolation

Template Variables:

  • {{selected}} – Array of selected result rows
  • {{settings.key}} – Value from extension settings

Setting Object

FieldTypeRequiredDescription
idstringYesSetting key
typestringYes"text", "toggle", or "stepper"
labelstringYesDisplay label
placeholderstringNoHelp text
defaultanyNoDefault value

Extension output

For homeboy extension run, the CLI streams the extension process output to the console and determines success/failure based on exit code.

If your extension is intended for use in Homeboy Desktop’s dynamic UI, structure your extension homeboy.json using the inputs/output/actions/settings fields documented in this file.

Examples

Desktop-focused extension (dynamic UI)

~/Library/Application Support/Homeboy/

Project configuration

Project configuration requirements (local environment settings, subtargets, and CLI template variables) are defined by the CLI and the active project type.

Use the CLI as the source of truth:

  • homeboy docs project
  • homeboy docs extension