This course is in beta. Only the beginner tracks are written so far, and content may still change. Found a mistake or something unclear? Open an issue on GitHub - feedback is very welcome.
Section 1 of 11

Getting your ExApp into the world — why packaging matters

ExApp packaging is significantly different from PHP app packaging. A PHP app is a zip of source files — Nextcloud unpacks it and loads the PHP directly. An ExApp is a Docker image — Nextcloud tells AppAPI to pull and run a container. This means:

  • The app store doesn't host your code — it hosts a reference to your Docker image on a registry (GitHub Container Registry, Docker Hub, etc.)
  • Every release requires building and pushing a new Docker image, not just creating a tarball
  • Your image must support both linux/amd64 and linux/arm64 to work on all Nextcloud server hardware
  • appinfo/info.xml must include the <docker-install> block pointing to your image

The upside: updates are atomic, rollback is straightforward (just re-register the previous image tag), and your runtime environment is perfectly reproducible.