diff --git a/core/installer/schema.go b/core/installer/schema.go
index 7f8410f..fb5d305 100644
--- a/core/installer/schema.go
+++ b/core/installer/schema.go
@@ -369,6 +369,56 @@
 	}
 }
 
+func ExtractDefaultValues(v cue.Value) (any, error) {
+	switch v.IncompleteKind() {
+	case cue.StringKind:
+		if d, ok := v.Default(); ok {
+			return d.String()
+		}
+	case cue.BoolKind:
+		if d, ok := v.Default(); ok {
+			return d.Bool()
+		}
+	case cue.NumberKind:
+		// TODO(gio): handle numbers
+		return nil, fmt.Errorf("implement: %s", v)
+	case cue.IntKind:
+		if d, ok := v.Default(); ok {
+			return d.Int64()
+		}
+	case cue.ListKind:
+		// TODO(gio): handle lists
+		return nil, nil
+	case cue.StructKind:
+		// TODO(gio): Such fields might have default values as well?
+		if isNetwork(v) {
+			return nil, nil
+		} else if isAuth(v) {
+			return nil, nil
+		} else if isSSHKey(v) {
+			return nil, nil
+		} else if isCluster(v) {
+			return nil, nil
+		}
+		ret := map[string]any{}
+		f, err := v.Fields(cue.All())
+		if err != nil {
+			return nil, err
+		}
+		for f.Next() {
+			fv, err := ExtractDefaultValues(f.Value())
+			if err != nil {
+				return nil, err
+			}
+			ret[f.Selector().String()] = fv
+		}
+		return ret, nil
+	default:
+		return nil, fmt.Errorf("SHOULD NOT REACH! value: %s", v)
+	}
+	return nil, nil
+}
+
 func cleanFieldName(name string) string {
 	return strings.ReplaceAll(strings.ReplaceAll(name, "?", ""), "!", "")
 }
