App Contract

You keep native Docker Compose plus a small App Contract. Developer Kit generates everything else. There is no second Compose DSL.

Minimal layout

Local Inner Loop projects and Community Repository Packaging Definitions use the same files:

compose.yaml
synology-app.yaml
icon.png
README.md

When publishing to Community Repository, the directory name must equal package in synology-app.yaml (for example apps/com.example.notes/).

Minimal synology-app.yaml

schema: 1
package: com.example.notes
version: 1.4.0
displayname: Example Notes
description: A private notes application for your NAS.
maintainer: Example Community Maintainer
os_min_ver: "7.2-69057"

Field names mirror SPK INFO where they already exist. New names appear only for install parameters, identity, file scopes, and other semantics Compose and SPK cannot express. Omit arch when all OCI image manifests share the same architecture.

What you do not commit

  • App source code or Dockerfiles (those live in your upstream repo).
  • Built SPK, generated INFO, wizard artifacts, or release Compose.
  • Registry credentials or OCI layers.

Community Repository holds reviewable Packaging Definitions — enough to rebuild an App Package, not your full application tree.

Managed Profile default

v1 Managed Apps use declarative App Contract fields only. Extended SPK Profile exists for controlled overlays but is not the default path. See the Developer Kit specification for install-parameter binding rules: names map directly to Compose variables, secret names, or Shared Folder bind sources — no binding DSL.