Schema validator (#3)

added schema validator
diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml
index 06e86c4..f37f419 100644
--- a/.github/workflows/node.js.yml
+++ b/.github/workflows/node.js.yml
@@ -5,26 +5,24 @@
 
 on:
   push:
-    branches: [ main ]
+    branches: [ main, schema_validator ]
   pull_request:
-    branches: [ main ]
+    branches: [ main, schema_validator ]
 
 jobs:
   build:
 
     runs-on: ubuntu-latest
 
-    strategy:
-      matrix:
-        node-version: [12.x, 14.x, 16.x]
-        # See supported Node.js release schedule at https://nodejs.org/en/about/releases/
-
+    defaults:
+      run:
+        working-directory: ./schema
     steps:
     - uses: actions/checkout@v2
-    - name: Use Node.js ${{ matrix.node-version }}
-      uses: actions/setup-node@v2
+    - name: Use Node.js 16.x
+      uses: actions/cache@v2
       with:
-        node-version: ${{ matrix.node-version }}
-        cache: 'npm'
+        path: ~/.npm
+        key: ${{ runner.os }}-${{ hashFiles('**/lockfiles') }}
     - run: npm ci
-    - run: npm run
+    - run: npm run validate
diff --git a/examples/image.json b/examples/image.json
new file mode 100644
index 0000000..a89af99
--- /dev/null
+++ b/examples/image.json
@@ -0,0 +1 @@
+{"v":"4.8.0","fr":30,"ip":0,"op":300,"w":1024,"h":768,"nm":"Image","ddd":0,"assets":[{"id":"image_0","w":278,"h":278,"u":"images/","p":"img_0.jpg","e":0}],"layers":[{"ddd":0,"ind":1,"ty":2,"nm":"profile.JPG","cl":"JPG","refId":"image_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[512,384,0],"ix":2,"l":2},"a":{"a":0,"k":[139,139,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"ip":0,"op":300,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/examples/precomp.json b/examples/precomp.json
new file mode 100644
index 0000000..83d6905
--- /dev/null
+++ b/examples/precomp.json
@@ -0,0 +1 @@
+{"v":"4.8.0","fr":30,"ip":0,"op":300,"w":1024,"h":768,"nm":"precomp","ddd":0,"assets":[{"id":"comp_0","nm":"precomp_nested","layers":[]}],"layers":[{"ddd":0,"ind":1,"ty":0,"nm":"precomp_nested","refId":"comp_0","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[512,384,0],"ix":2,"l":2},"a":{"a":0,"k":[512,384,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"w":1024,"h":768,"ip":0,"op":300,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/examples/rectangle.json b/examples/rectangle.json
new file mode 100644
index 0000000..8d8f8ea
--- /dev/null
+++ b/examples/rectangle.json
@@ -0,0 +1 @@
+{"v":"4.8.0","fr":30,"ip":0,"op":300,"w":1024,"h":768,"nm":"Rectangle","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":1,"nm":"Deep Red Solid 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":1,"k":[{"i":{"x":[0.833],"y":[0.833]},"o":{"x":[0.167],"y":[0.167]},"t":0,"s":[0]},{"t":299,"s":[360]}],"ix":10},"p":{"a":0,"k":[512,384,0],"ix":2,"l":2},"a":{"a":0,"k":[256,192,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"sw":512,"sh":384,"sc":"#990000","ip":0,"op":300,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/examples/shape.json b/examples/shape.json
new file mode 100644
index 0000000..8f61f5d
--- /dev/null
+++ b/examples/shape.json
@@ -0,0 +1 @@
+{"v":"4.8.0","fr":30,"ip":0,"op":300,"w":1024,"h":768,"nm":"Shape","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 1","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[512,384,0],"ix":2,"l":2},"a":{"a":0,"k":[0,0,0],"ix":1,"l":2},"s":{"a":0,"k":[100,100,100],"ix":6,"l":2}},"ao":0,"shapes":[{"ty":"rc","d":1,"s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"d":1,"ty":"el","s":{"a":0,"k":[100,100],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"sr","sy":1,"d":1,"pt":{"a":0,"k":5,"ix":3},"p":{"a":0,"k":[0,0],"ix":4},"r":{"a":0,"k":0,"ix":5},"ir":{"a":0,"k":50,"ix":6},"is":{"a":0,"k":0,"ix":8},"or":{"a":0,"k":100,"ix":7},"os":{"a":0,"k":0,"ix":9},"ix":3,"nm":"Polystar Path 1","mn":"ADBE Vector Shape - Star","hd":false},{"ind":3,"ty":"sh","ix":4,"ks":{"a":0,"k":{"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-474,-341],[-449,324],[445,303],[445,-316]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"rd","nm":"Round Corners 1","r":{"a":0,"k":10,"ix":1},"ix":5,"mn":"ADBE Vector Filter - RC","hd":false},{"ty":"tm","s":{"a":0,"k":0,"ix":1},"e":{"a":0,"k":100,"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":6,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"mm","mm":2,"nm":"Merge Paths 1","mn":"ADBE Vector Filter - Merge","hd":false},{"ty":"gs","o":{"a":0,"k":100,"ix":9},"w":{"a":0,"k":2,"ix":10},"g":{"p":2,"k":{"a":0,"k":[0,1,1,1,1,0,0,0],"ix":8}},"s":{"a":0,"k":[0,0],"ix":4},"e":{"a":0,"k":[100,0],"ix":5},"t":1,"lc":1,"lj":1,"ml":4,"ml2":{"a":0,"k":4,"ix":13},"bm":0,"nm":"Gradient Stroke 1","mn":"ADBE Vector Graphic - G-Stroke","hd":false},{"ty":"gf","o":{"a":0,"k":100,"ix":10},"r":1,"bm":0,"g":{"p":2,"k":{"a":0,"k":[0,1,1,1,1,0,0,0],"ix":9}},"s":{"a":0,"k":[0,0],"ix":5},"e":{"a":0,"k":[100,0],"ix":6},"t":1,"nm":"Gradient Fill 1","mn":"ADBE Vector Graphic - G-Fill","hd":false},{"ty":"st","c":{"a":0,"k":[1,1,1,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":2,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[1,0,0,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"rp","c":{"a":0,"k":3,"ix":1},"o":{"a":0,"k":0,"ix":2},"m":1,"ix":12,"tr":{"ty":"tr","p":{"a":0,"k":[100,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":4},"so":{"a":0,"k":100,"ix":5},"eo":{"a":0,"k":100,"ix":6},"nm":"Transform"},"nm":"Repeater 1","mn":"ADBE Vector Filter - Repeater","hd":false}],"ip":0,"op":300,"st":0,"bm":0}],"markers":[]}
\ No newline at end of file
diff --git a/schema/.gitignore b/schema/.gitignore
new file mode 100644
index 0000000..40b878d
--- /dev/null
+++ b/schema/.gitignore
@@ -0,0 +1 @@
+node_modules/
\ No newline at end of file
diff --git a/schema/docs/json/animation.json b/schema/docs/json/animation.json
new file mode 100644
index 0000000..a56eee2
--- /dev/null
+++ b/schema/docs/json/animation.json
@@ -0,0 +1,102 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "ip": {
+      "title": "In Point",
+      "description": "In Point of the Time Ruler. Sets the initial Frame of the animation.",
+      "type": "number"
+    },
+    "op": {
+      "title": "Out Point",
+      "description": "Out Point of the Time Ruler. Sets the final Frame of the animation",
+      "type": "number"
+    },
+    "fr": {
+      "title": "Frame Rate",
+      "description": "Frame Rate",
+      "type": "number"
+    },
+    "w": {
+      "title": "Width",
+      "description": "Composition Width",
+      "type": "number"
+    },
+    "ddd": {
+      "title": "3-D",
+      "description": "Composition has 3-D layers",
+      "type": "number",
+      "$ref": "#/helpers/boolean",
+      "default": 0
+    },
+    "h": {
+      "title": "Height",
+      "description": "Composition Height",
+      "type": "number"
+    },
+    "v": {
+      "title": "Version",
+      "description": "Bodymovin Version",
+      "type": "string"
+    },
+    "nm": {
+      "title": "Name",
+      "description": "Composition name",
+      "type": "string"
+    },
+    "layers": {
+      "title": "Layers",
+      "description": "List of Composition Layers",
+      "items": {
+        "oneOf": [
+          {
+            "$ref": "#/layers/shape"
+          },
+          {
+            "$ref": "#/layers/solid"
+          },
+          {
+            "$ref": "#/layers/preComp"
+          },
+          {
+            "$ref": "#/layers/image"
+          },
+          {
+            "$ref": "#/layers/null"
+          },
+          {
+            "$ref": "#/layers/text"
+          }
+        ],
+        "type": "object"
+      },
+      "type": "array"
+    },
+    "assets": {
+      "title": "Assets",
+      "description": "source items that can be used in multiple places. Comps and Images for now.",
+      "items": {
+        "oneOf": [
+          {
+            "$ref": "#/sources/image"
+          },
+          {
+            "$ref": "#/sources/precomp"
+          }
+        ],
+        "type": "object"
+      },
+      "type": "array"
+    },
+    "chars": {
+      "title": "Chars",
+      "description": "source chars for text layers",
+      "items": {
+        "$ref": "#/sources/chars",
+        "type": "object"
+      },
+      "type": "array"
+    }
+  },
+  "required": ["ip", "op","fr","w","h","layers"]
+}
diff --git a/schema/docs/json/effects/angle.json b/schema/docs/json/effects/angle.json
new file mode 100644
index 0000000..4d28023
--- /dev/null
+++ b/schema/docs/json/effects/angle.json
@@ -0,0 +1,40 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "ix": {
+      "title": "Effect Index",
+      "description": "Effect Index. Used for expressions. NOT USED. EQUALS SLIDER.",
+      "type": "number"
+    },
+    "mn": {
+      "title": "Match Name",
+      "description": "After Effect's Match Name. Used for expressions.",
+      "type": "string"
+    },
+    "nm": {
+      "title": "Name",
+      "description": "After Effect's Name. Used for expressions.",
+      "type": "string"
+    },
+    "ty": {
+      "title": "Type",
+      "description": "Effect type.",
+      "type": "number",
+      "const": 1
+    },
+    "v": {
+      "title": "Value",
+      "description": "Effect value.",
+      "oneOf": [
+        {
+          "$ref": "#/properties/value"
+        },
+        {
+          "$ref": "#/properties/valueKeyframed"
+        }
+      ],
+      "type": "object"
+    }
+  }
+}
diff --git a/schema/docs/json/effects/checkBox.json b/schema/docs/json/effects/checkBox.json
new file mode 100644
index 0000000..a7e9039
--- /dev/null
+++ b/schema/docs/json/effects/checkBox.json
@@ -0,0 +1,40 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "ix": {
+      "title": "Effect Index",
+      "description": "Effect Index. Used for expressions.",
+      "type": "number"
+    },
+    "mn": {
+      "title": "Match Name",
+      "description": "After Effect's Match Name. Used for expressions.",
+      "type": "string"
+    },
+    "nm": {
+      "title": "Name",
+      "description": "After Effect's Name. Used for expressions.",
+      "type": "string"
+    },
+    "ty": {
+      "title": "Type",
+      "description": "Effect type.",
+      "type": "number",
+      "const": 7
+    },
+    "v": {
+      "title": "Value",
+      "description": "Effect value.",
+      "oneOf": [
+        {
+          "$ref": "#/properties/value"
+        },
+        {
+          "$ref": "#/properties/valueKeyframed"
+        }
+      ],
+      "type": "object"
+    }
+  }
+}
diff --git a/schema/docs/json/effects/color.json b/schema/docs/json/effects/color.json
new file mode 100644
index 0000000..8c7e84b
--- /dev/null
+++ b/schema/docs/json/effects/color.json
@@ -0,0 +1,40 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "ix": {
+      "title": "Effect Index",
+      "description": "Effect Index. Used for expressions.",
+      "type": "number"
+    },
+    "mn": {
+      "title": "Match Name",
+      "description": "After Effect's Match Name. Used for expressions.",
+      "type": "string"
+    },
+    "nm": {
+      "title": "Name",
+      "description": "After Effect's Name. Used for expressions.",
+      "type": "string"
+    },
+    "ty": {
+      "title": "Type",
+      "description": "Effect type.",
+      "type": "number",
+      "const": 2
+    },
+    "v": {
+      "title": "Value",
+      "description": "Effect value.",
+      "oneOf": [
+        {
+          "$ref": "#/properties/multiDimensional"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalKeyframed"
+        }
+      ],
+      "type": "object"
+    }
+  }
+}
diff --git a/schema/docs/json/effects/customValue.json b/schema/docs/json/effects/customValue.json
new file mode 100644
index 0000000..c54a360
--- /dev/null
+++ b/schema/docs/json/effects/customValue.json
@@ -0,0 +1,4 @@
+{
+	"$schema": "http://json-schema.org/draft-04/schema#",
+	"type": "object"
+}
diff --git a/schema/docs/json/effects/dropDown.json b/schema/docs/json/effects/dropDown.json
new file mode 100644
index 0000000..a7e9039
--- /dev/null
+++ b/schema/docs/json/effects/dropDown.json
@@ -0,0 +1,40 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "ix": {
+      "title": "Effect Index",
+      "description": "Effect Index. Used for expressions.",
+      "type": "number"
+    },
+    "mn": {
+      "title": "Match Name",
+      "description": "After Effect's Match Name. Used for expressions.",
+      "type": "string"
+    },
+    "nm": {
+      "title": "Name",
+      "description": "After Effect's Name. Used for expressions.",
+      "type": "string"
+    },
+    "ty": {
+      "title": "Type",
+      "description": "Effect type.",
+      "type": "number",
+      "const": 7
+    },
+    "v": {
+      "title": "Value",
+      "description": "Effect value.",
+      "oneOf": [
+        {
+          "$ref": "#/properties/value"
+        },
+        {
+          "$ref": "#/properties/valueKeyframed"
+        }
+      ],
+      "type": "object"
+    }
+  }
+}
diff --git a/schema/docs/json/effects/fill.json b/schema/docs/json/effects/fill.json
new file mode 100644
index 0000000..8f0aa8f
--- /dev/null
+++ b/schema/docs/json/effects/fill.json
@@ -0,0 +1,55 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "ix": {
+      "title": "Effect Index",
+      "description": "Effect Index. Used for expressions.",
+      "type": "number"
+    },
+    "mn": {
+      "title": "Match Name",
+      "description": "After Effect's Match Name. Used for expressions.",
+      "type": "string"
+    },
+    "nm": {
+      "title": "Name",
+      "description": "After Effect's Name. Used for expressions.",
+      "type": "string"
+    },
+    "ty": {
+      "title": "Type",
+      "description": "Effect type.",
+      "type": "number",
+      "const": 21
+    },
+    "ef": {
+      "title": "Effects",
+      "description": "Effect List of properties.",
+      "items": [
+        {
+          "$ref": "#/effects/point"
+        },
+        {
+          "$ref": "#/effects/dropDown"
+        },
+        {
+          "$ref": "#/effects/color"
+        },
+        {
+          "$ref": "#/effects/dropDown"
+        },
+        {
+          "$ref": "#/effects/slider"
+        },
+        {
+          "$ref": "#/effects/slider"
+        },
+        {
+          "$ref": "#/effects/slider"
+        }
+      ],
+      "type": "array"
+    }
+  }
+}
diff --git a/schema/docs/json/effects/group.json b/schema/docs/json/effects/group.json
new file mode 100644
index 0000000..3336806
--- /dev/null
+++ b/schema/docs/json/effects/group.json
@@ -0,0 +1,41 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "ix": {
+      "title": "Effect Index",
+      "description": "Effect Index. Used for expressions.",
+      "type": "number"
+    },
+    "mn": {
+      "title": "Match Name",
+      "description": "After Effect's Match Name. Used for expressions.",
+      "type": "string"
+    },
+    "nm": {
+      "title": "Name",
+      "description": "After Effect's Name. Used for expressions.",
+      "type": "string"
+    },
+    "ty": {
+      "title": "Type",
+      "description": "Effect type.",
+      "type": "number",
+      "const": 5
+    },
+    "ef": {
+      "title": "Effects",
+      "description": "Effect List of properties.",
+      "items": {
+        "$ref": "#/effects/index",
+        "type": "object"
+      },
+      "type": "array"
+    },
+    "en": {
+      "description": "Enabled AE property value",
+      "extended_name": "Enabled",
+      "type": "number"
+    }
+  }
+}
diff --git a/schema/docs/json/effects/index.json b/schema/docs/json/effects/index.json
new file mode 100644
index 0000000..d79f076
--- /dev/null
+++ b/schema/docs/json/effects/index.json
@@ -0,0 +1,51 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "oneOf": [
+    {
+      "$ref": "#/effects/slider"
+    },
+    {
+      "$ref": "#/effects/angle"
+    },
+    {
+      "$ref": "#/effects/color"
+    },
+    {
+      "$ref": "#/effects/point"
+    },
+    {
+      "$ref": "#/effects/checkBox"
+    },
+    {
+      "$ref": "#/effects/group"
+    },
+    {
+      "$ref": "#/effects/noValue"
+    },
+    {
+      "$ref": "#/effects/dropDown"
+    },
+    {
+      "$ref": "#/effects/customValue"
+    },
+    {
+      "$ref": "#/effects/layer"
+    },
+    {
+      "$ref": "#/effects/tint"
+    },
+    {
+      "$ref": "#/effects/fill"
+    },
+    {
+      "$ref": "#/effects/stroke"
+    },
+    {
+      "$ref": "#/effects/tritone"
+    },
+    {
+      "$ref": "#/effects/proLevels"
+    }
+  ]
+}
diff --git a/schema/docs/json/effects/layer.json b/schema/docs/json/effects/layer.json
new file mode 100644
index 0000000..edc5851
--- /dev/null
+++ b/schema/docs/json/effects/layer.json
@@ -0,0 +1,33 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "ix": {
+      "title": "Effect Index",
+      "description": "Effect Index. Used for expressions. NOT USED. EQUALS SLIDER.",
+      "type": "number"
+    },
+    "mn": {
+      "title": "Match Name",
+      "description": "After Effect's Match Name. Used for expressions.",
+      "type": "string"
+    },
+    "nm": {
+      "title": "Name",
+      "description": "After Effect's Name. Used for expressions.",
+      "type": "string"
+    },
+    "ty": {
+      "title": "Type",
+      "description": "Effect type.",
+      "type": "number",
+      "const": 0
+    },
+    "v": {
+      "title": "Value",
+      "description": "Effect value.",
+      "$ref": "#/properties/value",
+      "type": "object"
+    }
+  }
+}
diff --git a/schema/docs/json/effects/noValue.json b/schema/docs/json/effects/noValue.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/schema/docs/json/effects/noValue.json
@@ -0,0 +1 @@
+{}
diff --git a/schema/docs/json/effects/point.json b/schema/docs/json/effects/point.json
new file mode 100644
index 0000000..07cd9cb
--- /dev/null
+++ b/schema/docs/json/effects/point.json
@@ -0,0 +1,43 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "ix": {
+      "title": "Effect Index",
+      "description": "Effect Index. Used for expressions.",
+      "type": "number"
+    },
+    "mn": {
+      "title": "Match Name",
+      "description": "After Effect's Match Name. Used for expressions.",
+      "type": "string"
+    },
+    "nm": {
+      "title": "Name",
+      "description": "After Effect's Name. Used for expressions.",
+      "type": "string"
+    },
+    "ty": {
+      "title": "Type",
+      "description": "Effect type.",
+      "type": "number",
+      "const": 2
+    },
+    "v": {
+      "title": "Value",
+      "description": "Effect value.",
+      "type": "object",
+      "items": {
+        "oneOf": [
+          {
+            "$ref": "#/properties/multiDimensional"
+          },
+          {
+            "$ref": "#/properties/multiDimensionalKeyframed"
+          }
+        ],
+        "type": "object"
+      }
+    }
+  }
+}
diff --git a/schema/docs/json/effects/proLevels.json b/schema/docs/json/effects/proLevels.json
new file mode 100644
index 0000000..6c63de5
--- /dev/null
+++ b/schema/docs/json/effects/proLevels.json
@@ -0,0 +1,130 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "ix": {
+      "title": "Effect Index",
+      "description": "Effect Index. Used for expressions.",
+      "type": "number"
+    },
+    "mn": {
+      "title": "Match Name",
+      "description": "After Effect's Match Name. Used for expressions.",
+      "type": "string"
+    },
+    "nm": {
+      "title": "Name",
+      "description": "After Effect's Name. Used for expressions.",
+      "type": "string"
+    },
+    "ty": {
+      "title": "Type",
+      "description": "Effect type.",
+      "type": "number",
+      "const": 23
+    },
+    "ef": {
+      "title": "Effects",
+      "description": "Effect List of properties.",
+      "type": "array",
+      "items": [
+        {
+          "$ref": "#/effects/dropDown"
+        },
+        {
+          "$ref": "#/effects/noValue"
+        },
+        {
+          "$ref": "#/effects/noValue"
+        },
+        {
+          "$ref": "#/effects/slider"
+        },
+        {
+          "$ref": "#/effects/slider"
+        },
+        {
+          "$ref": "#/effects/slider"
+        },
+        {
+          "$ref": "#/effects/slider"
+        },
+        {
+          "$ref": "#/effects/slider"
+        },
+        {
+          "$ref": "#/effects/noValue"
+        },
+        {
+          "$ref": "#/effects/slider"
+        },
+        {
+          "$ref": "#/effects/slider"
+        },
+        {
+          "$ref": "#/effects/slider"
+        },
+        {
+          "$ref": "#/effects/slider"
+        },
+        {
+          "$ref": "#/effects/slider"
+        },
+        {
+          "$ref": "#/effects/noValue"
+        },
+        {
+          "$ref": "#/effects/slider"
+        },
+        {
+          "$ref": "#/effects/slider"
+        },
+        {
+          "$ref": "#/effects/slider"
+        },
+        {
+          "$ref": "#/effects/slider"
+        },
+        {
+          "$ref": "#/effects/slider"
+        },
+        {
+          "$ref": "#/effects/noValue"
+        },
+        {
+          "$ref": "#/effects/slider"
+        },
+        {
+          "$ref": "#/effects/slider"
+        },
+        {
+          "$ref": "#/effects/slider"
+        },
+        {
+          "$ref": "#/effects/slider"
+        },
+        {
+          "$ref": "#/effects/slider"
+        },
+        {
+          "$ref": "#/effects/noValue"
+        },
+        {
+          "$ref": "#/effects/slider"
+        },
+        {
+          "$ref": "#/effects/slider"
+        },
+        {
+          "$ref": "#/effects/slider"
+        },
+        {
+          "$ref": "#/effects/slider"
+        },
+        {
+          "$ref": "#/effects/slider"
+        }
+      ]
+    }
+  }
+}
diff --git a/schema/docs/json/effects/slider.json b/schema/docs/json/effects/slider.json
new file mode 100644
index 0000000..6896b5d
--- /dev/null
+++ b/schema/docs/json/effects/slider.json
@@ -0,0 +1,40 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "ix": {
+      "title": "Effect Index",
+      "description": "Effect Index. Used for expressions.",
+      "type": "number"
+    },
+    "mn": {
+      "title": "Match Name",
+      "description": "After Effect's Match Name. Used for expressions.",
+      "type": "string"
+    },
+    "nm": {
+      "title": "Name",
+      "description": "After Effect's Name. Used for expressions.",
+      "type": "string"
+    },
+    "ty": {
+      "title": "Type",
+      "description": "Effect type.",
+      "type": "number",
+      "const": 0
+    },
+    "v": {
+      "title": "Value",
+      "description": "Effect value.",
+      "oneOf": [
+        {
+          "$ref": "#/properties/value"
+        },
+        {
+          "$ref": "#/properties/valueKeyframed"
+        }
+      ],
+      "type": "object"
+    }
+  }
+}
diff --git a/schema/docs/json/effects/stroke.json b/schema/docs/json/effects/stroke.json
new file mode 100644
index 0000000..fd1961f
--- /dev/null
+++ b/schema/docs/json/effects/stroke.json
@@ -0,0 +1,64 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "ix": {
+      "title": "Effect Index",
+      "description": "Effect Index. Used for expressions.",
+      "type": "number"
+    },
+    "mn": {
+      "title": "Match Name",
+      "description": "After Effect's Match Name. Used for expressions.",
+      "type": "string"
+    },
+    "nm": {
+      "title": "Name",
+      "description": "After Effect's Name. Used for expressions.",
+      "type": "string"
+    },
+    "ty": {
+      "title": "Type",
+      "description": "Effect type.",
+      "type": "number",
+      "const": 22
+    },
+    "ef": {
+      "title": "Effects",
+      "description": "Effect List of properties.",
+      "type": "array",
+      "items": [
+        {
+          "$ref": "#/effects/color"
+        },
+        {
+          "$ref": "#/effects/checkBox"
+        },
+        {
+          "$ref": "#/effects/color"
+        },
+        {
+          "$ref": "#/effects/slider"
+        },
+        {
+          "$ref": "#/effects/slider"
+        },
+        {
+          "$ref": "#/effects/slider"
+        },
+        {
+          "$ref": "#/effects/slider"
+        },
+        {
+          "$ref": "#/effects/slider"
+        },
+        {
+          "$ref": "#/effects/dropDown"
+        },
+        {
+          "$ref": "#/effects/dropDown"
+        }
+      ]
+    }
+  }
+}
diff --git a/schema/docs/json/effects/tint.json b/schema/docs/json/effects/tint.json
new file mode 100644
index 0000000..522a1d9
--- /dev/null
+++ b/schema/docs/json/effects/tint.json
@@ -0,0 +1,43 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "ix": {
+      "title": "Effect Index",
+      "description": "Effect Index. Used for expressions.",
+      "type": "number"
+    },
+    "mn": {
+      "title": "Match Name",
+      "description": "After Effect's Match Name. Used for expressions.",
+      "type": "string"
+    },
+    "nm": {
+      "title": "Name",
+      "description": "After Effect's Name. Used for expressions.",
+      "type": "string"
+    },
+    "ty": {
+      "title": "Type",
+      "description": "Effect type.",
+      "type": "number",
+      "const": 20
+    },
+    "ef": {
+      "title": "Effects",
+      "description": "Effect List of properties.",
+      "type": "array",
+      "items": [
+        {
+          "$ref": "#/effects/color"
+        },
+        {
+          "$ref": "#/effects/color"
+        },
+        {
+          "$ref": "#/effects/slider"
+        }
+      ]
+    }
+  }
+}
diff --git a/schema/docs/json/effects/tritone.json b/schema/docs/json/effects/tritone.json
new file mode 100644
index 0000000..064e4b3
--- /dev/null
+++ b/schema/docs/json/effects/tritone.json
@@ -0,0 +1,46 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "ix": {
+      "title": "Effect Index",
+      "description": "Effect Index. Used for expressions.",
+      "type": "number"
+    },
+    "mn": {
+      "title": "Match Name",
+      "description": "After Effect's Match Name. Used for expressions.",
+      "type": "string"
+    },
+    "nm": {
+      "title": "Name",
+      "description": "After Effect's Name. Used for expressions.",
+      "type": "string"
+    },
+    "ty": {
+      "title": "Type",
+      "description": "Effect type.",
+      "type": "number",
+      "const": 23
+    },
+    "ef": {
+      "title": "Effects",
+      "description": "Effect List of properties.",
+      "type": "array",
+      "items": [
+        {
+          "$ref": "#/effects/color"
+        },
+        {
+          "$ref": "#/effects/color"
+        },
+        {
+          "$ref": "#/effects/color"
+        },
+        {
+          "$ref": "#/effects/slider"
+        }
+      ]
+    }
+  }
+}
diff --git a/schema/docs/json/helpers/blendMode.json b/schema/docs/json/helpers/blendMode.json
new file mode 100644
index 0000000..519dec9
--- /dev/null
+++ b/schema/docs/json/helpers/blendMode.json
@@ -0,0 +1,71 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "number",
+  "oneOf": [
+    {
+      "standsFor": "normal",
+      "const": 0
+    },
+    {
+      "standsFor": "multiply",
+      "const": 1
+    },
+    {
+      "standsFor": "screen",
+      "const": 2
+    },
+    {
+      "standsFor": "overlay",
+      "const": 3
+    },
+    {
+      "standsFor": "darken",
+      "const": 4
+    },
+    {
+      "standsFor": "lighten",
+      "const": 5
+    },
+    {
+      "standsFor": "colorDodge",
+      "const": 6
+    },
+    {
+      "standsFor": "colorBurn",
+      "const": 7
+    },
+    {
+      "standsFor": "hardLight",
+      "const": 8
+    },
+    {
+      "standsFor": "softLight",
+      "const": 9
+    },
+    {
+      "standsFor": "difference",
+      "const": 10
+    },
+    {
+      "standsFor": "exclusion",
+      "const": 11
+    },
+    {
+      "standsFor": "hue",
+      "const": 12
+    },
+    {
+      "standsFor": "saturation",
+      "const": 13
+    },
+    {
+      "standsFor": "color",
+      "const": 14
+    },
+    {
+      "standsFor": "luminosity",
+      "const": 15
+    }
+  ],
+  "default": 0
+}
diff --git a/schema/docs/json/helpers/boolean.json b/schema/docs/json/helpers/boolean.json
new file mode 100644
index 0000000..3a72e80
--- /dev/null
+++ b/schema/docs/json/helpers/boolean.json
@@ -0,0 +1,14 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "number",
+  "oneOf": [
+    {
+      "standsFor": false,
+      "const": 0
+    },
+    {
+      "standsFor": true,
+      "const": 1
+    }
+  ]
+}
diff --git a/schema/docs/json/helpers/composite.json b/schema/docs/json/helpers/composite.json
new file mode 100644
index 0000000..b24c2ff
--- /dev/null
+++ b/schema/docs/json/helpers/composite.json
@@ -0,0 +1,15 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "number",
+  "oneOf": [
+    {
+      "standsFor": "Above",
+      "const": 1
+    },
+    {
+      "standsFor": "Below",
+      "const": 2
+    }
+  ],
+  "default": 1
+}
diff --git a/schema/docs/json/helpers/lineCap.json b/schema/docs/json/helpers/lineCap.json
new file mode 100644
index 0000000..11727a9
--- /dev/null
+++ b/schema/docs/json/helpers/lineCap.json
@@ -0,0 +1,19 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "number",
+  "oneOf": [
+    {
+      "standsFor": "butt",
+      "const": 1
+    },
+    {
+      "standsFor": "round",
+      "const": 2
+    },
+    {
+      "standsFor": "square",
+      "const": 3
+    }
+  ],
+  "default": 2
+}
diff --git a/schema/docs/json/helpers/lineJoin.json b/schema/docs/json/helpers/lineJoin.json
new file mode 100644
index 0000000..8ce38eb
--- /dev/null
+++ b/schema/docs/json/helpers/lineJoin.json
@@ -0,0 +1,19 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "number",
+  "oneOf": [
+    {
+      "standsFor": "miter",
+      "const": 1
+    },
+    {
+      "standsFor": "round",
+      "const": 2
+    },
+    {
+      "standsFor": "bevel",
+      "const": 3
+    }
+  ],
+  "default": 2
+}
diff --git a/schema/docs/json/helpers/mask.json b/schema/docs/json/helpers/mask.json
new file mode 100644
index 0000000..9c5ff58
--- /dev/null
+++ b/schema/docs/json/helpers/mask.json
@@ -0,0 +1,80 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "inv": {
+      "title": "Inverted",
+      "description": "Inverted Mask flag",
+      "type": "boolean",
+      "default": false
+    },
+    "nm": {
+      "title": "Name",
+      "description": "Mask name. Used for expressions and effects.",
+      "type": "string"
+    },
+    "pt": {
+      "title": "Points",
+      "description": "Mask vertices",
+      "oneOf": [
+        {
+          "$ref": "#/properties/shape"
+        },
+        {
+          "$ref": "#/properties/shapeKeyframed"
+        }
+      ],
+      "type": "object"
+    },
+    "o": {
+      "title": "Opacity",
+      "description": "Mask opacity.",
+      "type": "object",
+      "oneOf": [
+        {
+          "$ref": "#/properties/value"
+        },
+        {
+          "$ref": "#/properties/valueKeyframed"
+        }
+      ],
+      "default": {"a":0, "k":100}
+    },
+    "mode": {
+      "title": "Mode",
+      "description": "Mask mode. Not all mask types are supported.",
+      "type": "string",
+      "oneOf": [
+        {
+          "standsFor": "None",
+          "const": "n"
+        },
+        {
+          "standsFor": "Additive",
+          "const": "a"
+        },
+        {
+          "standsFor": "Subtract",
+          "const": "s"
+        },
+        {
+          "standsFor": "Intersect",
+          "const": "i"
+        },
+        {
+          "standsFor": "Lighten",
+          "const": "l"
+        },
+        {
+          "standsFor": "Darken",
+          "const": "d"
+        },
+        {
+          "standsFor": "Difference",
+          "const": "f"
+        }
+      ],
+      "default": "a"
+    }
+  }
+}
diff --git a/schema/docs/json/helpers/textBased.json b/schema/docs/json/helpers/textBased.json
new file mode 100644
index 0000000..7c5c995
--- /dev/null
+++ b/schema/docs/json/helpers/textBased.json
@@ -0,0 +1,23 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "number",
+  "oneOf": [
+    {
+      "standsFor": "Characters",
+      "const": 1
+    },
+    {
+      "standsFor": "Character Excluding Spaces",
+      "const": 2
+    },
+    {
+      "standsFor": "Words",
+      "const": 3
+    },
+    {
+      "standsFor": "Lines",
+      "const": 4
+    }
+  ],
+  "default": 1
+}
diff --git a/schema/docs/json/helpers/textCaps.json b/schema/docs/json/helpers/textCaps.json
new file mode 100644
index 0000000..f8d9620
--- /dev/null
+++ b/schema/docs/json/helpers/textCaps.json
@@ -0,0 +1,19 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "number",
+  "oneOf": [
+    {
+      "standsFor": "Regular",
+      "const": 0
+    },
+    {
+      "standsFor": "All Caps",
+      "const": 1
+    },
+    {
+      "standsFor": "Small Caps",
+      "const": 2
+    }
+  ],
+  "default": 0
+}
diff --git a/schema/docs/json/helpers/textGrouping.json b/schema/docs/json/helpers/textGrouping.json
new file mode 100644
index 0000000..00cff14
--- /dev/null
+++ b/schema/docs/json/helpers/textGrouping.json
@@ -0,0 +1,23 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "number",
+  "oneOf": [
+    {
+      "standsFor": "Characters",
+      "const": 1
+    },
+    {
+      "standsFor": "Word",
+      "const": 2
+    },
+    {
+      "standsFor": "Line",
+      "const": 3
+    },
+    {
+      "standsFor": "All",
+      "const": 4
+    }
+  ],
+  "default": 1
+}
diff --git a/schema/docs/json/helpers/textJustification.json b/schema/docs/json/helpers/textJustification.json
new file mode 100644
index 0000000..5abf285
--- /dev/null
+++ b/schema/docs/json/helpers/textJustification.json
@@ -0,0 +1,35 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "number",
+  "oneOf": [
+    {
+      "standsFor": "Left Justify",
+      "const": 0
+    },
+    {
+      "standsFor": "Right Justify",
+      "const": 1
+    },
+    {
+      "standsFor": "Center Justify",
+      "const": 2
+    },
+    {
+      "standsFor": "Full Justify Last Line Left",
+      "const": 3
+    },
+    {
+      "standsFor": "Full Justify Last Line Right",
+      "const": 4
+    },
+    {
+      "standsFor": "Full Justify Last Line Center",
+      "const": 5
+    },
+    {
+      "standsFor": "Full Justify Last Line Full",
+      "const": 6
+    }
+  ],
+  "default": 0
+}
diff --git a/schema/docs/json/helpers/textShape.json b/schema/docs/json/helpers/textShape.json
new file mode 100644
index 0000000..12ae19b
--- /dev/null
+++ b/schema/docs/json/helpers/textShape.json
@@ -0,0 +1,31 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "number",
+  "oneOf": [
+    {
+      "standsFor": "Square",
+      "const": 1
+    },
+    {
+      "standsFor": "Ramp Up",
+      "const": 2
+    },
+    {
+      "standsFor": "Ramp Down",
+      "const": 3
+    },
+    {
+      "standsFor": "Triangle",
+      "const": 4
+    },
+    {
+      "standsFor": "Round",
+      "const": 5
+    },
+    {
+      "standsFor": "Smooth",
+      "const": 6
+    }
+  ],
+  "default": 1
+}
diff --git a/schema/docs/json/helpers/transform.json b/schema/docs/json/helpers/transform.json
new file mode 100644
index 0000000..3e16c9f
--- /dev/null
+++ b/schema/docs/json/helpers/transform.json
@@ -0,0 +1,146 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "a": {
+      "title": "Anchor Point",
+      "description": "Transform Anchor Point",
+      "oneOf": [
+        {
+          "$ref": "#/properties/multiDimensional"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalSpatialKeyframed"
+        }
+      ],
+      "default": {"a":0, "k":[0, 0, 0]},
+      "type": "object"
+    },
+    "p": {
+      "title": "Position",
+      "description": "Transform Position",
+      "oneOf": [
+        {
+          "$ref": "#/properties/multiDimensional"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalSpatialKeyframed"
+        }
+      ],
+      "default": {"a":0, "k":[0, 0, 0]},
+      "type": "object"
+    },
+    "s": {
+      "title": "Scale",
+      "description": "Transform Scale",
+      "oneOf": [
+        {
+          "$ref": "#/properties/multiDimensional"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalKeyframed"
+        }
+      ],
+      "default": {"a":0, "k":[100, 100, 100]},
+      "type": "object"
+    },
+    "r": {
+      "title": "Rotation",
+      "description": "Transform Rotation",
+      "oneOf": [
+        {
+          "$ref": "#/properties/value"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalKeyframed"
+        }
+      ],
+      "default": {"a":0, "k":0},
+      "type": "object"
+    },
+    "o": {
+      "title": "Opacity",
+      "description": "Transform Opacity",
+      "oneOf": [
+        {
+          "$ref": "#/properties/value"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalKeyframed"
+        }
+      ],
+      "default": {"a":0, "k":100},
+      "type": "object"
+    },
+    "px": {
+      "title": "Position X",
+      "description": "Transform Position X",
+      "oneOf": [
+        {
+          "$ref": "#/properties/value"
+        },
+        {
+          "$ref": "#/properties/valueKeyframed"
+        }
+      ],
+      "default": {"a":0, "k":0},
+      "type": "object"
+    },
+    "py": {
+      "title": "Position Y",
+      "description": "Transform Position Y",
+      "oneOf": [
+        {
+          "$ref": "#/properties/value"
+        },
+        {
+          "$ref": "#/properties/valueKeyframed"
+        }
+      ],
+      "default": {"a":0, "k":0},
+      "type": "object"
+    },
+    "pz": {
+      "title": "Position Z",
+      "description": "Transform Position Z",
+      "oneOf": [
+        {
+          "$ref": "#/properties/value"
+        },
+        {
+          "$ref": "#/properties/valueKeyframed"
+        }
+      ],
+      "default": {"a":0, "k":0},
+      "type": "object"
+    },
+    "sk": {
+      "title": "Skew",
+      "description": "Transform Skew",
+      "oneOf": [
+        {
+          "$ref": "#/properties/value"
+        },
+        {
+          "$ref": "#/properties/valueKeyframed"
+        }
+      ],
+      "default": {"a":0, "k":0},
+      "type": "object"
+    },
+    "sa": {
+      "title": "Skew Axis",
+      "description": "Transform Skew Axis",
+      "oneOf": [
+        {
+          "$ref": "#/properties/value"
+        },
+        {
+          "$ref": "#/properties/valueKeyframed"
+        }
+      ],
+      "default": {"a":0, "k":0},
+      "type": "object"
+    }
+  }
+}
diff --git a/schema/docs/json/layers/image.json b/schema/docs/json/layers/image.json
new file mode 100644
index 0000000..7d11d9a
--- /dev/null
+++ b/schema/docs/json/layers/image.json
@@ -0,0 +1,114 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "ty": {
+      "title": "Type",
+      "description": "Type of layer: Image.",
+      "type": "number",
+      "const": 2
+    },
+    "ks": {
+      "title": "Transform",
+      "description": "Transform properties",
+      "$ref": "#/helpers/transform",
+      "type": "object"
+    },
+    "ao": {
+      "title": "Auto-Orient",
+      "description": "Auto-Orient along path AE property.",
+      "type": "number",
+      "$ref": "#/helpers/boolean",
+      "default": 0
+    },
+    "bm": {
+      "title": "Blend Mode",
+      "description": "Blend Mode",
+      "type": "number",
+      "$ref": "#/helpers/blendMode",
+      "default": 0
+    },
+    "ddd": {
+      "title": "3d Layer",
+      "description": "3d layer flag",
+      "type": "number",
+      "$ref": "#/helpers/boolean",
+      "default": 0
+    },
+    "ind": {
+      "title": "Index",
+      "description": "Layer index in AE. Used for parenting and expressions.",
+      "type": "number"
+    },
+    "cl": {
+      "title": "Class",
+      "description": "Parsed layer name used as html class on SVG/HTML renderer",
+      "type": "string"
+    },
+    "ln": {
+      "title": "layer HTML ID",
+      "description": "Parsed layer name used as html id on SVG/HTML renderer",
+      "type": "string"
+    },
+    "ip": {
+      "title": "In Point",
+      "description": "In Point of layer. Sets the initial frame of the layer.",
+      "type": "number"
+    },
+    "op": {
+      "title": "Out Point",
+      "description": "Out Point of layer. Sets the final frame of the layer.",
+      "type": "number"
+    },
+    "st": {
+      "title": "Start Time",
+      "description": "Start Time of layer. Sets the start time of the layer.",
+      "type": "number"
+    },
+    "nm": {
+      "title": "Name",
+      "description": "After Effects Layer Name. Used for expressions.",
+      "type": "string"
+    },
+    "hasMask": {
+      "title": "Has Masks",
+      "description": "Boolean when layer has a mask. Will be deprecated in favor of checking masksProperties.",
+      "type": "number"
+    },
+    "masksProperties": {
+      "title": "Masks Properties",
+      "description": "List of Masks",
+      "items": {
+        "$ref": "#/helpers/mask",
+        "type": "object"
+      },
+      "type": "array"
+    },
+    "ef": {
+      "title": "Effects",
+      "description": "List of Effects",
+      "items": {
+        "$ref": "#/effects/index",
+        "type": "object"
+      },
+      "type": "array"
+    },
+    "sr": {
+      "title": "Stretch",
+      "description": "Layer Time Stretching",
+      "type": "number",
+      "default": 1
+    },
+    "parent": {
+      "title": "Parent",
+      "description": "Layer Parent. Uses ind of parent.",
+      "type": "number"
+    },
+    "refId": {
+      "title": "Reference ID",
+      "description": "id pointing to the source image defined on 'assets' object",
+      "type": "string"
+    }
+  },
+  "required": ["ty", "ks", "ip", "op", "refId"]
+}
diff --git a/schema/docs/json/layers/null.json b/schema/docs/json/layers/null.json
new file mode 100644
index 0000000..83e6677
--- /dev/null
+++ b/schema/docs/json/layers/null.json
@@ -0,0 +1,88 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "ty": {
+      "title": "Type",
+      "description": "Type of layer: Null.",
+      "type": "number",
+      "const": 3
+    },
+    "ks": {
+      "title": "Transform",
+      "description": "Transform properties",
+      "$ref": "#/helpers/transform",
+      "type": "object"
+    },
+    "ao": {
+      "title": "Auto-Orient",
+      "description": "Auto-Orient along path AE property.",
+      "type": "number",
+      "$ref": "#/helpers/boolean",
+      "default": 0
+    },
+    "ddd": {
+      "title": "3d Layer",
+      "description": "3d layer flag",
+      "type": "number",
+      "$ref": "#/helpers/boolean",
+      "default": 0
+    },
+    "ind": {
+      "title": "Index",
+      "description": "Layer index in AE. Used for parenting and expressions.",
+      "type": "number"
+    },
+    "cl": {
+      "title": "Class",
+      "description": "Parsed layer name used as html class on SVG/HTML renderer",
+      "type": "string"
+    },
+    "ln": {
+      "title": "layer HTML ID",
+      "description": "Parsed layer name used as html id on SVG/HTML renderer",
+      "type": "string"
+    },
+    "ip": {
+      "title": "In Point",
+      "description": "In Point of layer. Sets the initial frame of the layer.",
+      "type": "number"
+    },
+    "op": {
+      "title": "Out Point",
+      "description": "Out Point of layer. Sets the final frame of the layer.",
+      "type": "number"
+    },
+    "st": {
+      "title": "Start Time",
+      "description": "Start Time of layer. Sets the start time of the layer.",
+      "type": "number"
+    },
+    "nm": {
+      "title": "Name",
+      "description": "After Effects Layer Name. Used for expressions.",
+      "type": "string"
+    },
+    "ef": {
+      "title": "Effects",
+      "description": "List of Effects",
+      "items": {
+        "$ref": "#/effects/index",
+        "type": "object"
+      },
+      "type": "array"
+    },
+    "sr": {
+      "title": "Stretch",
+      "description": "Layer Time Stretching",
+      "type": "number",
+      "default": 1
+    },
+    "parent": {
+      "title": "Parent",
+      "description": "Layer Parent. Uses ind of parent.",
+      "type": "number"
+    }
+  },
+  "required": ["ty", "ks", "ip", "op"]
+}
diff --git a/schema/docs/json/layers/preComp.json b/schema/docs/json/layers/preComp.json
new file mode 100644
index 0000000..4350911
--- /dev/null
+++ b/schema/docs/json/layers/preComp.json
@@ -0,0 +1,119 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "ty": {
+      "title": "Type",
+      "description": "Type of layer: Precomp.",
+      "type": "number",
+      "const": 0
+    },
+    "ks": {
+      "title": "Transform",
+      "description": "Transform properties",
+      "$ref": "#/helpers/transform",
+      "type": "object"
+    },
+    "ao": {
+      "title": "Auto-Orient",
+      "description": "Auto-Orient along path AE property.",
+      "type": "number",
+      "$ref": "#/helpers/boolean"
+    },
+    "bm": {
+      "title": "Blend Mode",
+      "description": "Blend Mode",
+      "type": "number",
+      "$ref": "#/helpers/blendMode",
+      "default": 0
+    },
+    "ddd": {
+      "title": "3d Layer",
+      "description": "3d layer flag",
+      "type": "number",
+      "$ref": "#/helpers/boolean",
+      "default": 0
+    },
+    "ind": {
+      "title": "Index",
+      "description": "Layer index in AE. Used for parenting and expressions.",
+      "type": "number"
+    },
+    "cl": {
+      "title": "Class",
+      "description": "Parsed layer name used as html class on SVG/HTML renderer",
+      "type": "string"
+    },
+    "ln": {
+      "title": "layer HTML ID",
+      "description": "Parsed layer name used as html id on SVG/HTML renderer",
+      "type": "string"
+    },
+    "ip": {
+      "title": "In Point",
+      "description": "In Point of layer. Sets the initial frame of the layer.",
+      "type": "number"
+    },
+    "op": {
+      "title": "Out Point",
+      "description": "Out Point of layer. Sets the final frame of the layer.",
+      "type": "number"
+    },
+    "st": {
+      "title": "Start Time",
+      "description": "Start Time of layer. Sets the start time of the layer.",
+      "type": "number"
+    },
+    "nm": {
+      "title": "Name",
+      "description": "After Effects Layer Name. Used for expressions.",
+      "type": "string"
+    },
+    "hasMask": {
+      "title": "Has Masks",
+      "description": "Boolean when layer has a mask. Will be deprecated in favor of checking masksProperties.",
+      "type": "number"
+    },
+    "masksProperties": {
+      "title": "Masks Properties",
+      "description": "List of Masks",
+      "items": {
+        "$ref": "#/helpers/mask",
+        "type": "object"
+      },
+      "type": "array"
+    },
+    "ef": {
+      "title": "Effects",
+      "description": "List of Effects",
+      "items": {
+        "$ref": "#/effects/index",
+        "type": "object"
+      },
+      "type": "array"
+    },
+    "sr": {
+      "title": "Stretch",
+      "description": "Layer Time Stretching",
+      "type": "number",
+      "default": 1
+    },
+    "parent": {
+      "title": "Parent",
+      "description": "Layer Parent. Uses ind of parent.",
+      "type": "number"
+    },
+    "refId": {
+      "title": "Reference ID",
+      "description": "id pointing to the source composition defined on 'assets' object",
+      "type": "string"
+    },
+    "tm": {
+      "title": "Time Remapping",
+      "description": "Comp's Time remapping",
+      "type": "number",
+      "$ref": "#/properties/multiDimensionalKeyframed"
+    }
+  },
+  "required": ["ty", "ks", "ip", "op", "refId"]
+}
diff --git a/schema/docs/json/layers/shape.json b/schema/docs/json/layers/shape.json
new file mode 100644
index 0000000..20293c2
--- /dev/null
+++ b/schema/docs/json/layers/shape.json
@@ -0,0 +1,161 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "ty": {
+      "title": "Type",
+      "description": "Type of layer: Shape.",
+      "type": "number",
+      "const": 4
+    },
+    "ks": {
+      "title": "Transform",
+      "description": "Transform properties",
+      "$ref": "#/helpers/transform",
+      "type": "object"
+    },
+    "ao": {
+      "title": "Auto-Orient",
+      "description": "Auto-Orient along path AE property.",
+      "$ref": "#/helpers/boolean",
+      "type": "number",
+      "default": 0
+    },
+    "bm": {
+      "title": "Blend Mode",
+      "description": "Blend Mode",
+      "$ref": "#/helpers/blendMode",
+      "type": "number",
+      "default": 0
+    },
+    "ddd": {
+      "title": "3d Layer",
+      "description": "3d layer flag",
+      "$ref": "#/helpers/boolean",
+      "type": "number",
+      "default": 0
+    },
+    "ind": {
+      "title": "Index",
+      "description": "Layer index in AE. Used for parenting and expressions.",
+      "type": "number"
+    },
+    "cl": {
+      "title": "Class",
+      "description": "Parsed layer name used as html class on SVG/HTML renderer",
+      "type": "string"
+    },
+    "ln": {
+      "title": "layer HTML ID",
+      "description": "Parsed layer name used as html id on SVG/HTML renderer",
+      "type": "string"
+    },
+    "ip": {
+      "title": "In Point",
+      "description": "In Point of layer. Sets the initial frame of the layer.",
+      "type": "number"
+    },
+    "op": {
+      "title": "Out Point",
+      "description": "Out Point of layer. Sets the final frame of the layer.",
+      "type": "number"
+    },
+    "st": {
+      "title": "Start Time",
+      "description": "Start Time of layer. Sets the start time of the layer.",
+      "type": "number"
+    },
+    "nm": {
+      "title": "Name",
+      "description": "After Effects Layer Name. Used for expressions.",
+      "type": "string"
+    },
+    "hasMask": {
+      "title": "Has Masks",
+      "description": "Boolean when layer has a mask. Will be deprecated in favor of checking masksProperties.",
+      "type": "number"
+    },
+    "masksProperties": {
+      "title": "Masks Properties",
+      "description": "List of Masks",
+      "items": {
+        "$ref": "#/helpers/mask",
+        "type": "object"
+      },
+      "type": "array"
+    },
+    "ef": {
+      "title": "Effects",
+      "description": "List of Effects",
+      "items": {
+        "$ref": "#/effects/index",
+        "type": "object"
+      },
+      "type": "array"
+    },
+    "sr": {
+      "title": "Stretch",
+      "description": "Layer Time Stretching",
+      "type": "number",
+      "default": 1
+    },
+    "parent": {
+      "title": "Parent",
+      "description": "Layer Parent. Uses ind of parent.",
+      "type": "number"
+    },
+    "shapes": {
+      "title": "Items",
+      "description": "Shape list of items",
+      "items": {
+        "oneOf": [
+          {
+            "$ref": "#/shapes/shape"
+          },
+          {
+            "$ref": "#/shapes/rect"
+          },
+          {
+            "$ref": "#/shapes/ellipse"
+          },
+          {
+            "$ref": "#/shapes/star"
+          },
+          {
+            "$ref": "#/shapes/fill"
+          },
+          {
+            "$ref": "#/shapes/gFill"
+          },
+          {
+            "$ref": "#/shapes/gStroke"
+          },
+          {
+            "$ref": "#/shapes/stroke"
+          },
+          {
+            "$ref": "#/shapes/merge"
+          },
+          {
+            "$ref": "#/shapes/trim"
+          },
+          {
+            "$ref": "#/shapes/group"
+          },
+          {
+            "$ref": "#/shapes/round"
+          },
+          {
+            "$ref": "#/shapes/repeater"
+          },
+          {
+            "$ref": "#/shapes/transform"
+          }
+        ],
+        "type": "object"
+      },
+      "type": "array"
+    }
+  },
+  "required": ["ty", "ks", "ip", "op", "shapes"]
+}
diff --git a/schema/docs/json/layers/solid.json b/schema/docs/json/layers/solid.json
new file mode 100644
index 0000000..871c99c
--- /dev/null
+++ b/schema/docs/json/layers/solid.json
@@ -0,0 +1,121 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "ty": {
+      "title": "Type",
+      "description": "Type of layer: Solid.",
+      "type": "number",
+      "const": 1
+    },
+    "ks": {
+      "title": "Transform",
+      "description": "Transform properties",
+      "$ref": "#/helpers/transform",
+      "type": "object"
+    },
+    "ao": {
+      "title": "Auto-Orient",
+      "description": "Auto-Orient along path AE property.",
+      "type": "number",
+      "$ref": "#/helpers/boolean",
+      "default": 0
+    },
+    "bm": {
+      "title": "Blend Mode",
+      "description": "Blend Mode",
+      "$ref": "#/helpers/blendMode",
+      "type": "number",
+      "default": 0
+    },
+    "ddd": {
+      "title": "3d Layer",
+      "description": "3d layer flag",
+      "type": "number",
+      "$ref": "#/helpers/boolean",
+      "default": 0
+    },
+    "ind": {
+      "title": "Index",
+      "description": "Layer index in AE. Used for parenting and expressions.",
+      "type": "number"
+    },
+    "cl": {
+      "title": "Class",
+      "description": "Parsed layer name used as html class on SVG/HTML renderer",
+      "type": "string"
+    },
+    "ln": {
+      "title": "layer HTML ID",
+      "description": "Parsed layer name used as html id on SVG/HTML renderer",
+      "type": "string"
+    },
+    "ip": {
+      "title": "In Point",
+      "description": "In Point of layer. Sets the initial frame of the layer.",
+      "type": "number"
+    },
+    "op": {
+      "title": "Out Point",
+      "description": "Out Point of layer. Sets the final frame of the layer.",
+      "type": "number"
+    },
+    "st": {
+      "title": "Start Time",
+      "description": "Start Time of layer. Sets the start time of the layer.",
+      "type": "number"
+    },
+    "nm": {
+      "title": "Name",
+      "description": "After Effects Layer Name. Used for expressions.",
+      "type": "string"
+    },
+    "hasMask": {
+      "title": "Has Masks",
+      "description": "Boolean when layer has a mask. Will be deprecated in favor of checking masksProperties.",
+      "type": "number"
+    },
+    "masksProperties": {
+      "title": "Masks Properties",
+      "description": "List of Masks",
+      "items": {
+        "$ref": "#/helpers/mask",
+        "type": "object"
+      },
+      "type": "array"
+    },
+    "ef": {
+      "title": "Effects",
+      "description": "Auto-Orient along path AE property.",
+      "type": "number",
+      "$ref": "#/helpers/boolean"
+    },
+    "sr": {
+      "title": "Stretch",
+      "description": "Layer Time Stretching",
+      "type": "number",
+      "default": 1
+    },
+    "parent": {
+      "title": "Parent",
+      "description": "Layer Parent. Uses ind of parent.",
+      "type": "number"
+    },
+    "sc": {
+      "title": "Solid Color",
+      "description": "Color of the solid in hex",
+      "type": "string"
+    },
+    "sh": {
+      "title": "Solid Height",
+      "description": "Height of the solid.",
+      "type": "number"
+    },
+    "sw": {
+      "title": "Solid Width",
+      "description": "Width of the solid.",
+      "type": "number"
+    }
+  },
+  "required": ["ty", "ks", "ip", "op", "sc", "sh", "sw"]
+}
diff --git a/schema/docs/json/layers/text.json b/schema/docs/json/layers/text.json
new file mode 100644
index 0000000..26149ff
--- /dev/null
+++ b/schema/docs/json/layers/text.json
@@ -0,0 +1,531 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "ty": {
+      "title": "Type",
+      "description": "Type of layer: Text.",
+      "type": "number",
+      "const": 5
+    },
+    "ks": {
+      "title": "Transform",
+      "description": "Transform properties",
+      "$ref": "#/helpers/transform",
+      "type": "object"
+    },
+    "ao": {
+      "title": "Auto-Orient",
+      "description": "Auto-Orient along path AE property.",
+      "$ref": "#/helpers/boolean",
+      "type": "number",
+      "default": 0
+    },
+    "bm": {
+      "title": "Blend Mode",
+      "description": "Blend Mode",
+      "$ref": "#/helpers/blendMode",
+      "type": "number",
+      "default": 0
+    },
+    "ddd": {
+      "title": "3d Layer",
+      "description": "3d layer flag",
+      "$ref": "#/helpers/boolean",
+      "type": "number",
+      "default": 0
+    },
+    "ind": {
+      "title": "Index",
+      "description": "Layer index in AE. Used for parenting and expressions.",
+      "type": "number"
+    },
+    "cl": {
+      "title": "Class",
+      "description": "Parsed layer name used as html class on SVG/HTML renderer",
+      "type": "string"
+    },
+    "ln": {
+      "title": "layer HTML ID",
+      "description": "Parsed layer name used as html id on SVG/HTML renderer",
+      "type": "string"
+    },
+    "ip": {
+      "title": "In Point",
+      "description": "In Point of layer. Sets the initial frame of the layer.",
+      "type": "number"
+    },
+    "op": {
+      "title": "Out Point",
+      "description": "Out Point of layer. Sets the final frame of the layer.",
+      "type": "number"
+    },
+    "st": {
+      "title": "Start Time",
+      "description": "Start Time of layer. Sets the start time of the layer.",
+      "type": "number"
+    },
+    "nm": {
+      "title": "Name",
+      "description": "After Effects Layer Name. Used for expressions.",
+      "type": "string"
+    },
+    "hasMask": {
+      "title": "Has Masks",
+      "description": "Boolean when layer has a mask. Will be deprecated in favor of checking masksProperties.",
+      "type": "number"
+    },
+    "masksProperties": {
+      "title": "Masks Properties",
+      "description": "List of Masks",
+      "items": {
+        "$ref": "#/helpers/mask",
+        "type": "object"
+      },
+      "type": "array"
+    },
+    "ef": {
+      "title": "Effects",
+      "description": "Auto-Orient along path AE property.",
+      "$ref": "#/helpers/boolean",
+      "type": "number"
+    },
+    "sr": {
+      "title": "Stretch",
+      "description": "Layer Time Stretching",
+      "type": "number",
+      "default": 1
+    },
+    "parent": {
+      "title": "Parent",
+      "description": "Layer Parent. Uses ind of parent.",
+      "type": "number"
+    },
+    "t": {
+      "title": "Text Data",
+      "description": "Text Data",
+      "properties": {
+        "d": {
+          "title": "Text Document",
+          "description": "Text Document",
+          "properties": {
+            "k": {
+              "title": "Text Document Keyframes",
+              "description": "Text Document Keyframes",
+              "type": "array",
+              "items": {
+                "title": "Text Document Keyframe",
+                "description": "Text Document Keyframe",
+                "properties": {
+                  "t": {
+                    "title": "Time",
+                    "description": "Keyframe Time",
+                    "type": "number"
+                  },
+                  "s": {
+                    "title": "Text Properties",
+                    "description": "Text Properties",
+                    "type": "object",
+                    "properties": {
+                      "s": {
+                        "title": "Size",
+                        "description": "Text Font Size",
+                        "type": "number"
+                      },
+                      "f": {
+                        "title": "Font",
+                        "description": "Text Font",
+                        "type": "string"
+                      },
+                      "t": {
+                        "title": "Text",
+                        "description": "Text String Value",
+                        "type": "string"
+                      },
+                      "j": {
+                        "title": "Justification",
+                        "description": "Text Justification",
+                        "$ref": "#/helpers/textJustification"
+                      },
+                      "lh": {
+                        "title": "Line Height",
+                        "description": "Text Line Height",
+                        "type": "number"
+                      },
+                      "tr": {
+                        "title": "Tracking",
+                        "description": "Text Tracking",
+                        "type": "number"
+                      },
+                      "fc": {
+                        "title": "Font Color",
+                        "description": "Text Font Color",
+                        "type": "array"
+                      },
+                      "ca": {
+                        "title": "Text Caps",
+                        "description": "Text Caps",
+                        "$ref": "#/helpers/textCaps"
+                      }
+                    },
+                    "required": ["s", "f", "t", "j", "lh", "tr", "fc"]
+                  }
+                },
+                "type": "object",
+                "required": ["t"]
+              }
+            }
+          },
+          "type": "object"
+        }
+      },
+      "properties2": [
+        {
+          "title": "Animators",
+          "description": "Text animators",
+          "items": {
+            "properties": [
+              {
+                "title": "Animated Properties",
+                "description": "Text animator animated properties",
+                "properties": [
+                  {
+                    "title": "Position",
+                    "description": "Text animator Position",
+                    "oneOf": [
+                      {
+                        "$ref": "#/properties/multiDimensional"
+                      },
+                      {
+                        "$ref": "#/properties/multiDimensionalKeyframed"
+                      }
+                    ],
+                    "type": "object"
+                  },
+                  {
+                    "title": "Anchor Point",
+                    "description": "Text animator Anchor Point",
+                    "oneOf": [
+                      {
+                        "$ref": "#/properties/multiDimensional"
+                      },
+                      {
+                        "$ref": "#/properties/multiDimensionalKeyframed"
+                      }
+                    ],
+                    "type": "object"
+                  },
+                  {
+                    "title": "Scale",
+                    "description": "Text animator Scale",
+                    "oneOf": [
+                      {
+                        "$ref": "#/properties/multiDimensional"
+                      },
+                      {
+                        "$ref": "#/properties/multiDimensionalKeyframed"
+                      }
+                    ],
+                    "type": "object"
+                  },
+                  {
+                    "title": "Skew",
+                    "description": "Text animator Skew",
+                    "oneOf": [
+                      {
+                        "$ref": "#/properties/value"
+                      },
+                      {
+                        "$ref": "#/properties/valueKeyframed"
+                      }
+                    ],
+                    "type": "object"
+                  },
+                  {
+                    "title": "Skew Axis",
+                    "description": "Text animator Skew Axis",
+                    "oneOf": [
+                      {
+                        "$ref": "#/properties/value"
+                      },
+                      {
+                        "$ref": "#/properties/valueKeyframed"
+                      }
+                    ],
+                    "type": "object"
+                  },
+                  {
+                    "title": "Rotation",
+                    "description": "Text animator Rotation",
+                    "oneOf": [
+                      {
+                        "$ref": "#/properties/value"
+                      },
+                      {
+                        "$ref": "#/properties/valueKeyframed"
+                      }
+                    ],
+                    "type": "object"
+                  },
+                  {
+                    "title": "Opacity",
+                    "description": "Text animator Opacity",
+                    "oneOf": [
+                      {
+                        "$ref": "#/properties/value"
+                      },
+                      {
+                        "$ref": "#/properties/valueKeyframed"
+                      }
+                    ],
+                    "type": "object"
+                  },
+                  {
+                    "title": "Stroke Width",
+                    "description": "Text animator Stroke Width",
+                    "oneOf": [
+                      {
+                        "$ref": "#/properties/value"
+                      },
+                      {
+                        "$ref": "#/properties/valueKeyframed"
+                      }
+                    ],
+                    "type": "object"
+                  },
+                  {
+                    "title": "Stroke Color",
+                    "description": "Text animator Stroke Color",
+                    "oneOf": [
+                      {
+                        "$ref": "#/properties/multiDimensional"
+                      },
+                      {
+                        "$ref": "#/properties/multiDimensionalKeyframed"
+                      }
+                    ],
+                    "type": "object"
+                  },
+                  {
+                    "title": "Fill Color",
+                    "description": "Text animator Fill Color",
+                    "oneOf": [
+                      {
+                        "$ref": "#/properties/multiDimensional"
+                      },
+                      {
+                        "$ref": "#/properties/multiDimensionalKeyframed"
+                      }
+                    ],
+                    "type": "object"
+                  },
+                  {
+                    "title": "Fill Hue",
+                    "description": "Text animator Fill Hue",
+                    "oneOf": [
+                      {
+                        "$ref": "#/properties/value"
+                      },
+                      {
+                        "$ref": "#/properties/valueKeyframed"
+                      }
+                    ],
+                    "type": "object"
+                  },
+                  {
+                    "title": "Fill Saturation",
+                    "description": "Text animator Fill Saturation",
+                    "oneOf": [
+                      {
+                        "$ref": "#/properties/value"
+                      },
+                      {
+                        "$ref": "#/properties/valueKeyframed"
+                      }
+                    ],
+                    "type": "object"
+                  },
+                  {
+                    "title": "Fill Brightness",
+                    "description": "Text animator Fill Brightness",
+                    "oneOf": [
+                      {
+                        "$ref": "#/properties/value"
+                      },
+                      {
+                        "$ref": "#/properties/valueKeyframed"
+                      }
+                    ],
+                    "type": "object"
+                  },
+                  {
+                    "title": "Tracking",
+                    "description": "Text animator Tracking",
+                    "oneOf": [
+                      {
+                        "$ref": "#/properties/value"
+                      },
+                      {
+                        "$ref": "#/properties/valueKeyframed"
+                      }
+                    ],
+                    "type": "object"
+                  }
+                ],
+                "type": "object"
+              },
+              {
+                "title": "Range Selecton",
+                "description": "Animators Range Selecton",
+                "properties": [
+                  {
+                    "title": "Type",
+                    "description": "Selector Type. Expressible, or Normal.",
+                    "type": "number"
+                  },
+                  {
+                    "title": "Max Amount",
+                    "description": "Selector Max Amount",
+                    "oneOf": [
+                      {
+                        "$ref": "#/properties/value"
+                      },
+                      {
+                        "$ref": "#/properties/valueKeyframed"
+                      }
+                    ],
+                    "type": "number"
+                  },
+                  {
+                    "title": "Min Ease",
+                    "description": "Levels Min Ease",
+                    "oneOf": [
+                      {
+                        "$ref": "#/properties/value"
+                      },
+                      {
+                        "$ref": "#/properties/valueKeyframed"
+                      }
+                    ],
+                    "type": "number"
+                  },
+                  {
+                    "title": "Max Ease",
+                    "description": "Levels Max Ease",
+                    "oneOf": [
+                      {
+                        "$ref": "#/properties/value"
+                      },
+                      {
+                        "$ref": "#/properties/valueKeyframed"
+                      }
+                    ],
+                    "type": "number"
+                  },
+                  {
+                    "title": "Randomize",
+                    "description": "Selector Randomize Order",
+                    "$ref": "#/helpers/boolean",
+                    "type": "number"
+                  },
+                  {
+                    "title": "Shape",
+                    "description": "Selector Shape",
+                    "$ref": "#/helpers/textShape",
+                    "type": "number"
+                  },
+                  {
+                    "title": "Based On",
+                    "description": "Selector Based On",
+                    "$ref": "#/helpers/textBased",
+                    "type": "number"
+                  },
+                  {
+                    "title": "Range Units",
+                    "description": "Selector Range Units. Percentage or Index.",
+                    "type": "number"
+                  },
+                  {
+                    "title": "Start",
+                    "description": "Selector Start",
+                    "oneOf": [
+                      {
+                        "$ref": "#/properties/value"
+                      },
+                      {
+                        "$ref": "#/properties/valueKeyframed"
+                      }
+                    ],
+                    "type": "number"
+                  },
+                  {
+                    "title": "End",
+                    "description": "Selector End",
+                    "oneOf": [
+                      {
+                        "$ref": "#/properties/value"
+                      },
+                      {
+                        "$ref": "#/properties/valueKeyframed"
+                      }
+                    ],
+                    "type": "number"
+                  },
+                  {
+                    "title": "Offset",
+                    "description": "Selector Offset",
+                    "oneOf": [
+                      {
+                        "$ref": "#/properties/value"
+                      },
+                      {
+                        "$ref": "#/properties/valueKeyframed"
+                      }
+                    ],
+                    "type": "number"
+                  }
+                ],
+                "type": "object"
+              }
+            ],
+            "type": "object"
+          },
+          "type": "array"
+        },
+        {
+          "title": "More Options",
+          "description": "Text More Options",
+          "properties": [
+            {
+              "title": "Anchor Point Grouping",
+              "description": "Text Anchor Point Grouping",
+              "$ref": "#/helpers/textGrouping",
+              "type": "number"
+            },
+            {
+              "title": "Grouping Alignment",
+              "description": "Text Grouping Alignment",
+              "oneOf": [
+                {
+                  "$ref": "#/properties/multiDimensional"
+                },
+                {
+                  "$ref": "#/properties/multiDimensionalKeyframed"
+                }
+              ],
+              "type": "number"
+            }
+          ],
+          "type": "object"
+        },
+        {
+          "title": "Text Path",
+          "description": "Text Path",
+          "type": "number"
+        }
+      ],
+      "type": "object"
+    }
+  },
+  "required": ["ty", "ks", "ip", "op", "t"]
+}
diff --git a/schema/docs/json/properties/doubleKeyframe.json b/schema/docs/json/properties/doubleKeyframe.json
new file mode 100644
index 0000000..cb2e08f
--- /dev/null
+++ b/schema/docs/json/properties/doubleKeyframe.json
@@ -0,0 +1,50 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "s": {
+      "description": "Start value of keyframe segment.",
+      "extended_name": "Start",
+      "type": "number"
+    },
+    "t": {
+      "description": "Start time of keyframe segment.",
+      "extended_name": "Time",
+      "type": "number"
+    },
+    "i": {
+      "description": "Bezier curve interpolation in value.",
+      "extended_name": "In Value",
+      "properties": {
+        "x": {
+          "description": "bezier x axis. Array of numbers.",
+          "extended_name": "X axis",
+          "type": "array"
+        },
+        "y": {
+          "description": "bezier y axis. Array of numbers.",
+          "extended_name": "Y axis",
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
+    "o": {
+      "description": "Bezier curve interpolation out value.",
+      "extended_name": "Out Value",
+      "properties": {
+        "x": {
+          "description": "bezier x axis. Array of numbers.",
+          "extended_name": "X axis",
+          "type": "array"
+        },
+        "y": {
+          "description": "bezier y axis. Array of numbers.",
+          "extended_name": "Y axis",
+          "type": "array"
+        }
+      },
+      "type": "object"
+    }
+  }
+}
\ No newline at end of file
diff --git a/schema/docs/json/properties/gradient.json b/schema/docs/json/properties/gradient.json
new file mode 100644
index 0000000..5434ee9
--- /dev/null
+++ b/schema/docs/json/properties/gradient.json
@@ -0,0 +1,34 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "p": {
+      "description": "Number of gradient stops",
+      "extended_name": "Stops",
+      "type": "integer"
+    },
+    "k": {
+      "description": "Gradient colors",
+      "extended_name": "Gradient colors",
+      "oneOf": [
+        {
+          "$ref": "#/properties/multiDimensional"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalSpatialKeyframed"
+        }
+      ]
+    },
+    "ix": {
+      "description": "Property Index. Used for expressions.",
+      "extended_name": "Property Index",
+      "type": "number"
+    },
+    "a": {
+      "description": "Defines if property is animated",
+      "extended_name": "Animated",
+      "type": "number"
+    }
+  },
+  "required": ["k", "p"]
+}
diff --git a/schema/docs/json/properties/multiDimensional.json b/schema/docs/json/properties/multiDimensional.json
new file mode 100644
index 0000000..d747071
--- /dev/null
+++ b/schema/docs/json/properties/multiDimensional.json
@@ -0,0 +1,24 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "k": {
+      "description": "Property Value",
+      "extended_name": "Value",
+      "type": "array",
+      "items": {
+        "type": "number"
+      }
+    },
+    "x": {
+      "description": "Property Expression. An AE expression that modifies the value.",
+      "extended_name": "Expression",
+      "type": "string"
+    },
+    "ix": {
+      "description": "Property Index. Used for expressions.",
+      "extended_name": "Property Index",
+      "type": "number"
+    }
+  }
+}
diff --git a/schema/docs/json/properties/multiDimensionalKeyframed.json b/schema/docs/json/properties/multiDimensionalKeyframed.json
new file mode 100644
index 0000000..17d8569
--- /dev/null
+++ b/schema/docs/json/properties/multiDimensionalKeyframed.json
@@ -0,0 +1,25 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "k": {
+      "description": "Property Value keyframes",
+      "extended_name": "Keyframes",
+      "type": "array",
+      "items": {
+        "type": "object",
+        "$ref": "#/properties/offsetKeyframe"
+      }
+    },
+    "x": {
+      "description": "Property Expression. An AE expression that modifies the value.",
+      "extended_name": "Expression",
+      "type": "string"
+    },
+    "ix": {
+      "description": "Property Index. Used for expressions.",
+      "extended_name": "Property Index",
+      "type": "number"
+    }
+  }
+}
diff --git a/schema/docs/json/properties/multiDimensionalSpatialKeyframed.json b/schema/docs/json/properties/multiDimensionalSpatialKeyframed.json
new file mode 100644
index 0000000..9bf81f6
--- /dev/null
+++ b/schema/docs/json/properties/multiDimensionalSpatialKeyframed.json
@@ -0,0 +1,35 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "k": {
+      "description": "Property Value keyframes",
+      "extended_name": "Keyframes",
+      "type": "array",
+      "items": {
+        "type": "object",
+        "$ref": "#/properties/offsetSpatialKeyframe"
+      }
+    },
+    "x": {
+      "description": "Property Expression. An AE expression that modifies the value.",
+      "extended_name": "Expression",
+      "type": "string"
+    },
+    "ix": {
+      "description": "Property Index. Used for expressions.",
+      "extended_name": "Property Index",
+      "type": "number"
+    },
+    "ti": {
+      "description": "In Spatial Tangent. Only for spatial properties. Array of numbers.",
+      "extended_name": "In Tangent",
+      "type": "array"
+    },
+    "to": {
+      "description": "Out Spatial Tangent. Only for spatial properties. Array of numbers.",
+      "extended_name": "Out Tangent",
+      "type": "array"
+    }
+  }
+}
diff --git a/schema/docs/json/properties/offsetKeyframe.json b/schema/docs/json/properties/offsetKeyframe.json
new file mode 100644
index 0000000..40d561e
--- /dev/null
+++ b/schema/docs/json/properties/offsetKeyframe.json
@@ -0,0 +1,53 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "s": {
+      "description": "Start value of keyframe segment.",
+      "extended_name": "Start",
+      "items": {
+        "type": "number"
+      },
+      "type": "array"
+    },
+    "t": {
+      "description": "Start time of keyframe segment.",
+      "extended_name": "Time",
+      "type": "number"
+    },
+    "i": {
+      "description": "Bezier curve interpolation in value.",
+      "extended_name": "In Value",
+      "properties": {
+        "x": {
+          "description": "bezier x axis. Array of numbers.",
+          "extended_name": "X axis",
+          "type": "array"
+        },
+        "y": {
+          "description": "bezier y axis. Array of numbers.",
+          "extended_name": "Y axis",
+          "type": "array"
+        }
+      },
+      "type": "object"
+    },
+    "o": {
+      "description": "Bezier curve interpolation out value.",
+      "extended_name": "Out Value",
+      "properties": {
+        "x": {
+          "description": "bezier x axis. Array of numbers.",
+          "extended_name": "X axis",
+          "type": "array"
+        },
+        "y": {
+          "description": "bezier y axis. Array of numbers.",
+          "extended_name": "Y axis",
+          "type": "array"
+        }
+      },
+      "type": "object"
+    }
+  }
+}
\ No newline at end of file
diff --git a/schema/docs/json/properties/offsetSpatialKeyframe.json b/schema/docs/json/properties/offsetSpatialKeyframe.json
new file mode 100644
index 0000000..a688f2f
--- /dev/null
+++ b/schema/docs/json/properties/offsetSpatialKeyframe.json
@@ -0,0 +1,53 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "s": {
+      "description": "Start value of keyframe segment.",
+      "extended_name": "Start",
+      "items": {
+        "type": "number"
+      },
+      "type": "array"
+    },
+    "t": {
+      "description": "Start time of keyframe segment.",
+      "extended_name": "Time",
+      "type": "number"
+    },
+    "i": {
+      "description": "Bezier curve interpolation in value.",
+      "extended_name": "In Value",
+      "properties": {
+        "x": {
+          "description": "bezier x axis. Array of numbers.",
+          "extended_name": "X axis",
+          "type": "number"
+        },
+        "y": {
+          "description": "bezier y axis. Array of numbers.",
+          "extended_name": "Y axis",
+          "type": "number"
+        }
+      },
+      "type": "object"
+    },
+    "o": {
+      "description": "Bezier curve interpolation out value.",
+      "extended_name": "Out Value",
+      "properties": {
+        "x": {
+          "description": "bezier x axis. Array of numbers.",
+          "extended_name": "X axis",
+          "type": "number"
+        },
+        "y": {
+          "description": "bezier y axis. Array of numbers.",
+          "extended_name": "Y axis",
+          "type": "number"
+        }
+      },
+      "type": "object"
+    }
+  }
+}
\ No newline at end of file
diff --git a/schema/docs/json/properties/shape.json b/schema/docs/json/properties/shape.json
new file mode 100644
index 0000000..7ce61e3
--- /dev/null
+++ b/schema/docs/json/properties/shape.json
@@ -0,0 +1,28 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "k": {
+      "description": "Property Value",
+      "extended_name": "Value",
+      "type": "object",
+      "$ref": "#/properties/shapeProp"
+    },
+    "x": {
+      "description": "Property Expression. An AE expression that modifies the value.",
+      "extended_name": "Expression",
+      "type": "string"
+    },
+    "ix": {
+      "description": "Property Index. Used for expressions.",
+      "extended_name": "Property Index",
+      "type": "number"
+    },
+    "a": {
+      "description": "Defines if property is animated",
+      "extended_name": "Animated",
+      "type": "number"
+    }
+  },
+  "required": ["k"]
+}
diff --git a/schema/docs/json/properties/shapeKeyframed.json b/schema/docs/json/properties/shapeKeyframed.json
new file mode 100644
index 0000000..545a9cb
--- /dev/null
+++ b/schema/docs/json/properties/shapeKeyframed.json
@@ -0,0 +1,26 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "k": {
+      "description": "Property Value keyframes",
+      "extended_name": "Keyframes",
+      "items": {
+        "type": "object",
+        "$ref": "#/properties/shapePropKeyframe"
+      },
+      "type": "array"
+    },
+    "x": {
+      "description": "Property Expression. An AE expression that modifies the value.",
+      "extended_name": "Expression",
+      "type": "string"
+    },
+    "ix": {
+      "description": "Property Index. Used for expressions.",
+      "extended_name": "Property Index",
+      "type": "number"
+    }
+  },
+  "required": ["k"]
+}
diff --git a/schema/docs/json/properties/shapeProp.json b/schema/docs/json/properties/shapeProp.json
new file mode 100644
index 0000000..b3e827f
--- /dev/null
+++ b/schema/docs/json/properties/shapeProp.json
@@ -0,0 +1,51 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema",
+  "type": "object",
+  "properties": {
+    "c": {
+      "description": "Closed property of shape",
+      "extended_name": "Closed",
+      "type": "boolean"
+    },
+    "i": {
+      "description": "Bezier curve In points. Array of 2 dimensional arrays.",
+      "extended_name": "In Point",
+      "type": "array",
+      "items": {
+        "type": "array",
+        "minItems": 2,
+        "maxItems": 2,
+        "items": {
+          "type": "number"
+        }
+      }
+    },
+    "o": {
+      "description": "Bezier curve Out points. Array of 2 dimensional arrays.",
+      "extended_name": "Out Point",
+      "type": "array",
+      "items": {
+        "type": "array",
+        "minItems": 2,
+        "maxItems": 2,
+        "items": {
+          "type": "number"
+        }
+      }
+    },
+    "v": {
+      "description": "Bezier curve Vertices. Array of 2 dimensional arrays.",
+      "extended_name": "Vertices",
+      "type": "array",
+      "items": {
+        "type": "array",
+        "minItems": 2,
+        "maxItems": 2,
+        "items": {
+          "type": "number"
+        }
+      }
+    }
+  },
+  "required": ["i", "o", "v"]
+}
\ No newline at end of file
diff --git a/schema/docs/json/properties/shapePropKeyframe.json b/schema/docs/json/properties/shapePropKeyframe.json
new file mode 100644
index 0000000..2d9b134
--- /dev/null
+++ b/schema/docs/json/properties/shapePropKeyframe.json
@@ -0,0 +1,55 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "s": {
+      "description": "Start value of keyframe segment.",
+      "extended_name": "Start",
+      "items": {
+        "type": "object",
+        "$ref": "#/properties/shapeProp"
+      },
+      "type": "array"
+    },
+    "t": {
+      "description": "Start time of keyframe segment.",
+      "extended_name": "Time",
+      "type": "number"
+    },
+    "i": {
+      "description": "Bezier curve interpolation in value.",
+      "extended_name": "In Value",
+      "properties": {
+        "x": {
+          "description": "bezier x axis. Array of numbers.",
+          "extended_name": "X axis",
+          "type": "number"
+        },
+        "y": {
+          "description": "bezier y axis. Array of numbers.",
+          "extended_name": "Y axis",
+          "type": "number"
+        }
+      },
+      "type": "object"
+    },
+    "o": {
+      "description": "Bezier curve interpolation out value.",
+      "extended_name": "Out Value",
+      "properties": {
+        "x": {
+          "description": "bezier x axis. Array of numbers.",
+          "extended_name": "X axis",
+          "type": "number"
+        },
+        "y": {
+          "description": "bezier y axis. Array of numbers.",
+          "extended_name": "Y axis",
+          "type": "number"
+        }
+      },
+      "type": "object"
+    }
+  },
+  "required": ["t","s"]
+}
\ No newline at end of file
diff --git a/schema/docs/json/properties/value.json b/schema/docs/json/properties/value.json
new file mode 100644
index 0000000..a6b4e97
--- /dev/null
+++ b/schema/docs/json/properties/value.json
@@ -0,0 +1,21 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "k": {
+      "description": "Property Value",
+      "extended_name": "Value",
+      "type": "number"
+    },
+    "x": {
+      "description": "Property Expression. An AE expression that modifies the value.",
+      "extended_name": "Expression",
+      "type": "string"
+    },
+    "ix": {
+      "description": "Property Index. Used for expressions.",
+      "extended_name": "Property Index",
+      "type": "number"
+    }
+  }
+}
diff --git a/schema/docs/json/properties/valueKeyframe.json b/schema/docs/json/properties/valueKeyframe.json
new file mode 100644
index 0000000..4aa78e7
--- /dev/null
+++ b/schema/docs/json/properties/valueKeyframe.json
@@ -0,0 +1,33 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema",
+  "type": "object",
+  "properties": {
+    "s": {
+      "description": "Start value of keyframe segment.",
+      "extended_name": "Start",
+      "type": "number"
+    },
+    "t": {
+      "description": "Start time of keyframe segment.",
+      "extended_name": "Time",
+      "type": "number"
+    },
+    "i": {
+      "description": "Bezier curve interpolation in value.",
+      "extended_name": "In Value",
+      "type": "object",
+      "properties": {
+        "x": {
+          "description": "bezier x axis",
+          "extended_name": "X axis",
+          "type": "number"
+        },
+        "y": {
+          "description": "bezier y axis",
+          "extended_name": "Y axis",
+          "type": "number"
+        }
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/schema/docs/json/properties/valueKeyframed.json b/schema/docs/json/properties/valueKeyframed.json
new file mode 100644
index 0000000..ed5d8c1
--- /dev/null
+++ b/schema/docs/json/properties/valueKeyframed.json
@@ -0,0 +1,25 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "k": {
+      "description": "Property Value keyframes",
+      "extended_name": "Keyframes",
+      "type": "array",
+      "items": {
+        "type": "object",
+        "$ref": "#/properties/valueKeyframe"
+      }
+    },
+    "x": {
+      "description": "Property Expression. An AE expression that modifies the value.",
+      "extended_name": "Expression",
+      "type": "string"
+    },
+    "ix": {
+      "description": "Property Index. Used for expressions.",
+      "extended_name": "Property Index",
+      "type": "number"
+    }
+  }
+}
diff --git a/schema/docs/json/shapes/ellipse.json b/schema/docs/json/shapes/ellipse.json
new file mode 100644
index 0000000..d159e8e
--- /dev/null
+++ b/schema/docs/json/shapes/ellipse.json
@@ -0,0 +1,55 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "mn": {
+      "title": "Match Name",
+      "description": "After Effect's Match Name. Used for expressions.",
+      "type": "string"
+    },
+    "nm": {
+      "title": "Name",
+      "description": "After Effect's Name. Used for expressions.",
+      "type": "string"
+    },
+    "d": {
+      "title": "Direction",
+      "description": "After Effect's Direction. Direction how the shape is drawn. Used for trim path for example.",
+      "type": "number",
+      "default": 1
+    },
+    "ty": {
+      "title": "Type",
+      "description": "Shape content type.",
+      "type": "string",
+      "const": "el"
+    },
+    "p": {
+      "title": "Position",
+      "description": "Ellipse's position",
+      "oneOf": [
+        {
+          "$ref": "#/properties/multiDimensional"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalSpatialKeyframed"
+        }
+      ],
+      "type": "object"
+    },
+    "s": {
+      "title": "Size",
+      "description": "Ellipse's size",
+      "oneOf": [
+        {
+          "$ref": "#/properties/multiDimensional"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalKeyframed"
+        }
+      ],
+      "type": "object"
+    }
+  },
+  "required": ["p", "s", "ty"]
+}
diff --git a/schema/docs/json/shapes/fill.json b/schema/docs/json/shapes/fill.json
new file mode 100644
index 0000000..d94882e
--- /dev/null
+++ b/schema/docs/json/shapes/fill.json
@@ -0,0 +1,49 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "mn": {
+      "title": "Match Name",
+      "description": "After Effect's Match Name. Used for expressions.",
+      "type": "string"
+    },
+    "nm": {
+      "title": "Name",
+      "description": "After Effect's Name. Used for expressions.",
+      "type": "string"
+    },
+    "ty": {
+      "title": "Type",
+      "description": "Shape content type.",
+      "type": "string",
+      "const": "fl"
+    },
+    "o": {
+      "title": "Opacity",
+      "description": "Fill Opacity",
+      "oneOf": [
+        {
+          "$ref": "#/properties/value"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalKeyframed"
+        }
+      ],
+      "type": "object"
+    },
+    "c": {
+      "title": "Color",
+      "description": "Fill Color",
+      "oneOf": [
+        {
+          "$ref": "#/properties/multiDimensional"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalKeyframed"
+        }
+      ],
+      "type": "object"
+    }
+  },
+  "required": ["ty", "o", "c"]
+}
diff --git a/schema/docs/json/shapes/gFill.json b/schema/docs/json/shapes/gFill.json
new file mode 100644
index 0000000..ee582a7
--- /dev/null
+++ b/schema/docs/json/shapes/gFill.json
@@ -0,0 +1,122 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "mn": {
+      "title": "Match Name",
+      "description": "After Effect's Match Name. Used for expressions.",
+      "type": "string"
+    },
+    "nm": {
+      "title": "Name",
+      "description": "After Effect's Name. Used for expressions.",
+      "type": "string"
+    },
+    "ty": {
+      "title": "Type",
+      "description": "Shape content type.",
+      "type": "string",
+      "const": "gf"
+    },
+    "o": {
+      "title": "Opacity",
+      "description": "Fill Opacity",
+      "oneOf": [
+        {
+          "$ref": "#/properties/value"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalKeyframed"
+        }
+      ],
+      "type": "object"
+    },
+    "s": {
+      "title": "Start Point",
+      "description": "Gradient Start Point",
+      "oneOf": [
+        {
+          "$ref": "#/properties/multiDimensional"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalSpatialKeyframed"
+        }
+      ],
+      "type": "object"
+    },
+    "e": {
+      "title": "End Point",
+      "description": "Gradient End Point",
+      "oneOf": [
+        {
+          "$ref": "#/properties/multiDimensional"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalSpatialKeyframed"
+        }
+      ],
+      "type": "object"
+    },
+    "t": {
+      "title": "Type",
+      "description": "Gradient Type",
+      "oneOf": [
+        {
+          "standsFor": "Linear",
+          "const": 1
+        },
+        {
+          "standsFor": "Radial",
+          "const": 2
+        }
+      ],
+      "type": "number"
+    },
+    "h": {
+      "title": "Highlight Length",
+      "description": "Gradient Highlight Length. Only if type is Radial",
+      "oneOf": [
+        {
+          "$ref": "#/properties/value"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalKeyframed"
+        }
+      ],
+      "type": "object"
+    },
+    "a": {
+      "title": "Highlight Angle",
+      "description": "Highlight Angle. Only if type is Radial",
+      "oneOf": [
+        {
+          "$ref": "#/properties/value"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalKeyframed"
+        }
+      ],
+      "type": "object"
+    },
+    "g": {
+      "title": "Gradient Colors",
+      "description": "Gradient Colors",
+      "$ref": "#/properties/gradient"
+    }
+  },
+  "anyOf": [
+    {
+      "properties": {
+        "t": { "const": 2 }
+      },
+      "required": ["h", "a"]
+    },
+    {
+      "properties": {
+        "t": { "const": 1 }
+      },
+      "required": []
+    }
+  ],
+  "required": ["s", "e", "o", "t", "ty"]
+}
diff --git a/schema/docs/json/shapes/gStroke.json b/schema/docs/json/shapes/gStroke.json
new file mode 100644
index 0000000..3a60523
--- /dev/null
+++ b/schema/docs/json/shapes/gStroke.json
@@ -0,0 +1,152 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "mn": {
+      "title": "Match Name",
+      "description": "After Effect's Match Name. Used for expressions.",
+      "type": "string"
+    },
+    "nm": {
+      "title": "Name",
+      "description": "After Effect's Name. Used for expressions.",
+      "type": "string"
+    },
+    "ty": {
+      "title": "Type",
+      "description": "Shape content type.",
+      "type": "string",
+      "const": "gs"
+    },
+    "o": {
+      "title": "Opacity",
+      "description": "Fill Opacity",
+      "oneOf": [
+        {
+          "$ref": "#/properties/value"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalKeyframed"
+        }
+      ],
+      "type": "object"
+    },
+    "s": {
+      "title": "Start Point",
+      "description": "Gradient Start Point",
+      "oneOf": [
+        {
+          "$ref": "#/properties/multiDimensional"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalSpatialKeyframed"
+        }
+      ],
+      "type": "object"
+    },
+    "e": {
+      "title": "End Point",
+      "description": "Gradient End Point",
+      "oneOf": [
+        {
+          "$ref": "#/properties/multiDimensional"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalSpatialKeyframed"
+        }
+      ],
+      "type": "object"
+    },
+    "t": {
+      "title": "Type",
+      "description": "Gradient Type",
+      "oneOf": [
+        {
+          "standsFor": "Linear",
+          "const": 1
+        },
+        {
+          "standsFor": "Radial",
+          "const": 2
+        }
+      ],
+      "type": "number"
+    },
+    "h": {
+      "title": "Highlight Length",
+      "description": "Gradient Highlight Length. Only if type is Radial",
+      "oneOf": [
+        {
+          "$ref": "#/properties/value"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalKeyframed"
+        }
+      ],
+      "type": "object"
+    },
+    "a": {
+      "title": "Highlight Angle",
+      "description": "Highlight Angle. Only if type is Radial",
+      "oneOf": [
+        {
+          "$ref": "#/properties/value"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalKeyframed"
+        }
+      ],
+      "type": "object"
+    },
+    "g": {
+      "title": "Gradient Colors",
+      "description": "Gradient Colors",
+      "$ref": "#/properties/gradient"
+    },
+    "w": {
+      "title": "Stroke Width",
+      "description": "Gradient Stroke Width",
+      "oneOf": [
+        {
+          "$ref": "#/properties/value"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalKeyframed"
+        }
+      ],
+      "type": "object"
+    },
+    "lc": {
+      "title": "Line Cap",
+      "description": "Gradient Stroke Line Cap",
+      "$ref": "#/helpers/lineCap",
+      "type": "integer"
+    },
+    "lj": {
+      "title": "Line Join",
+      "description": "Gradient Stroke Line Join",
+      "$ref": "#/helpers/lineJoin",
+      "type": "integer"
+    },
+    "ml": {
+      "title": "Miter Limit",
+      "description": "Gradient Stroke Miter Limit. Only if Line Join is set to Miter.",
+      "type": "number"
+    }
+  },
+  "anyOf": [
+    {
+      "properties": {
+        "t": { "const": 2 }
+      },
+      "required": ["h", "a"]
+    },
+    {
+      "properties": {
+        "t": { "const": 1 }
+      },
+      "required": []
+    }
+  ],
+  "required": ["s", "e", "o", "t", "ty"]
+}
diff --git a/schema/docs/json/shapes/group.json b/schema/docs/json/shapes/group.json
new file mode 100644
index 0000000..61404d7
--- /dev/null
+++ b/schema/docs/json/shapes/group.json
@@ -0,0 +1,80 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "mn": {
+      "title": "Match Name",
+      "description": "After Effect's Match Name. Used for expressions.",
+      "type": "string"
+    },
+    "nm": {
+      "title": "Name",
+      "description": "After Effect's Name. Used for expressions.",
+      "type": "string"
+    },
+    "ty": {
+      "title": "Type",
+      "description": "Shape content type.",
+      "type": "string",
+      "const": "gr"
+    },
+    "np": {
+      "title": "Number of Properties",
+      "description": "Group number of properties. Used for expressions.",
+      "type": "number"
+    },
+    "it": {
+      "title": "Items",
+      "description": "Group list of items",
+      "items": {
+        "oneOf": [
+          {
+            "$ref": "#/shapes/shape"
+          },
+          {
+            "$ref": "#/shapes/rect"
+          },
+          {
+            "$ref": "#/shapes/ellipse"
+          },
+          {
+            "$ref": "#/shapes/star"
+          },
+          {
+            "$ref": "#/shapes/fill"
+          },
+          {
+            "$ref": "#/shapes/gFill"
+          },
+          {
+            "$ref": "#/shapes/gStroke"
+          },
+          {
+            "$ref": "#/shapes/stroke"
+          },
+          {
+            "$ref": "#/shapes/merge"
+          },
+          {
+            "$ref": "#/shapes/trim"
+          },
+          {
+            "$ref": "#/shapes/group"
+          },
+          {
+            "$ref": "#/shapes/round"
+          },
+          {
+            "$ref": "#/shapes/repeater"
+          },
+          {
+            "$ref": "#/shapes/transform"
+          }
+        ],
+        "type": "object"
+      },
+      "type": "array"
+    }
+  },
+  "required": ["it", "ty"]
+}
diff --git a/schema/docs/json/shapes/merge.json b/schema/docs/json/shapes/merge.json
new file mode 100644
index 0000000..56e82a7
--- /dev/null
+++ b/schema/docs/json/shapes/merge.json
@@ -0,0 +1,27 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "mn": {
+      "title": "Match Name",
+      "description": "After Effect's Match Name. Used for expressions.",
+      "type": "string"
+    },
+    "nm": {
+      "title": "Name",
+      "description": "After Effect's Name. Used for expressions.",
+      "type": "string"
+    },
+    "ty": {
+      "title": "Type",
+      "description": "Shape content type. THIS FEATURE IS NOT SUPPORTED. It's exported because if you export it, they will come.",
+      "type": "string",
+      "const": "mm"
+    },
+    "mm": {
+      "title": "Merge Mode",
+      "description": "Merge Mode",
+      "type": "number"
+    }
+  }
+}
diff --git a/schema/docs/json/shapes/rect.json b/schema/docs/json/shapes/rect.json
new file mode 100644
index 0000000..f1752ca
--- /dev/null
+++ b/schema/docs/json/shapes/rect.json
@@ -0,0 +1,67 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "mn": {
+      "title": "Match Name",
+      "description": "After Effect's Match Name. Used for expressions.",
+      "type": "string"
+    },
+    "nm": {
+      "title": "Name",
+      "description": "After Effect's Name. Used for expressions.",
+      "type": "string"
+    },
+    "d": {
+      "title": "Direction",
+      "description": "After Effect's Direction. Direction how the shape is drawn. Used for trim path for example.",
+      "type": "number"
+    },
+    "ty": {
+      "title": "Type",
+      "description": "Shape content type.",
+      "type": "string",
+      "const": "rc"
+    },
+    "p": {
+      "title": "Position",
+      "description": "Rect's position",
+      "oneOf": [
+        {
+          "$ref": "#/properties/multiDimensional"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalSpatialKeyframed"
+        }
+      ],
+      "type": "object"
+    },
+    "s": {
+      "title": "Size",
+      "description": "Rect's size",
+      "oneOf": [
+        {
+          "$ref": "#/properties/multiDimensional"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalKeyframed"
+        }
+      ],
+      "type": "object"
+    },
+    "r": {
+      "title": "Rounded corners",
+      "description": "Rect's rounded corners",
+      "oneOf": [
+        {
+          "$ref": "#/properties/value"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalKeyframed"
+        }
+      ],
+      "type": "object"
+    }
+  },
+  "required": ["r", "s", "p", "ty"]
+}
diff --git a/schema/docs/json/shapes/repeater.json b/schema/docs/json/shapes/repeater.json
new file mode 100644
index 0000000..e6c24e8
--- /dev/null
+++ b/schema/docs/json/shapes/repeater.json
@@ -0,0 +1,64 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "mn": {
+      "title": "Match Name",
+      "description": "After Effect's Match Name. Used for expressions.",
+      "type": "string"
+    },
+    "nm": {
+      "title": "Name",
+      "description": "After Effect's Name. Used for expressions.",
+      "type": "string"
+    },
+    "ty": {
+      "title": "Type",
+      "description": "Shape content type.",
+      "type": "string",
+      "const": "rp"
+    },
+    "c": {
+      "title": "Copies",
+      "description": "Number of Copies",
+      "oneOf": [
+        {
+          "$ref": "#/properties/value"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalKeyframed"
+        }
+      ],
+      "type": "object",
+      "default": {"a": 0, "k": 1}
+    },
+    "o": {
+      "title": "Offset",
+      "description": "Offset of Copies",
+      "oneOf": [
+        {
+          "$ref": "#/properties/value"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalKeyframed"
+        }
+      ],
+      "type": "object",
+      "default": {"a": 0, "k": 0}
+    },
+    "m": {
+      "title": "Composite",
+      "description": "Composite of copies",
+      "$ref": "#/helpers/composite",
+      "type": "number",
+      "default": 1
+    },
+    "tr": {
+      "title": "Transform",
+      "description": "Transform values for each repeater copy",
+      "$ref": "#/helpers/transform",
+      "type": "object"
+    }
+  },
+  "required": ["c", "o", "tr", "ty"]
+}
diff --git a/schema/docs/json/shapes/round.json b/schema/docs/json/shapes/round.json
new file mode 100644
index 0000000..b1c4853
--- /dev/null
+++ b/schema/docs/json/shapes/round.json
@@ -0,0 +1,36 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "mn": {
+      "title": "Match Name",
+      "description": "After Effect's Match Name. Used for expressions.",
+      "type": "string"
+    },
+    "nm": {
+      "title": "Name",
+      "description": "After Effect's Name. Used for expressions.",
+      "type": "string"
+    },
+    "ty": {
+      "title": "Type",
+      "description": "Shape content type.",
+      "type": "string",
+      "const": "rd"
+    },
+    "r": {
+      "title": "Radius",
+      "description": "Rounded Corner Radius",
+      "oneOf": [
+        {
+          "$ref": "#/properties/value"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalKeyframed"
+        }
+      ],
+      "type": "object"
+    }
+  },
+  "required": ["r", "ty"]
+}
diff --git a/schema/docs/json/shapes/shape.json b/schema/docs/json/shapes/shape.json
new file mode 100644
index 0000000..a66a916
--- /dev/null
+++ b/schema/docs/json/shapes/shape.json
@@ -0,0 +1,41 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "mn": {
+      "title": "Match Name",
+      "description": "After Effect's Match Name. Used for expressions.",
+      "type": "string"
+    },
+    "nm": {
+      "title": "Name",
+      "description": "After Effect's Name. Used for expressions.",
+      "type": "string"
+    },
+    "d": {
+      "title": "Direction",
+      "description": "After Effect's Direction. Direction how the shape is drawn. Used for trim path for example.",
+      "type": "number"
+    },
+    "ty": {
+      "title": "Type",
+      "description": "Shape content type.",
+      "type": "string",
+      "const": "sh"
+    },
+    "ks": {
+      "title": "Vertices",
+      "description": "Shape's vertices",
+      "oneOf": [
+        {
+          "$ref": "#/properties/shape"
+        },
+        {
+          "$ref": "#/properties/shapeKeyframed"
+        }
+      ],
+      "type": "object"
+    }
+  },
+  "required": ["ks", "ty"]
+}
diff --git a/schema/docs/json/shapes/star.json b/schema/docs/json/shapes/star.json
new file mode 100644
index 0000000..3a24427
--- /dev/null
+++ b/schema/docs/json/shapes/star.json
@@ -0,0 +1,148 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "mn": {
+      "title": "Match Name",
+      "description": "After Effect's Match Name. Used for expressions.",
+      "type": "string"
+    },
+    "nm": {
+      "title": "Name",
+      "description": "After Effect's Name. Used for expressions.",
+      "type": "string"
+    },
+    "d": {
+      "title": "Direction",
+      "description": "After Effect's Direction. Direction how the shape is drawn. Used for trim path for example.",
+      "type": "number"
+    },
+    "ty": {
+      "title": "Type",
+      "description": "Shape content type.",
+      "type": "string",
+      "const": "sr"
+    },
+    "p": {
+      "title": "Position",
+      "description": "Star's position",
+      "oneOf": [
+        {
+          "$ref": "#/properties/multiDimensional"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalSpatialKeyframed"
+        }
+      ],
+      "type": "object"
+    },
+    "ir": {
+      "title": "Inner Radius",
+      "description": "Star's inner radius. (Star only)",
+      "oneOf": [
+        {
+          "$ref": "#/properties/value"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalKeyframed"
+        }
+      ],
+      "type": "object"
+    },
+    "is": {
+      "title": "Inner Roundness",
+      "description": "Star's inner roundness. (Star only)",
+      "oneOf": [
+        {
+          "$ref": "#/properties/value"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalKeyframed"
+        }
+      ],
+      "type": "object"
+    },
+    "or": {
+      "title": "Outer Radius",
+      "description": "Star's outer radius.",
+      "oneOf": [
+        {
+          "$ref": "#/properties/value"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalKeyframed"
+        }
+      ],
+      "type": "object"
+    },
+    "os": {
+      "title": "Outer Roundness",
+      "description": "Star's outer roundness.",
+      "oneOf": [
+        {
+          "$ref": "#/properties/value"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalKeyframed"
+        }
+      ],
+      "type": "object"
+    },
+    "r": {
+      "title": "Rotation",
+      "description": "Star's rotation.",
+      "oneOf": [
+        {
+          "$ref": "#/properties/value"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalKeyframed"
+        }
+      ],
+      "type": "object"
+    },
+    "pt": {
+      "title": "Points",
+      "description": "Star's number of points.",
+      "oneOf": [
+        {
+          "$ref": "#/properties/value"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalKeyframed"
+        }
+      ],
+      "type": "object"
+    },
+    "sy": {
+      "title": "Star Type",
+      "description": "Star's type. Polygon or Star.",
+      "type": "number",
+      "oneOf": [
+        {
+          "standsFor": "Star",
+          "const": 1
+        },
+        {
+          "standsFor": "Polygon",
+          "const": 2
+        }
+      ]
+    }
+  },
+  "anyOf": [
+    {
+      "properties": {
+        "sy": { "const": 2 }
+      },
+      "required": []
+    },
+    {
+      "properties": {
+        "sy": { "const": 1 }
+      },
+      "required": ["ir", "is"]
+    }
+  ],
+  "required": ["p", "pt", "r", "os", "or", "ty"]
+}
diff --git a/schema/docs/json/shapes/stroke.json b/schema/docs/json/shapes/stroke.json
new file mode 100644
index 0000000..3f25068
--- /dev/null
+++ b/schema/docs/json/shapes/stroke.json
@@ -0,0 +1,79 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "mn": {
+      "title": "Match Name",
+      "description": "After Effect's Match Name. Used for expressions.",
+      "type": "string"
+    },
+    "nm": {
+      "title": "Name",
+      "description": "After Effect's Name. Used for expressions.",
+      "type": "string"
+    },
+    "ty": {
+      "title": "Type",
+      "description": "Shape content type.",
+      "type": "string",
+      "const": "st"
+    },
+    "lc": {
+      "title": "Line Cap",
+      "description": "Stroke Line Cap",
+      "$ref": "#/helpers/lineCap",
+      "type": "number"
+    },
+    "lj": {
+      "title": "Line Join",
+      "description": "Stroke Line Join",
+      "$ref": "#/helpers/lineJoin",
+      "type": "number"
+    },
+    "ml": {
+      "title": "Miter Limit",
+      "description": "Stroke Miter Limit. Only if Line Join is set to Miter.",
+      "type": "number"
+    },
+    "o": {
+      "title": "Opacity",
+      "description": "Stroke Opacity",
+      "oneOf": [
+        {
+          "$ref": "#/properties/value"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalKeyframed"
+        }
+      ],
+      "type": "object"
+    },
+    "w": {
+      "title": "Width",
+      "description": "Stroke Width",
+      "oneOf": [
+        {
+          "$ref": "#/properties/value"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalKeyframed"
+        }
+      ],
+      "type": "object"
+    },
+    "c": {
+      "title": "Color",
+      "description": "Stroke Color",
+      "oneOf": [
+        {
+          "$ref": "#/properties/multiDimensional"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalKeyframed"
+        }
+      ],
+      "type": "object"
+    }
+  },
+  "required": ["c", "w", "o", "ty"]
+}
diff --git a/schema/docs/json/shapes/transform.json b/schema/docs/json/shapes/transform.json
new file mode 100644
index 0000000..a30fef5
--- /dev/null
+++ b/schema/docs/json/shapes/transform.json
@@ -0,0 +1,108 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "nm": {
+      "title": "Name",
+      "description": "After Effect's Name. Used for expressions.",
+      "type": "string"
+    },
+    "a": {
+      "title": "Anchor Point",
+      "description": "Shape Transform Anchor Point",
+      "oneOf": [
+        {
+          "$ref": "#/properties/multiDimensional"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalKeyframed"
+        }
+      ],
+      "type": "object"
+    },
+    "p": {
+      "title": "Position",
+      "description": "Shape Transform Position",
+      "oneOf": [
+        {
+          "$ref": "#/properties/multiDimensional"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalKeyframed"
+        }
+      ],
+      "type": "object"
+    },
+    "s": {
+      "title": "Scale",
+      "description": "Shape Transform Scale",
+      "oneOf": [
+        {
+          "$ref": "#/properties/multiDimensional"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalKeyframed"
+        }
+      ],
+      "type": "object"
+    },
+    "r": {
+      "title": "Rotation",
+      "description": "Shape Transform Rotation",
+      "oneOf": [
+        {
+          "$ref": "#/properties/value"
+        },
+        {
+          "$ref": "#/properties/valueKeyframed"
+        }
+      ],
+      "type": "object"
+    },
+    "o": {
+      "title": "Opacity",
+      "description": "Shape Transform Opacity",
+      "oneOf": [
+        {
+          "$ref": "#/properties/value"
+        },
+        {
+          "$ref": "#/properties/valueKeyframed"
+        }
+      ],
+      "type": "object"
+    },
+    "sk": {
+      "title": "Skew",
+      "description": "Shape Transform Skew",
+      "oneOf": [
+        {
+          "$ref": "#/properties/value"
+        },
+        {
+          "$ref": "#/properties/valueKeyframed"
+        }
+      ],
+      "type": "object"
+    },
+    "sa": {
+      "title": "Skew Axis",
+      "description": "Shape Transform Skew Axis",
+      "oneOf": [
+        {
+          "$ref": "#/properties/value"
+        },
+        {
+          "$ref": "#/properties/valueKeyframed"
+        }
+      ],
+      "type": "object"
+    },
+    "ty": {
+      "title": "Type",
+      "description": "Tranform type.",
+      "type": "string",
+      "const": "tr"
+    }
+  }
+}
diff --git a/schema/docs/json/shapes/trim.json b/schema/docs/json/shapes/trim.json
new file mode 100644
index 0000000..828d2e2
--- /dev/null
+++ b/schema/docs/json/shapes/trim.json
@@ -0,0 +1,62 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "mn": {
+      "title": "Match Name",
+      "description": "After Effect's Match Name. Used for expressions.",
+      "type": "string"
+    },
+    "nm": {
+      "title": "Name",
+      "description": "After Effect's Name. Used for expressions.",
+      "type": "string"
+    },
+    "ty": {
+      "title": "Type",
+      "description": "Shape content type.",
+      "type": "string",
+      "const": "tm"
+    },
+    "s": {
+      "title": "Start",
+      "description": "Trim Start.",
+      "oneOf": [
+        {
+          "$ref": "#/properties/value"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalKeyframed"
+        }
+      ],
+      "type": "object"
+    },
+    "e": {
+      "title": "End",
+      "description": "Trim End.",
+      "oneOf": [
+        {
+          "$ref": "#/properties/value"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalKeyframed"
+        }
+      ],
+      "type": "object"
+    },
+    "o": {
+      "title": "Offset",
+      "description": "Trim Offset.",
+      "oneOf": [
+        {
+          "$ref": "#/properties/value"
+        },
+        {
+          "$ref": "#/properties/multiDimensionalKeyframed"
+        }
+      ],
+      "type": "object"
+    }
+  },
+  "required": ["s", "e", "o", "ty"]
+}
diff --git a/schema/docs/json/sources/chars.json b/schema/docs/json/sources/chars.json
new file mode 100644
index 0000000..575620a
--- /dev/null
+++ b/schema/docs/json/sources/chars.json
@@ -0,0 +1,47 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "ch": {
+      "title": "Character",
+      "description": "Character Value",
+      "type": "string"
+    },
+    "fFamily": {
+      "title": "Font Family",
+      "description": "Character Font Family",
+      "type": "string"
+    },
+    "size": {
+      "title": "Font Size",
+      "description": "Character Font Size",
+      "type": "number"
+    },
+    "style": {
+      "title": "Font Style",
+      "description": "Character Font Style",
+      "type": "string"
+    },
+    "w": {
+      "title": "Width",
+      "description": "Character Width",
+      "type": "number"
+    },
+    "data": {
+      "title": "Character Data",
+      "description": "Character Data",
+      "properties": {
+        "shapes": {
+          "title": "Shapes",
+          "description": "List of Shapes",
+          "items": {
+            "$ref": "#/shapes/group"
+          },
+          "type": "array"
+        }
+      },
+      "type": "object"
+    }
+  },
+  "required": ["ch", "fFamily", "size", "style", "w", "data"]
+}
diff --git a/schema/docs/json/sources/image.json b/schema/docs/json/sources/image.json
new file mode 100644
index 0000000..f0e2b02
--- /dev/null
+++ b/schema/docs/json/sources/image.json
@@ -0,0 +1,32 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "h": {
+      "title": "Height",
+      "description": "Image Height",
+      "type": "number"
+    },
+    "w": {
+      "title": "Width",
+      "description": "Image Width",
+      "type": "number"
+    },
+    "id": {
+      "title": "ID",
+      "description": "Image ID",
+      "type": "string"
+    },
+    "p": {
+      "title": "Image name",
+      "description": "Image name",
+      "type": "string"
+    },
+    "u": {
+      "title": "Image path",
+      "description": "Image path",
+      "type": "string"
+    }
+  },
+  "required": ["p"]
+}
diff --git a/schema/docs/json/sources/precomp.json b/schema/docs/json/sources/precomp.json
new file mode 100644
index 0000000..44b838d
--- /dev/null
+++ b/schema/docs/json/sources/precomp.json
@@ -0,0 +1,40 @@
+{
+  "$schema": "http://json-schema.org/draft-04/schema#",
+  "type": "object",
+  "properties": {
+    "id": {
+      "title": "ID",
+      "description": "Precomp ID",
+      "type": "string"
+    },
+    "layers": {
+      "title": "Layers",
+      "description": "List of Precomp Layers",
+      "items": {
+        "oneOf": [
+          {
+            "$ref": "#/layers/shape"
+          },
+          {
+            "$ref": "#/layers/solid"
+          },
+          {
+            "$ref": "#/layers/preComp"
+          },
+          {
+            "$ref": "#/layers/image"
+          },
+          {
+            "$ref": "#/layers/null"
+          },
+          {
+            "$ref": "#/layers/text"
+          }
+        ],
+        "type": "object"
+      },
+      "type": "array"
+    }
+  },
+  "required": ["layers"]
+}
diff --git a/schema/index.js b/schema/index.js
new file mode 100644
index 0000000..173c401
--- /dev/null
+++ b/schema/index.js
@@ -0,0 +1,100 @@
+const Validator = require('jsonschema').Validator;
+const animationSchema = require('./docs/json/animation.json');
+const booleanSchema = require('./docs/json/helpers/boolean.json');
+const transformSchema = require('./docs/json/helpers/transform.json');
+const blendModeSchema = require('./docs/json/helpers/blendMode.json');
+const lineCapSchema = require('./docs/json/helpers/lineCap.json');
+const lineJoinSchema = require('./docs/json/helpers/lineJoin.json');
+const compositeSchema = require('./docs/json/helpers/composite.json');
+const textCapsSchema = require('./docs/json/helpers/textCaps.json');
+const textJustificationSchema = require('./docs/json/helpers/textJustification.json');
+const layerShapeSchema = require('./docs/json/layers/shape.json');
+const layerImageSchema = require('./docs/json/layers/image.json');
+const layerNullSchema = require('./docs/json/layers/null.json');
+const layerPreCompSchema = require('./docs/json/layers/preComp.json');
+const layerSolidSchema = require('./docs/json/layers/solid.json');
+const layerTextSchema = require('./docs/json/layers/text.json');
+const shapeEllipseSchema = require('./docs/json/shapes/ellipse.json');
+const shapeFillSchema = require('./docs/json/shapes/fill.json');
+const shapeGFillSchema = require('./docs/json/shapes/gFill.json');
+const shapeGroupSchema = require('./docs/json/shapes/group.json');
+const shapeGStrokeSchema = require('./docs/json/shapes/gStroke.json');
+const shapeMergeSchema = require('./docs/json/shapes/merge.json');
+const shapeRectSchema = require('./docs/json/shapes/rect.json');
+const shapeRepeaterSchema = require('./docs/json/shapes/repeater.json');
+const shapeRoundSchema = require('./docs/json/shapes/round.json');
+const shapeShapeSchema = require('./docs/json/shapes/shape.json');
+const shapeStarSchema = require('./docs/json/shapes/star.json');
+const shapeStrokeSchema = require('./docs/json/shapes/stroke.json');
+const shapeTransformSchema = require('./docs/json/shapes/transform.json');
+const shapeTrimSchema = require('./docs/json/shapes/trim.json');
+const doubleKeyframeSchema = require('./docs/json/properties/doubleKeyframe.json');
+const multiDimensionalSchema = require('./docs/json/properties/multiDimensional.json');
+const multiDimensionalKeyframedSchema = require('./docs/json/properties/multiDimensionalKeyframed.json');
+const multiDimensionalSpatialKeyframedSchema = require('./docs/json/properties/multiDimensionalSpatialKeyframed.json');
+const offsetKeyframeSchema = require('./docs/json/properties/offsetKeyframe.json');
+const offsetSpatialKeyframeSchema = require('./docs/json/properties/offsetSpatialKeyframe.json');
+const shapeSchema = require('./docs/json/properties/shape.json');
+const shapeKeyframedSchema = require('./docs/json/properties/shapeKeyframed.json');
+const shapePropSchema = require('./docs/json/properties/shapeProp.json');
+const shapePropKeyframeSchema = require('./docs/json/properties/shapePropKeyframe.json');
+const valueSchema = require('./docs/json/properties/value.json');
+const valueKeyframeSchema = require('./docs/json/properties/valueKeyframe.json');
+const valueKeyframedSchema = require('./docs/json/properties/valueKeyframed.json');
+const gradientSchema = require('./docs/json/properties/gradient.json');
+const imageSourceSchema = require('./docs/json/sources/image.json');
+const preCompSourceSchema = require('./docs/json/sources/precomp.json');
+const charSourceSchema = require('./docs/json/sources/chars.json');
+
+var v = new Validator();
+v.addSchema(booleanSchema, '/#/helpers/boolean');
+v.addSchema(lineCapSchema, '/#/helpers/lineCap');
+v.addSchema(lineJoinSchema, '/#/helpers/lineJoin');
+v.addSchema(compositeSchema, '/#/helpers/composite');
+v.addSchema(transformSchema, '/#/helpers/transform');
+v.addSchema(blendModeSchema, '/#/helpers/blendMode');
+v.addSchema(textCapsSchema, '/#/helpers/textCaps');
+v.addSchema(textJustificationSchema, '/#/helpers/textJustification');
+v.addSchema(layerShapeSchema, '/#/layers/shape');
+v.addSchema(layerImageSchema, '/#/layers/image');
+v.addSchema(layerNullSchema, '/#/layers/null');
+v.addSchema(layerPreCompSchema, '/#/layers/preComp');
+v.addSchema(layerSolidSchema, '/#/layers/solid');
+v.addSchema(layerTextSchema, '/#/layers/text');
+v.addSchema(shapeEllipseSchema, '/#/shapes/ellipse');
+v.addSchema(shapeFillSchema, '/#/shapes/fill');
+v.addSchema(shapeGFillSchema, '/#/shapes/gFill');
+v.addSchema(shapeGroupSchema, '/#/shapes/group');
+v.addSchema(shapeGStrokeSchema, '/#/shapes/gStroke');
+v.addSchema(shapeMergeSchema, '/#/shapes/merge');
+v.addSchema(shapeRectSchema, '/#/shapes/rect');
+v.addSchema(shapeRepeaterSchema, '/#/shapes/repeater');
+v.addSchema(shapeRoundSchema, '/#/shapes/round');
+v.addSchema(shapeShapeSchema, '/#/shapes/shape');
+v.addSchema(shapeStarSchema, '/#/shapes/star');
+v.addSchema(shapeStrokeSchema, '/#/shapes/stroke');
+v.addSchema(shapeTransformSchema, '/#/shapes/transform');
+v.addSchema(shapeTrimSchema, '/#/shapes/trim');
+v.addSchema(doubleKeyframeSchema, '/#/properties/a');
+v.addSchema(multiDimensionalSchema, '/#/properties/multiDimensional');
+v.addSchema(multiDimensionalKeyframedSchema, '/#/properties/multiDimensionalKeyframed');
+v.addSchema(multiDimensionalSpatialKeyframedSchema, '/#/properties/multiDimensionalSpatialKeyframed');
+v.addSchema(offsetKeyframeSchema, '/#/properties/offsetKeyframe');
+v.addSchema(offsetSpatialKeyframeSchema, '/#/properties/offsetSpatialKeyframe');
+v.addSchema(shapeSchema, '/#/properties/shape');
+v.addSchema(shapeKeyframedSchema, '/#/properties/shapeKeyframed');
+v.addSchema(shapePropSchema, '/#/properties/shapeProp');
+v.addSchema(shapePropKeyframeSchema, '/#/properties/shapePropKeyframe');
+v.addSchema(valueSchema, '/#/properties/value');
+v.addSchema(valueKeyframeSchema, '/#/properties/valueKeyframe');
+v.addSchema(valueKeyframedSchema, '/#/properties/valueKeyframed');
+v.addSchema(gradientSchema, '/#/properties/gradient');
+v.addSchema(imageSourceSchema, '/#/sources/image');
+v.addSchema(preCompSourceSchema, '/#/sources/precomp');
+v.addSchema(charSourceSchema, '/#/sources/chars');
+
+function validate(animation) {
+  return v.validate(animation, animationSchema, {nestedErrors: true});
+}
+
+module.exports = validate;
\ No newline at end of file
diff --git a/schema/package-lock.json b/schema/package-lock.json
new file mode 100644
index 0000000..1c98ab8
--- /dev/null
+++ b/schema/package-lock.json
@@ -0,0 +1,200 @@
+{
+  "name": "json-validator",
+  "version": "1.0.0",
+  "lockfileVersion": 1,
+  "requires": true,
+  "dependencies": {
+    "@actions/core": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.6.0.tgz",
+      "integrity": "sha512-NB1UAZomZlCV/LmJqkLhNTqtKfFXJZAUPcfl/zqG7EfsQdeUJtaWO98SGbuQ3pydJ3fHl2CvI/51OKYlCYYcaw==",
+      "requires": {
+        "@actions/http-client": "^1.0.11"
+      }
+    },
+    "@actions/github": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/@actions/github/-/github-5.0.0.tgz",
+      "integrity": "sha512-QvE9eAAfEsS+yOOk0cylLBIO/d6WyWIOvsxxzdrPFaud39G6BOkUwScXZn1iBzQzHyu9SBkkLSWlohDWdsasAQ==",
+      "requires": {
+        "@actions/http-client": "^1.0.11",
+        "@octokit/core": "^3.4.0",
+        "@octokit/plugin-paginate-rest": "^2.13.3",
+        "@octokit/plugin-rest-endpoint-methods": "^5.1.1"
+      }
+    },
+    "@actions/http-client": {
+      "version": "1.0.11",
+      "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-1.0.11.tgz",
+      "integrity": "sha512-VRYHGQV1rqnROJqdMvGUbY/Kn8vriQe/F9HR2AlYHzmKuM/p3kjNuXhmdBfcVgsvRWTz5C5XW5xvndZrVBuAYg==",
+      "requires": {
+        "tunnel": "0.0.6"
+      }
+    },
+    "@octokit/auth-token": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.5.0.tgz",
+      "integrity": "sha512-r5FVUJCOLl19AxiuZD2VRZ/ORjp/4IN98Of6YJoJOkY75CIBuYfmiNHGrDwXr+aLGG55igl9QrxX3hbiXlLb+g==",
+      "requires": {
+        "@octokit/types": "^6.0.3"
+      }
+    },
+    "@octokit/core": {
+      "version": "3.5.1",
+      "resolved": "https://registry.npmjs.org/@octokit/core/-/core-3.5.1.tgz",
+      "integrity": "sha512-omncwpLVxMP+GLpLPgeGJBF6IWJFjXDS5flY5VbppePYX9XehevbDykRH9PdCdvqt9TS5AOTiDide7h0qrkHjw==",
+      "requires": {
+        "@octokit/auth-token": "^2.4.4",
+        "@octokit/graphql": "^4.5.8",
+        "@octokit/request": "^5.6.0",
+        "@octokit/request-error": "^2.0.5",
+        "@octokit/types": "^6.0.3",
+        "before-after-hook": "^2.2.0",
+        "universal-user-agent": "^6.0.0"
+      }
+    },
+    "@octokit/endpoint": {
+      "version": "6.0.12",
+      "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.12.tgz",
+      "integrity": "sha512-lF3puPwkQWGfkMClXb4k/eUT/nZKQfxinRWJrdZaJO85Dqwo/G0yOC434Jr2ojwafWJMYqFGFa5ms4jJUgujdA==",
+      "requires": {
+        "@octokit/types": "^6.0.3",
+        "is-plain-object": "^5.0.0",
+        "universal-user-agent": "^6.0.0"
+      }
+    },
+    "@octokit/graphql": {
+      "version": "4.8.0",
+      "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.8.0.tgz",
+      "integrity": "sha512-0gv+qLSBLKF0z8TKaSKTsS39scVKF9dbMxJpj3U0vC7wjNWFuIpL/z76Qe2fiuCbDRcJSavkXsVtMS6/dtQQsg==",
+      "requires": {
+        "@octokit/request": "^5.6.0",
+        "@octokit/types": "^6.0.3",
+        "universal-user-agent": "^6.0.0"
+      }
+    },
+    "@octokit/openapi-types": {
+      "version": "11.2.0",
+      "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-11.2.0.tgz",
+      "integrity": "sha512-PBsVO+15KSlGmiI8QAzaqvsNlZlrDlyAJYcrXBCvVUxCp7VnXjkwPoFHgjEJXx3WF9BAwkA6nfCUA7i9sODzKA=="
+    },
+    "@octokit/plugin-paginate-rest": {
+      "version": "2.17.0",
+      "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.17.0.tgz",
+      "integrity": "sha512-tzMbrbnam2Mt4AhuyCHvpRkS0oZ5MvwwcQPYGtMv4tUa5kkzG58SVB0fcsLulOZQeRnOgdkZWkRUiyBlh0Bkyw==",
+      "requires": {
+        "@octokit/types": "^6.34.0"
+      }
+    },
+    "@octokit/plugin-rest-endpoint-methods": {
+      "version": "5.13.0",
+      "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.13.0.tgz",
+      "integrity": "sha512-uJjMTkN1KaOIgNtUPMtIXDOjx6dGYysdIFhgA52x4xSadQCz3b/zJexvITDVpANnfKPW/+E0xkOvLntqMYpviA==",
+      "requires": {
+        "@octokit/types": "^6.34.0",
+        "deprecation": "^2.3.1"
+      }
+    },
+    "@octokit/request": {
+      "version": "5.6.2",
+      "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.6.2.tgz",
+      "integrity": "sha512-je66CvSEVf0jCpRISxkUcCa0UkxmFs6eGDRSbfJtAVwbLH5ceqF+YEyC8lj8ystKyZTy8adWr0qmkY52EfOeLA==",
+      "requires": {
+        "@octokit/endpoint": "^6.0.1",
+        "@octokit/request-error": "^2.1.0",
+        "@octokit/types": "^6.16.1",
+        "is-plain-object": "^5.0.0",
+        "node-fetch": "^2.6.1",
+        "universal-user-agent": "^6.0.0"
+      }
+    },
+    "@octokit/request-error": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.1.0.tgz",
+      "integrity": "sha512-1VIvgXxs9WHSjicsRwq8PlR2LR2x6DwsJAaFgzdi0JfJoGSO8mYI/cHJQ+9FbN21aa+DrgNLnwObmyeSC8Rmpg==",
+      "requires": {
+        "@octokit/types": "^6.0.3",
+        "deprecation": "^2.0.0",
+        "once": "^1.4.0"
+      }
+    },
+    "@octokit/types": {
+      "version": "6.34.0",
+      "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.34.0.tgz",
+      "integrity": "sha512-s1zLBjWhdEI2zwaoSgyOFoKSl109CUcVBCc7biPJ3aAf6LGLU6szDvi31JPU7bxfla2lqfhjbbg/5DdFNxOwHw==",
+      "requires": {
+        "@octokit/openapi-types": "^11.2.0"
+      }
+    },
+    "before-after-hook": {
+      "version": "2.2.2",
+      "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.2.2.tgz",
+      "integrity": "sha512-3pZEU3NT5BFUo/AD5ERPWOgQOCZITni6iavr5AUw5AUwQjMlI0kzu5btnyD39AF0gUEsDPwJT+oY1ORBJijPjQ=="
+    },
+    "deprecation": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz",
+      "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ=="
+    },
+    "is-plain-object": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+      "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="
+    },
+    "jsonschema": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.4.0.tgz",
+      "integrity": "sha512-/YgW6pRMr6M7C+4o8kS+B/2myEpHCrxO4PEWnqJNBFMjn7EWXqlQ4tGwL6xTHeRplwuZmcAncdvfOad1nT2yMw=="
+    },
+    "node-fetch": {
+      "version": "2.6.5",
+      "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz",
+      "integrity": "sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ==",
+      "requires": {
+        "whatwg-url": "^5.0.0"
+      }
+    },
+    "once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+      "requires": {
+        "wrappy": "1"
+      }
+    },
+    "tr46": {
+      "version": "0.0.3",
+      "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+      "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o="
+    },
+    "tunnel": {
+      "version": "0.0.6",
+      "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz",
+      "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg=="
+    },
+    "universal-user-agent": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-6.0.0.tgz",
+      "integrity": "sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w=="
+    },
+    "webidl-conversions": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+      "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE="
+    },
+    "whatwg-url": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+      "integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
+      "requires": {
+        "tr46": "~0.0.3",
+        "webidl-conversions": "^3.0.0"
+      }
+    },
+    "wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+    }
+  }
+}
diff --git a/schema/package.json b/schema/package.json
new file mode 100644
index 0000000..eae387e
--- /dev/null
+++ b/schema/package.json
@@ -0,0 +1,18 @@
+{
+  "name": "json-validator",
+  "version": "1.0.0",
+  "description": "",
+  "main": "index.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1",
+    "validate": "node validate.js"
+  },
+  "author": "",
+  "license": "ISC",
+  "devDependencies": {},
+  "dependencies": {
+    "@actions/core": "^1.6.0",
+    "@actions/github": "^5.0.0",
+    "jsonschema": "^1.4.0"
+  }
+}
diff --git a/schema/validate.js b/schema/validate.js
new file mode 100644
index 0000000..aeb383b
--- /dev/null
+++ b/schema/validate.js
@@ -0,0 +1,58 @@
+/**
+ * This retrieves all files located on the examples folder, then iterates
+ * over each file and validates it conforms to the json schema defined on
+ * the index.js file.
+ * If one or more of the files is not well formed, it calls the failed
+ * method, listing all files that didn't pass the validation and
+ * their errors.
+ */
+
+const fs = require('fs');
+const core = require('@actions/core');
+const github = require('@actions/github');
+const validate = require('./index.js');
+
+const examplesDirectory = '../examples/'
+let totalFiles = 0;
+let failedFiles = [];
+
+function validateFile(error, data, fileName) {
+  try {
+    if (error) {
+      throw error;
+    } else {
+      const schemaValidation = validate(JSON.parse(data));
+      if (schemaValidation?.errors.length) {
+        failedFiles.push({
+          fileName,
+          error: schemaValidation.errors,
+        })
+      } else {
+      }
+    }
+  } catch (error) {
+    failedFiles.push({
+      fileName,
+      error,
+    })
+  }
+  fileProcessed()
+}
+
+function fileProcessed() {
+  totalFiles -= 1;
+  if (totalFiles === 0) {
+    if (failedFiles.length) {
+      core.setFailed(failedFiles);
+    } else {
+      console.log('NO ERRORS');
+    }
+  }
+}
+
+fs.readdir(examplesDirectory, (err, files) => {
+  totalFiles = files.length;
+  files.forEach(fileName => {
+      fs.readFile(examplesDirectory + fileName,  'utf8',  (error, data) => validateFile(error, data, fileName));
+  });
+});
\ No newline at end of file