Skip to content
Syno Package Land
Language: English

synology-app.yaml reference

synology-app.yaml sits next to compose.yaml in a project made with synopkgland init -t compose. synopkgland check validates it. Unknown top-level keys are accepted by the schema, but only the fields below have an effect. The task-first walkthrough is in Container apps.

FieldTypeRequiredDefaultDescription
schemaintegerYesNoneMust be 1.
packagestringYesNonePackage identifier. Up to 32 characters (CONTRACT_PACKAGE_TOO_LONG); over 28 gives PACKAGE_IDENTITY_TOO_LONG because deploy --dev adds .dev.
versionstringYesNonePackage version. -0001 is appended when there is no -<number> suffix.
displaynamestringYesNoneName shown in Package Center.
descriptionstringYesNonePackage description.
maintainerstringYesNoneMaintainer name.
os_min_verstringYesNoneMinimum DSM version, for example "7.2.1-69057". The container floor is 7.2.1-69057.
adminprotocolstringNoNoneProtocol for the package’s web entry. Not used when the app goes through the gateway.
adminportintegerNoNoneHost port of the web UI. It must equal exactly one published TCP host port. Leave it out for a headless app.
adminurlstringNoNonePath appended to the web entry.
installmapNoNoneInstallation wizard settings, keyed by name.
install.<name>.typestringYesNoneOne of string, boolean, secret, shared_folder, dsm_user, homes, posix_all_shares.
install.<name>.defaultstring, booleanNoNoneDefault value. Not allowed for homes and posix_all_shares.
install.<name>.generatebooleanNoNoneGenerate a value at install time.
integrationmapNoNoneHow the app integrates with DSM. Only web is allowed.
integration.webmapNoNoneWeb entry settings. Requires adminport.
integration.web.launchstringNodsm-windowdsm-window (DSM main-menu and desktop entry that opens a new browser tab) or new-page (Package Center Open only).
integration.web.cookieslist of stringsNoNoneCookies to forward through Web Station. Only meaningful with access: public; the gateway drops all cookies. id and did are never forwarded.
integration.web.accessstringNodsm-usersdsm-users, dsm-admins, dsm-groups or public.
integration.web.groupslist of stringsOnly with dsm-groupsNoneDSM group names (at least one).
integration.web.portalmapNoNoneNot available. A Compose app has no executor; check fails with CONTRACT_PORTAL_REQUIRES_EXECUTOR. An administrator can set up a reverse proxy in DSM instead.
permissionsnoneNoNoneAlways rejected.
privilegemapNoNoneAccepted so the error is clear; every flag below is always rejected.
privilege.privilegedbooleanNoNoneAlways rejected (COMPOSE_PRIVILEGED_FORBIDDEN).
privilege.host_networkbooleanNoNoneAlways rejected (COMPOSE_HOST_NETWORK_FORBIDDEN).
privilege.host_pidbooleanNoNoneAlways rejected (COMPOSE_HOST_PID_FORBIDDEN).
privilege.host_ipcbooleanNoNoneAlways rejected (COMPOSE_HOST_IPC_FORBIDDEN).
privilege.devicesbooleanNoNoneAlways rejected (COMPOSE_DEVICES_FORBIDDEN).
privilege.cap_addbooleanNoNoneAlways rejected (COMPOSE_CAP_ADD_FORBIDDEN).
iconstringNoSDK default iconSquare PNG of at least 256×256 inside the project, or a directory of icon_<size>.png with icon_256.png. Used for Package Center and the DSM window (CONTRACT_ICON_INVALID).
reproducibleobjectNoNoneSettings for build --verify-reproducible; see reproducible builds.
reproducible.inputsstring[]NoNoneDependency files, relative to the project, whose SHA-256 forms the fingerprint, for example compose.yaml. At most 64.
reproducible.cleanstring[]NoNonePaths removed before the second build. May use {arch}. At most 64.
i18nmapNoNoneTranslations. Only info is allowed (CONTRACT_I18N_INVALID).
i18n.infomapNoNoneKeyed by zh-TW, zh-CN, ja, ko, de, fr, es or it; English stays in displayname and description. Writes INFO displayname_<lang> and description_<lang>; with launch: dsm-window it also localizes the DSM main-menu and desktop label.
i18n.info.<name>.displaynamestringNodisplaynameOne line without " or \. Once any translation exists, the top-level displayname and description follow the same rule.
i18n.info.<name>.descriptionstringNodescriptionOne line without " or \.
metadatamapNoNonePackage Center listing details. No other keys are allowed.
metadata.changelogstring, mapNoNoneUp to 16000 characters, or a map of up to 32 locales.
metadata.contact_emailstringNoNoneEmail address.
metadata.support_emailstringNoNoneEmail address.
metadata.homepagestringNoNoneURL starting with http:// or https://.
metadata.source_urlstringNoNoneURL starting with http:// or https://.
metadata.issues_urlstringNoNoneURL starting with http:// or https://.
metadata.licensestringNoNoneLicense name.
metadata.maintainer_urlstringNoNoneURL starting with http:// or https://.
metadata.distributorstringNoNoneDistributor name.
metadata.distributor_urlstringNoNoneURL starting with http:// or https://.
metadata.support_urlstringNoNoneURL starting with http://, https:// or mailto:.
metadata.helpurlstringNoNoneURL starting with http:// or https://.
metadata.long_descriptionstring, mapNoNoneUp to 16000 characters, or a map of up to 32 locales.
metadata.screenshotslist of stringsNoNoneUp to 12 http:// or https:// URLs, each up to 2048 characters.

The string fields package, version, displayname, description, maintainer and os_min_ver must not be empty, contain control characters or contain ${ (CONTRACT_INVALID_STRING). capabilities is not a field of a container app (CAPABILITY_UNSUPPORTED).

Reference a setting in compose.yaml as ${<name>}. A name matches ^[A-Za-z_][A-Za-z0-9_]*$.

typeWizard fieldRules
stringText field, not blankDefault up to 256 characters, no control characters, no ${ (INSTALL_STRING_TOO_LONG, INSTALL_STRING_INVALID).
booleanCheckboxValue is true or false.
shared_folderShared Folder pickerUse as a bind source.
dsm_userUser pickerAt most one (CONTRACT_DSM_USER_DUPLICATE). Adds <name>_UID, <name>_GID and <name>_GROUP_1 to <name>_GROUP_8. The build sets user on every service.
posix_all_sharesNoneNo default or value allowed. Use as a whole bind source with no suffix. Only deploy can fill it.
homesNonecheck warns (CONTRACT_HOMES_UNSUPPORTED); deploy refuses it. No path or default allowed.
secretNonecheck warns (CONTRACT_SECRET_UNSUPPORTED); deploy refuses it.

A string, boolean, shared_folder, homes or posix_all_shares setting that Compose never references gives INSTALL_PARAMETER_UNREFERENCED. Declaring a shared_folder without a dsm_user gives DSM_USER_REQUIRED (a warning for your own builds, an error for a Community listing).

RuleCode
No build:COMPOSE_BUILD_FORBIDDEN
No privileged: trueCOMPOSE_PRIVILEGED_FORBIDDEN
No network_mode: hostCOMPOSE_HOST_NETWORK_FORBIDDEN
No pid: host or ipc: hostCOMPOSE_HOST_PID_FORBIDDEN, COMPOSE_HOST_IPC_FORBIDDEN
No devices or cap_addCOMPOSE_DEVICES_FORBIDDEN, COMPOSE_CAP_ADD_FORBIDDEN
No socket mounts (/var/run/docker.sock, the Container Manager socket, any */docker.sock)COMPOSE_SOCKET_MOUNT_FORBIDDEN
No host paths; ./sub inside the project is allowedCOMPOSE_HOST_BIND_FORBIDDEN
Bind sources: ${SYNOPKG_PKGVAR}, ${SYNO_APP_SECRETS_DIR}, or a shared_folder, homes or posix_all_shares settingCOMPOSE_BIND_SOURCE_FORBIDDEN, COMPOSE_BIND_SOURCE_UNDECLARED
Sub-path after ${X} matches (/[A-Za-z0-9._-]+)+COMPOSE_BIND_SUFFIX_INVALID
Named volumes are declared under top-level volumes:COMPOSE_NAMED_VOLUME_UNDECLARED
user: is not set when a dsm_user existsCOMPOSE_USER_CONFLICTS_DSM_USER
No user: 0, 0:0 or root when a shared_folder existsCOMPOSE_USER_ROOT_FORBIDDEN
No numeric user:COMPOSE_USER_NUMERIC_FORBIDDEN
The adminport host port is published on 127.0.0.0/8 or ::1COMPOSE_GATEWAY_PORT_EXPOSED
No pure-number string in command or entrypoint listsCOMPOSE_NUMERIC_COMMAND_ARG_FORBIDDEN
No top-level secrets: or configs:; every ${NAME} is declaredCOMPOSE_DYNAMIC_ROUTE_UNSUPPORTED
depends_on names an existing serviceCOMPOSE_SERVICE_NOT_FOUND

Images that are not pinned by digest are reported as a risk. synopkgland images pin pins them. See Errors for what each code means.