Skip to Content
DocumentationReferenceconfig.json options

Details of all options available in config.json

When adding a new app to the Companion App Store, you need to create a config.json file in the app’s folder. This file contains all the information needed to run the app. Below you can find all the options available in the config.json file.

Three parts of the manifest end up as environment variables in the running container: form_fields ask the user for values at install time, hub_integration.mcp_client injects Hub’s MCP endpoint, and hub_integration.inference maps Hub’s model settings onto the variable names your app expects:

OptionDescriptionExample valueRequired
nameName of the appNextcloudyes
idThis should be the same name as the foldernextcloudyes
availableIf set to false, the app will not be available in the app storetrueyes
short_descShort description of the appNextcloud is a suite of client-server software for creating and using file hosting services.yes
authorName or URL of the app’s author or maintainerhttps://nextcloud.com yes
portPort used by the app. This port will be exposed to the host. Omit it for apps with no_gui.8100yes, unless no_gui
categoriesOne or more categories for the app. Valid values: agents, ai, automation, books, companion-intelligence, data, development, featured, finance, gaming, media, mcp, music, network, photography, security, social, utilities[“utilities”, “network”]yes
descriptionLong description of the app. The store listing also reads metadata/description.md.Nextcloud is a suite of client-server software for creating and using file hosting services.no
cihub_app_versionApp manifest version. Defaults to 1 when omitted. Increment it when you change compose or config10no
cihub_versionOlder spelling of cihub_app_version. Hub still reads it. The Runtipi-era tipi_version is no longer read1no
versionThe actual version of the app (not the Companion Hub version)1.25.1yes
sourceLink for git repositoryhttps://github.com/nextcloud/docker yes
websiteLink to the official websitehttps://nextcloud.com no
exposableIf set to true, the app will allow the user to expose it via a domain name. Defaults to true.trueno
force_exposeIf set to true, the app will require a domain name.trueno
generate_vapid_keysIf set to true, the app will generate VAPID keys for web push notifications. VAPID_PUBLIC_KEY and VAPID_PRIVATE_KEY will be available as environment variablestrueno
url_suffixIf set, the app will be accessible at https://<your-domain>/<url_suffix>my-appno
httpsIf set to true, the app will be accessible via https only.trueno
no_guiSet to true for apps with no GUI. Open button will be hiddentrueno
supported_architecturesIf the app is only available for a specific architecture, you can specify it here. If not given, app will be available for all architectures[“arm64”, “amd64”]yes
uid, gidThese parameters allow you to give a specific set of permission for the app’s data folder. Companion Hub will automatically chown the data directory with the provided gid and uid. Both options need to be specified in order to apply1000no
form_fieldsForm fields allow you to prompt the user for input during the install, like a username or a passwordSee belowno
dynamicRuntipi-era flag. Hub does not read it. Use dynamic_config, which defaults to true. See Dynamic Composetrueno
deprecatedIf the app is deprecated it won’t exist in the app store and it will notify users that is no longer maintained.falseno
min_hub_versionMinimum Companion Hub version for this app. Hub records it but does not check it before installing0.2.60no
min_cihub_versionOlder spelling of min_hub_version. Hub still reads it. The Runtipi-era min_tipi_version is no longer read0.2.60no
dynamic_configUse docker-compose.json dynamic compose. Defaults to true and is the only format the store shipstrueno
hub_integrationOpt-in Hub features: MCP client, inference variable mapping — see below{ "mcp_client": true }no
created_atThe date the app was created. You can use new Date().getTime() in your browser console to get the current timestamp1724134938430no
updated_atThe date the app was last updated. You can use new Date().getTime() in your browser console to get the current timestamp1724134938430no
replacesNames of popular proprietary products this app replaces. Store search and the Alternatives view read it[“Google Drive”, “Dropbox”]no
screenshotsStore-listing gallery images, as absolute URLs or relative paths[“metadata/screenshots/1.png”]no
demo_videoStore-listing demo video, as an absolute URL or a relative pathmetadata/media/demo.mp4no
force_pullIf set to true, Hub pulls the app’s images again on every install, start, and restarttrueno
runtime_platformPins every service in the app to one Docker platform, such as linux/amd64 on an Apple Silicon Hublinux/amd64no
gpu_requirementsAccelerator the app needs. Hub shows it on the app’s details page. type is cuda, rocm, or oneapi; the last two are Linux only and need host_devices{ "type": "cuda", "optional": false, "host_platforms": ["linux"] }no
mcpMarketplace listing for a Model Context Protocol server: transport (stdio or http), command, args, env, and a tool manifestSee the marketplace docsno
privacyThe developer’s data-handling declaration: declared_by, declared_at, and a collects list. An absent block means undeclared, not “collects nothing”See the marketplace docsno

Sometimes an app requires additional information to run, such as a username or a password. Use the form_fields property in the config.json file to request that information. Here’s an example:

{ "form_fields": [ { "type": "text", "label": "Username", "max": 50, "min": 3, "required": true, "env_variable": "NEXTCLOUD_ADMIN_USER" }, { "type": "password", "label": "Password", "max": 50, "min": 3, "required": true, "env_variable": "NEXTCLOUD_ADMIN_PASSWORD" } ] }

You can choose between different types of fields. The app will automatically validate the user input before submitting.

TypeDescriptionExample value
textA string of textusername
passwordWill be hidden on typingpassword
emailAn email addresstest@example.org
numberAny number123
fqdnFully qualified domain nameexample.org
ipAny valid IPv4 address192.168.2.100
fqdnipCombination between IPv4 and FQDN192.168.2.100 or example.org
urlA URLhttps://example.org/path
app_base_urlThe address people use to reach the app. The install dialog fills it with the URL Hub resolved for the app, and Hub keeps it in step with the app’s exposure settings unless you typed your ownhttps://nextcloud-mydevice.example.org
randomGenerate a random value for the user2e318419a49b70ad93766a5d6eb54d9ebbcceaeadd57c5f6897dbbe10afbc880
booleanA checkboxtrue or false

Here is a table of the available form_field properties:

NameDescriptionExample valueRequired
typeThe type of the form field to use, see above.text✅
labelThe label to show the user.Nextcloud Username✅
hintA small hint to show the user.The username you want to use for nextcloud❌
placeholderA placeholder for the form fielduser❌
defaultAdd a default value, used only if the required option is set to falseuser❌
regexUse a regex pattern to verify the user input^[0-9]+\.[0-9]+\.[0-9]+$❌
pattern_errorThe error to show when the regex pattern validation failsInvalid username❌
minThe minimum length for a text or password input5❌
maxThe maximum length for a text or password input100❌
requiredWhether the form field is required or nottrue✅
env_variableThe name of the variable you’ll use in your docker-compose.yml file.NEXTCLOUD_USERNAME✅
optionsOptions for multi-selectSee below❌
encodingUsed only in addition to random type. Specify the random value encoding (base64 or hex)base64❌
alias_env_variablesUsed with app_base_url. Also writes the resolved value to these environment variables[“APP_URL_ALIAS”]❌
trailing_slashUsed with app_base_url. Adds a trailing slash to the values written to the aliasestrue❌

When you use the random field type for a password or secret, the min value determines the generated string length. If min is omitted, a default length of 32 characters is used.

Using options in form fields

You can create a form field with options like this in your config.json. It will be rendered as a multi-select dropdown in the UI. label is what will be shown to the user and value is the actual value the environment variable will be set to when the corresponding option is selected.

{ "label": "Select your favorite fruits", "type": "text", "required": true, "options": [ { "label": "Apple", "value": "apple" }, { "label": "Banana", "value": "banana" }, { "label": "Orange", "value": "orange" } ], "env_variable": "fruits" }

Use options only when there are only specific pre-defined values for the field. If a user might want to use a custom value, use a normal text field and provide common examples in the label.

Hub integration (hub_integration)

Apps can opt in to Hub-provided environment variables and services.

MCP client

First-party agent apps ci-openclaw and ci-hermes ship with hub_integration.mcp_client: true by default so Hub MCP is wired automatically on install. Other agent apps can opt in the same way:

{ "hub_integration": { "mcp_client": true, "wake_endpoint": "/hooks/hub-wake", "wake_port": 3000, "sse_events": false } }

wake_endpoint defaults to /hooks/hub-wake. ci-openclaw sets it to /hooks/wake and sets wake_port to its setup and proxy port, 18789. Hermes declares no wake registration.

When enabled, Hub injects HUB_URL, HUB_MCP_URL, HUB_MCP_API_KEY, and HUB_WAKE_SECRET into the app’s environment. HUB_MCP_API_KEY is a key Hub creates for that app alone and revokes when you uninstall it.

An app with mcp_client: true publishes its host port on 127.0.0.1 only, because it holds a key that can drive the Hub. Reach it from another device through Private VPN or the public web.

Inference variables

AI apps map standardized Hub inference keys to their own env variable names:

{ "hub_integration": { "inference": { "llm_base_url": "LLM_API_BASE", "llm_api_key": "LLM_API_KEY", "chat_model": "LLM_DEFAULT_CHAT_MODEL", "embedding_model": "LLM_DEFAULT_EMBEDDING_MODEL", "vision_model": "LLM_DEFAULT_VISION_MODEL", "ollama_host": "OLLAMA_HOST" } } }
Hub keyHub resolves toDescription
llm_base_urlOpenAI-compatible base URLThe engine’s /v1, this Hub’s pool proxy, or a cloud provider
llm_api_keyAPI keyA placeholder such as "ollama" unless the app calls the engine directly
chat_modelChat model IDFrom preferences or hardware recommendations
embedding_modelEmbedding model IDFrom preferences or recommendations
vision_modelVision model IDFrom preferences or recommendations
ollama_hostNative Ollama URLDirect Ollama API (not OpenAI-compatible)
ollama_embed_hostNative Ollama URL for embeddingsThe server embedding_base_url names, without /v1. Kept for older manifests
embedding_base_urlEmbedding base URLOpenAI-compatible /v1 URL of the engine that embeds for the app, or this Hub’s pool proxy
utility_modelUtility model IDA smaller installed model for background calls, otherwise the chat model
num_ctxContext window in tokensSized to the model and this machine’s memory

See AI & Inference for resolution order and setup.

Other options

KeyWhat it does
inference_providerFor apps with a provider switch. Give it { "env": "APP_LLM_PROVIDER", "ollama": "ollama", "openai_compatible": "openai" }. Hub writes the ollama value when Ollama is the chat backend, and the openai_compatible value for any other saved engine (vLLM, Lemonade, or oMLX). A cloud provider on its own doesn’t switch it.
llm_base_url_strip_v1Set to true to remove a trailing /v1 from the resolved llm_base_url, for apps that expect a bare origin.
oidc{ "issuer_env": "CI_OIDC_ISSUER", "issuer_path": "/api/auth" }. Hub writes the paired CI Account’s identity-provider address into issuer_env, with issuer_path appended if you give one.
memoryConnects an app to Companion Memory. A consumer, such as an agent, names the variables it reads with url_env and token_env, and Hub fills them when you connect the app. url_style is origin (the default) or api_base. Companion Memory itself declares provider with its service and port.
readiness{ "service": "app-gateway", "port": 8642, "path": "/health", "bearer_env": "APP_SEED" }. While the app runs, Hub probes this endpoint and shows failing checks in the app’s runtime health. The service must be a service in the app’s own compose file. bearer_env names a variable in the app’s generated environment whose value Hub sends as a bearer token.
edge_auth{ "default": true } switches the install form’s authentication toggle on by default, for apps with no login of their own. It can turn authentication on, never off. An app that sets it also publishes its host port on 127.0.0.1 only.
Last updated on