diff --git a/core/installer/app.go b/core/installer/app.go
index 6312e8b..384e54f 100644
--- a/core/installer/app.go
+++ b/core/installer/app.go
@@ -4,7 +4,6 @@
 	"archive/tar"
 	"compress/gzip"
 	"embed"
-	"encoding/json"
 	"fmt"
 	htemplate "html/template"
 	"io"
@@ -37,16 +36,12 @@
 	Name       string
 	Namespaces []string
 	Templates  []*template.Template
-	Schema     string
+	schema     Schema
 	Readme     *template.Template
 }
 
-func (a App) ConfigSchema() map[string]any {
-	ret := make(map[string]any)
-	if err := json.NewDecoder(strings.NewReader(a.Schema)).Decode(&ret); err != nil {
-		panic(err) // TODO(giolekva): prevalidate
-	}
-	return ret
+func (a App) Schema() Schema {
+	return a.schema
 }
 
 type StoreApp struct {
@@ -140,9 +135,21 @@
 	}
 }
 
+func readJSONSchemaFromFile(fs embed.FS, f string) (Schema, error) {
+	schema, err := fs.ReadFile(f)
+	if err != nil {
+		return nil, err
+	}
+	ret, err := NewJSONSchema(string(schema))
+	if err != nil {
+		return nil, err
+	}
+	return ret, nil
+}
+
 // TODO(gio): service account needs permission to create/update secret
 func CreateAppIngressPrivate(fs embed.FS, tmpls *template.Template) App {
-	schema, err := fs.ReadFile("values-tmpl/private-network.jsonschema")
+	schema, err := readJSONSchemaFromFile(fs, "values-tmpl/private-network.jsonschema")
 	if err != nil {
 		panic(err)
 	}
@@ -153,13 +160,13 @@
 			tmpls.Lookup("ingress-private.yaml"),
 			tmpls.Lookup("tailscale-proxy.yaml"),
 		},
-		string(schema),
+		schema,
 		tmpls.Lookup("private-network.md"),
 	}
 }
 
 func CreateCertificateIssuerPrivate(fs embed.FS, tmpls *template.Template) App {
-	schema, err := fs.ReadFile("values-tmpl/certificate-issuer-private.jsonschema")
+	schema, err := readJSONSchemaFromFile(fs, "values-tmpl/certificate-issuer-private.jsonschema")
 	if err != nil {
 		panic(err)
 	}
@@ -169,13 +176,13 @@
 		[]*template.Template{
 			tmpls.Lookup("certificate-issuer-private.yaml"),
 		},
-		string(schema),
+		schema,
 		tmpls.Lookup("certificate-issuer-private.md"),
 	}
 }
 
 func CreateCertificateIssuerPublic(fs embed.FS, tmpls *template.Template) App {
-	schema, err := fs.ReadFile("values-tmpl/certificate-issuer-public.jsonschema")
+	schema, err := readJSONSchemaFromFile(fs, "values-tmpl/certificate-issuer-public.jsonschema")
 	if err != nil {
 		panic(err)
 	}
@@ -185,13 +192,13 @@
 		[]*template.Template{
 			tmpls.Lookup("certificate-issuer-public.yaml"),
 		},
-		string(schema),
+		schema,
 		tmpls.Lookup("certificate-issuer-public.md"),
 	}
 }
 
 func CreateAppCoreAuth(fs embed.FS, tmpls *template.Template) App {
-	schema, err := fs.ReadFile("values-tmpl/core-auth.jsonschema")
+	schema, err := readJSONSchemaFromFile(fs, "values-tmpl/core-auth.jsonschema")
 	if err != nil {
 		panic(err)
 	}
@@ -202,13 +209,13 @@
 			tmpls.Lookup("core-auth-storage.yaml"),
 			tmpls.Lookup("core-auth.yaml"),
 		},
-		string(schema),
+		schema,
 		tmpls.Lookup("core-auth.md"),
 	}
 }
 
 func CreateAppVaultwarden(fs embed.FS, tmpls *template.Template) StoreApp {
-	schema, err := fs.ReadFile("values-tmpl/vaultwarden.jsonschema")
+	schema, err := readJSONSchemaFromFile(fs, "values-tmpl/vaultwarden.jsonschema")
 	if err != nil {
 		panic(err)
 	}
@@ -219,7 +226,7 @@
 			[]*template.Template{
 				tmpls.Lookup("vaultwarden.yaml"),
 			},
-			string(schema),
+			schema,
 			tmpls.Lookup("vaultwarden.md"),
 		},
 		Icon:             `<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50" viewBox="0 0 48 48"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M35.38 25.63V9.37H24v28.87a34.93 34.93 0 0 0 5.41-3.48q6-4.66 6-9.14Zm4.87-19.5v19.5A11.58 11.58 0 0 1 39.4 30a16.22 16.22 0 0 1-2.11 3.81a23.52 23.52 0 0 1-3 3.24a34.87 34.87 0 0 1-3.22 2.62c-1 .69-2 1.35-3.07 2s-1.82 1-2.27 1.26l-1.08.51a1.53 1.53 0 0 1-1.32 0l-1.08-.51c-.45-.22-1.21-.64-2.27-1.26s-2.09-1.27-3.07-2A34.87 34.87 0 0 1 13.7 37a23.52 23.52 0 0 1-3-3.24A16.22 16.22 0 0 1 8.6 30a11.58 11.58 0 0 1-.85-4.32V6.13A1.64 1.64 0 0 1 9.38 4.5h29.24a1.64 1.64 0 0 1 1.63 1.63Z"/></svg>`,
@@ -228,7 +235,7 @@
 }
 
 func CreateAppMatrix(fs embed.FS, tmpls *template.Template) StoreApp {
-	schema, err := fs.ReadFile("values-tmpl/matrix.jsonschema")
+	schema, err := readJSONSchemaFromFile(fs, "values-tmpl/matrix.jsonschema")
 	if err != nil {
 		panic(err)
 	}
@@ -240,7 +247,7 @@
 				tmpls.Lookup("matrix-storage.yaml"),
 				tmpls.Lookup("matrix.yaml"),
 			},
-			string(schema),
+			schema,
 			nil,
 		},
 		`<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50" viewBox="0 0 24 24"><path fill="currentColor" d="M.632.55v22.9H2.28V24H0V0h2.28v.55zm7.043 7.26v1.157h.033a3.312 3.312 0 0 1 1.117-1.024c.433-.245.936-.365 1.5-.365c.54 0 1.033.107 1.481.314c.448.208.785.582 1.02 1.108c.254-.374.6-.706 1.034-.992c.434-.287.95-.43 1.546-.43c.453 0 .872.056 1.26.167c.388.11.716.286.993.53c.276.245.489.559.646.951c.152.392.23.863.23 1.417v5.728h-2.349V11.52c0-.286-.01-.559-.032-.812a1.755 1.755 0 0 0-.18-.66a1.106 1.106 0 0 0-.438-.448c-.194-.11-.457-.166-.785-.166c-.332 0-.6.064-.803.189a1.38 1.38 0 0 0-.48.499a1.946 1.946 0 0 0-.231.696a5.56 5.56 0 0 0-.06.785v4.768h-2.35v-4.8c0-.254-.004-.503-.018-.752a2.074 2.074 0 0 0-.143-.688a1.052 1.052 0 0 0-.415-.503c-.194-.125-.476-.19-.854-.19c-.111 0-.259.024-.439.074c-.18.051-.36.143-.53.282a1.637 1.637 0 0 0-.439.595c-.12.259-.18.6-.18 1.02v4.966H5.46V7.81zm15.693 15.64V.55H21.72V0H24v24h-2.28v-.55z"/></svg>`,
@@ -249,7 +256,7 @@
 }
 
 func CreateAppPihole(fs embed.FS, tmpls *template.Template) StoreApp {
-	schema, err := fs.ReadFile("values-tmpl/pihole.jsonschema")
+	schema, err := readJSONSchemaFromFile(fs, "values-tmpl/pihole.jsonschema")
 	if err != nil {
 		panic(err)
 	}
@@ -260,7 +267,7 @@
 			[]*template.Template{
 				tmpls.Lookup("pihole.yaml"),
 			},
-			string(schema),
+			schema,
 			tmpls.Lookup("pihole.md"),
 		},
 		// "simple-icons:pihole",
@@ -270,7 +277,7 @@
 }
 
 func CreateAppPenpot(fs embed.FS, tmpls *template.Template) StoreApp {
-	schema, err := fs.ReadFile("values-tmpl/penpot.jsonschema")
+	schema, err := readJSONSchemaFromFile(fs, "values-tmpl/penpot.jsonschema")
 	if err != nil {
 		panic(err)
 	}
@@ -281,7 +288,7 @@
 			[]*template.Template{
 				tmpls.Lookup("penpot.yaml"),
 			},
-			string(schema),
+			schema,
 			tmpls.Lookup("penpot.md"),
 		},
 		// "simple-icons:pihole",
@@ -291,7 +298,7 @@
 }
 
 func CreateAppMaddy(fs embed.FS, tmpls *template.Template) StoreApp {
-	schema, err := fs.ReadFile("values-tmpl/maddy.jsonschema")
+	schema, err := readJSONSchemaFromFile(fs, "values-tmpl/maddy.jsonschema")
 	if err != nil {
 		panic(err)
 	}
@@ -302,7 +309,7 @@
 			[]*template.Template{
 				tmpls.Lookup("maddy.yaml"),
 			},
-			string(schema),
+			schema,
 			nil,
 		},
 		`<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50" viewBox="0 0 48 48"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M9.5 13c13.687 13.574 14.825 13.09 29 0"/><rect width="37" height="31" x="5.5" y="8.5" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" rx="2"/></svg>`,
@@ -311,7 +318,7 @@
 }
 
 func CreateAppQBittorrent(fs embed.FS, tmpls *template.Template) StoreApp {
-	schema, err := fs.ReadFile("values-tmpl/qbittorrent.jsonschema")
+	schema, err := readJSONSchemaFromFile(fs, "values-tmpl/qbittorrent.jsonschema")
 	if err != nil {
 		panic(err)
 	}
@@ -322,7 +329,7 @@
 			[]*template.Template{
 				tmpls.Lookup("qbittorrent.yaml"),
 			},
-			string(schema),
+			schema,
 			tmpls.Lookup("qbittorrent.md"),
 		},
 		`<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50" viewBox="0 0 48 48"><circle cx="24" cy="24" r="21.5" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"/><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M26.651 22.364a5.034 5.034 0 0 1 5.035-5.035h0a5.034 5.034 0 0 1 5.034 5.035v3.272a5.034 5.034 0 0 1-5.034 5.035h0a5.034 5.034 0 0 1-5.035-5.035m0 5.035V10.533m-5.302 15.103a5.034 5.034 0 0 1-5.035 5.035h0a5.034 5.034 0 0 1-5.034-5.035v-3.272a5.034 5.034 0 0 1 5.034-5.035h0a5.034 5.034 0 0 1 5.035 5.035m0-5.035v20.138"/></svg>`,
@@ -331,7 +338,7 @@
 }
 
 func CreateAppJellyfin(fs embed.FS, tmpls *template.Template) StoreApp {
-	schema, err := fs.ReadFile("values-tmpl/jellyfin.jsonschema")
+	schema, err := readJSONSchemaFromFile(fs, "values-tmpl/jellyfin.jsonschema")
 	if err != nil {
 		panic(err)
 	}
@@ -342,7 +349,7 @@
 			[]*template.Template{
 				tmpls.Lookup("jellyfin.yaml"),
 			},
-			string(schema),
+			schema,
 			nil,
 		},
 		`<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50" viewBox="0 0 48 48"><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M24 20c-1.62 0-6.85 9.48-6.06 11.08s11.33 1.59 12.12 0S25.63 20 24 20Z"/><path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" d="M24 5.5c-4.89 0-20.66 28.58-18.25 33.4s34.13 4.77 36.51 0S28.9 5.5 24 5.5Zm12 29.21c-1.56 3.13-22.35 3.17-23.93 0S20.8 12.83 24 12.83s13.52 18.76 12 21.88Z"/></svg>`,
@@ -351,7 +358,7 @@
 }
 
 func CreateAppRpuppy(fs embed.FS, tmpls *template.Template) StoreApp {
-	schema, err := fs.ReadFile("values-tmpl/rpuppy.jsonschema")
+	schema, err := readJSONSchemaFromFile(fs, "values-tmpl/rpuppy.jsonschema")
 	if err != nil {
 		panic(err)
 	}
@@ -362,7 +369,7 @@
 			[]*template.Template{
 				tmpls.Lookup("rpuppy.yaml"),
 			},
-			string(schema),
+			schema,
 			tmpls.Lookup("rpuppy.md"),
 		},
 		`<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50" viewBox="0 0 256 256"><path fill="currentColor" d="M100 140a8 8 0 1 1-8-8a8 8 0 0 1 8 8Zm64 8a8 8 0 1 0-8-8a8 8 0 0 0 8 8Zm64.94-9.11a12.12 12.12 0 0 1-5 1.11a11.83 11.83 0 0 1-9.35-4.62l-2.59-3.29V184a36 36 0 0 1-36 36H80a36 36 0 0 1-36-36v-51.91l-2.53 3.27A11.88 11.88 0 0 1 32.1 140a12.08 12.08 0 0 1-5-1.11a11.82 11.82 0 0 1-6.84-13.14l16.42-88a12 12 0 0 1 14.7-9.43h.16L104.58 44h46.84l53.08-15.6h.16a12 12 0 0 1 14.7 9.43l16.42 88a11.81 11.81 0 0 1-6.84 13.06ZM97.25 50.18L49.34 36.1a4.18 4.18 0 0 0-.92-.1a4 4 0 0 0-3.92 3.26l-16.42 88a4 4 0 0 0 7.08 3.22ZM204 121.75L150 52h-44l-54 69.75V184a28 28 0 0 0 28 28h44v-18.34l-14.83-14.83a4 4 0 0 1 5.66-5.66L128 186.34l13.17-13.17a4 4 0 0 1 5.66 5.66L132 193.66V212h44a28 28 0 0 0 28-28Zm23.92 5.48l-16.42-88a4 4 0 0 0-4.84-3.16l-47.91 14.11l62.11 80.28a4 4 0 0 0 7.06-3.23Z"/></svg>`,
@@ -371,7 +378,7 @@
 }
 
 func CreateAppSoftServe(fs embed.FS, tmpls *template.Template) StoreApp {
-	schema, err := fs.ReadFile("values-tmpl/soft-serve.jsonschema")
+	schema, err := readJSONSchemaFromFile(fs, "values-tmpl/soft-serve.jsonschema")
 	if err != nil {
 		panic(err)
 	}
@@ -382,7 +389,7 @@
 			[]*template.Template{
 				tmpls.Lookup("soft-serve.yaml"),
 			},
-			string(schema),
+			schema,
 			tmpls.Lookup("soft-serve.md"),
 		},
 		`<svg xmlns="http://www.w3.org/2000/svg" width="50" height="50" viewBox="0 0 48 48"><g fill="none" stroke="currentColor" stroke-linecap="round" stroke-width="4"><path stroke-linejoin="round" d="M15.34 22.5L21 37l3 6l3-6l5.66-14.5"/><path d="M19 32h10"/><path stroke-linejoin="round" d="M24 3c-6 0-8 6-8 6s-6 2-6 7s5 7 5 7s3.5-2 9-2s9 2 9 2s5-2 5-7s-6-7-6-7s-2-6-8-6Z"/></g></svg>`,
@@ -391,7 +398,7 @@
 }
 
 func CreateAppHeadscale(fs embed.FS, tmpls *template.Template) App {
-	schema, err := fs.ReadFile("values-tmpl/headscale.jsonschema")
+	schema, err := readJSONSchemaFromFile(fs, "values-tmpl/headscale.jsonschema")
 	if err != nil {
 		panic(err)
 	}
@@ -401,13 +408,13 @@
 		[]*template.Template{
 			tmpls.Lookup("headscale.yaml"),
 		},
-		string(schema),
+		schema,
 		tmpls.Lookup("headscale.md"),
 	}
 }
 
 func CreateAppHeadscaleUser(fs embed.FS, tmpls *template.Template) App {
-	schema, err := fs.ReadFile("values-tmpl/headscale-user.jsonschema")
+	schema, err := readJSONSchemaFromFile(fs, "values-tmpl/headscale-user.jsonschema")
 	if err != nil {
 		panic(err)
 	}
@@ -417,13 +424,13 @@
 		[]*template.Template{
 			tmpls.Lookup("headscale-user.yaml"),
 		},
-		string(schema),
+		schema,
 		tmpls.Lookup("headscale-user.md"),
 	}
 }
 
 func CreateMetallbIPAddressPool(fs embed.FS, tmpls *template.Template) App {
-	schema, err := fs.ReadFile("values-tmpl/metallb-ipaddresspool.jsonschema")
+	schema, err := readJSONSchemaFromFile(fs, "values-tmpl/metallb-ipaddresspool.jsonschema")
 	if err != nil {
 		panic(err)
 	}
@@ -433,13 +440,13 @@
 		[]*template.Template{
 			tmpls.Lookup("metallb-ipaddresspool.yaml"),
 		},
-		string(schema),
+		schema,
 		tmpls.Lookup("metallb-ipaddresspool.md"),
 	}
 }
 
 func CreateEnvManager(fs embed.FS, tmpls *template.Template) App {
-	schema, err := fs.ReadFile("values-tmpl/env-manager.jsonschema")
+	schema, err := readJSONSchemaFromFile(fs, "values-tmpl/env-manager.jsonschema")
 	if err != nil {
 		panic(err)
 	}
@@ -449,13 +456,13 @@
 		[]*template.Template{
 			tmpls.Lookup("env-manager.yaml"),
 		},
-		string(schema),
+		schema,
 		tmpls.Lookup("env-manager.md"),
 	}
 }
 
 func CreateWelcome(fs embed.FS, tmpls *template.Template) App {
-	schema, err := fs.ReadFile("values-tmpl/welcome.jsonschema")
+	schema, err := readJSONSchemaFromFile(fs, "values-tmpl/welcome.jsonschema")
 	if err != nil {
 		panic(err)
 	}
@@ -465,13 +472,13 @@
 		[]*template.Template{
 			tmpls.Lookup("welcome.yaml"),
 		},
-		string(schema),
+		schema,
 		tmpls.Lookup("welcome.md"),
 	}
 }
 
 func CreateAppManager(fs embed.FS, tmpls *template.Template) App {
-	schema, err := fs.ReadFile("values-tmpl/appmanager.jsonschema")
+	schema, err := readJSONSchemaFromFile(fs, "values-tmpl/appmanager.jsonschema")
 	if err != nil {
 		panic(err)
 	}
@@ -481,13 +488,13 @@
 		[]*template.Template{
 			tmpls.Lookup("appmanager.yaml"),
 		},
-		string(schema),
+		schema,
 		tmpls.Lookup("appmanager.md"),
 	}
 }
 
 func CreateIngressPublic(fs embed.FS, tmpls *template.Template) App {
-	schema, err := fs.ReadFile("values-tmpl/ingress-public.jsonschema")
+	schema, err := readJSONSchemaFromFile(fs, "values-tmpl/ingress-public.jsonschema")
 	if err != nil {
 		panic(err)
 	}
@@ -497,13 +504,13 @@
 		[]*template.Template{
 			tmpls.Lookup("ingress-public.yaml"),
 		},
-		string(schema),
+		schema,
 		tmpls.Lookup("ingress-public.md"),
 	}
 }
 
 func CreateCertManager(fs embed.FS, tmpls *template.Template) App {
-	schema, err := fs.ReadFile("values-tmpl/cert-manager.jsonschema")
+	schema, err := readJSONSchemaFromFile(fs, "values-tmpl/cert-manager.jsonschema")
 	if err != nil {
 		panic(err)
 	}
@@ -513,13 +520,13 @@
 		[]*template.Template{
 			tmpls.Lookup("cert-manager.yaml"),
 		},
-		string(schema),
+		schema,
 		tmpls.Lookup("cert-manager.md"),
 	}
 }
 
 func CreateCertManagerWebhookGandi(fs embed.FS, tmpls *template.Template) App {
-	schema, err := fs.ReadFile("values-tmpl/cert-manager-webhook-pcloud.jsonschema")
+	schema, err := readJSONSchemaFromFile(fs, "values-tmpl/cert-manager-webhook-pcloud.jsonschema")
 	if err != nil {
 		panic(err)
 	}
@@ -529,13 +536,13 @@
 		[]*template.Template{
 			tmpls.Lookup("cert-manager-webhook-pcloud.yaml"),
 		},
-		string(schema),
+		schema,
 		tmpls.Lookup("cert-manager-webhook-pcloud.md"),
 	}
 }
 
 func CreateCSIDriverSMB(fs embed.FS, tmpls *template.Template) App {
-	schema, err := fs.ReadFile("values-tmpl/csi-driver-smb.jsonschema")
+	schema, err := readJSONSchemaFromFile(fs, "values-tmpl/csi-driver-smb.jsonschema")
 	if err != nil {
 		panic(err)
 	}
@@ -545,13 +552,13 @@
 		[]*template.Template{
 			tmpls.Lookup("csi-driver-smb.yaml"),
 		},
-		string(schema),
+		schema,
 		tmpls.Lookup("csi-driver-smb.md"),
 	}
 }
 
 func CreateResourceRendererController(fs embed.FS, tmpls *template.Template) App {
-	schema, err := fs.ReadFile("values-tmpl/resource-renderer-controller.jsonschema")
+	schema, err := readJSONSchemaFromFile(fs, "values-tmpl/resource-renderer-controller.jsonschema")
 	if err != nil {
 		panic(err)
 	}
@@ -561,13 +568,13 @@
 		[]*template.Template{
 			tmpls.Lookup("resource-renderer-controller.yaml"),
 		},
-		string(schema),
+		schema,
 		tmpls.Lookup("resource-renderer-controller.md"),
 	}
 }
 
 func CreateHeadscaleController(fs embed.FS, tmpls *template.Template) App {
-	schema, err := fs.ReadFile("values-tmpl/headscale-controller.jsonschema")
+	schema, err := readJSONSchemaFromFile(fs, "values-tmpl/headscale-controller.jsonschema")
 	if err != nil {
 		panic(err)
 	}
@@ -577,13 +584,13 @@
 		[]*template.Template{
 			tmpls.Lookup("headscale-controller.yaml"),
 		},
-		string(schema),
+		schema,
 		tmpls.Lookup("headscale-controller.md"),
 	}
 }
 
 func CreateDNSZoneManager(fs embed.FS, tmpls *template.Template) App {
-	schema, err := fs.ReadFile("values-tmpl/dns-zone-controller.jsonschema")
+	schema, err := readJSONSchemaFromFile(fs, "values-tmpl/dns-zone-controller.jsonschema")
 	if err != nil {
 		panic(err)
 	}
@@ -595,13 +602,13 @@
 			tmpls.Lookup("coredns.yaml"),
 			tmpls.Lookup("dns-zone-controller.yaml"),
 		},
-		string(schema),
+		schema,
 		tmpls.Lookup("dns-zone-controller.md"),
 	}
 }
 
 func CreateFluxcdReconciler(fs embed.FS, tmpls *template.Template) App {
-	schema, err := fs.ReadFile("values-tmpl/fluxcd-reconciler.jsonschema")
+	schema, err := readJSONSchemaFromFile(fs, "values-tmpl/fluxcd-reconciler.jsonschema")
 	if err != nil {
 		panic(err)
 	}
@@ -611,7 +618,7 @@
 		[]*template.Template{
 			tmpls.Lookup("fluxcd-reconciler.yaml"),
 		},
-		string(schema),
+		schema,
 		tmpls.Lookup("fluxcd-reconciler.md"),
 	}
 }
@@ -764,7 +771,11 @@
 		return StoreApp{}, err
 	}
 	defer sb.Close()
-	schema, err := io.ReadAll(sb)
+	scm, err := io.ReadAll(sb)
+	if err != nil {
+		return StoreApp{}, err
+	}
+	schema, err := NewJSONSchema(string(scm))
 	if err != nil {
 		return StoreApp{}, err
 	}
@@ -795,7 +806,7 @@
 		App: App{
 			Name:       appCfg.Name,
 			Readme:     readmeTmpl,
-			Schema:     string(schema),
+			schema:     schema,
 			Namespaces: appCfg.Namespaces,
 			Templates:  tmpls,
 		},
