# TrueNAS SCALE Chart Structure A TrueNAS SCALE chart repository differs slightly in directory structure from upstream repos in that it includes an `app version` directory. A TrueNAS SCALE chart also has three additional files an `app-readme.md` file that provides a high level overview display in the TrueNAS SCALE UI and a `questions.yaml` file defining questions to prompt the user with and an `item.yaml` file outlining item specific details. There are 2 directories `charts` and `test`, each representing a train. Chart releases created from catalog items in a specific train cannot be moved to another train. Currently only the `charts` train can be used inside the UI. ``` charts/ix-chart// app-readme.md # TrueNAS SCALE Specific: Readme file for display in TrueNAS SCALE UI charts/ # Directory containing dependency charts Chart.yaml # Required Helm chart information file questions.yaml # TrueNAS SCALE Specific: File containing questions for TrueNAS SCALE UI README.md # Optional: Helm Readme file (will be rendered in TrueNAS SCALE UI as well) templates/ # A directory of templates that, when combined with values.yml will generate K8s YAML values.yaml # The default configuration values for this chart ``` *See the upstream Helm chart [developer reference](https://helm.sh/docs/chart_template_guide/) for a complete walk through of developing charts.* To convert an upstream chart to take advantage of TrueNAS SCALE enhanced UX, first create an `item.yaml` file. This file among other catalog item information provides a list of categories that this chart fits into. This helps users navigate and filtering when browsing the catalog UI. ``` $ cat charts/ix-chart/item.yaml categories: - generic icon_url: "http://ix_url" ``` After that create `app-readme.md` file. ``` $ cat charts/ix-chart//app-readme.md iX-chart is a chart designed to let user deploy a docker image in a TrueNAS SCALE kubernetes cluster. It provides a mechanism to specify workload type, add external host interfaces in the pods, configure volumes and allocate host resources to the workload. ``` Then add a `questions.yaml` file to prompt the user for something. ``` groups: - name: "Container Images" description: "Image to be used for container" questions: - variable: image description: "Docker Image Details" group: "Container Images" schema: type: dict required: true attrs: - variable: repository description: "Docker image repository" label: "Image repository" schema: type: string required: true - variable: tag description: "Tag to use for specified image" label: "Image Tag" schema: type: string default: "latest" - variable: pullPolicy description: "Docker Image Pull Policy" label: "Image Pull Policy" schema: type: string default: "IfNotPresent" enum: - value: "IfNotPresent" description: "Only pull image if not present on host" - value: "Always" description: "Always pull image even if present on host" - value: "Never" description: "Never pull image even if it's not present on host" ``` The above will prompt the user with 2 text fields and a dropdown in the UI getting details for image configuration in a helm chart. _More information about questions.yaml is available [here](https://wiki.truecharts.org/development/questions-yaml/)_