diff --git a/src/asciidoc/customizations/buildCustomVcc.adoc b/src/asciidoc/customizations/buildCustomVcc.adoc
new file mode 100644
index 000000000000..158b61c19092
--- /dev/null
+++ b/src/asciidoc/customizations/buildCustomVcc.adoc
@@ -0,0 +1,353 @@
+= Building your first custom VCC
+:page-slug: /customizations/build-custom-VCC
+
+Visual Customization Controls (VCCs) enable users to quickly edit elements of your application on Koji.
+The Koji platform includes VCCs for standard elements, such as images, text, and sounds.
+In addition, you can build custom VCCs to provide new types of customizations that match closely with the application you are developing.
+For example, some Koji templates provide tile map editors, sound enhancers, or custom avatar creators to enhance the interactivity for remixers.
+
+In this tutorial, you will build and publish a custom VCC that recreates the standard text VCC on Koji.
+After completing the tutorial, you will be able to use your custom VCC interchangeably with a text VCC.
+
+== Prerequisites
+
+* Familiarity with the Koji editor and remix process.
+For an overview, see the <>.
+* Familiarity with React and ES6 basics are a plus.
+
+== Setting up the consumer application
+
+To test and use your custom VCC, you need a Koji application to act as the "consumer" of it.
+
+. Remix the following scaffold:
++
+https://withkoji.com/~seane/simple-react-scaffold
+. After the editor has loaded, rename the project.
+For example: `Custom VCC Consumer`.
+. In *Customization*, open the `Strings` file.
++
+This file contains one option for `Page Title`, which uses a text VCC.
+You will replace this text VCC with custom VCC that you create in this tutorial.
+
+== Setting up the custom VCC application
+
+Custom VCCs are also applications on Koji.
+You can create them in the same way that you create any application or game -- by remixing a scaffold.
+
+. Remix the following scaffold:
++
+https://withkoji.com/~seane/react-project-no-vccs
+. After the editor has loaded, rename the project.
+For example: `My Custom Text VCC`.
+
+== Adding the custom-vcc-sdk package
+
+The koji-custom-vcc-sdk package enables you to extend Koji applications with custom VCCs.
+
+. At the bottom of the editor, click *New Tab* to open a new terminal tab.
+. Navigate to the frontend folder: `cd frontend`.
+. Install the package.
++
+[source,bash]
+npm install --save @withkoji/custom-vcc-sdk
+. Close the terminal tab.
++
+[source,bash]
+exit
+. In the `frontend` termimal tab, cancel the running process, and then restart it to reflect the change.
++
+[source,bash]
+npm start
+. Click the down arrow in the upper right to collapse the terminal pane.
+
+== Adding a text input and state management
+
+The VCC must provide an input to accept a value from the user and a way to manage the state of the input value.
+
+. Open `/frontend/common/App.js` from the file browser.
+. In the App class, add a state property to store the value.
++
+[source, JavaScript]
+----
+class App extends React.Component {
+ state = { value: '' };
+ ...}
+----
+. Replace the contents of the `Container` component.
++
+[source, JavaScript]
+----
+
+ {
+ this.setState({ value: e.currentTarget.value });
+ }}
+ value={this.state.value}
+ />
+
+----
+. Save the file and refresh the live preview.
++
+You should see a text input in the preview window.
+
+== Import the VCC package and initialize the custom VCC
+
+Next, use the koji-custom-vcc-sdk package you installed earlier to initialize the custom VCC and register it, so that the consumer knows it's ready to use.
+
+. At the top of the `App.js` file, import the package.
++
+[source,JavaScript]
+import CustomVcc from '@withkoji/custom-vcc-sdk';
+. In the App class, initialize the custom VCC.
++
+[source,JavaScript]
+customVcc = new CustomVcc();
+. Add a `componentDidMount` method and register the VCC.
++
+[source,JavaScript]
+----
+componentDidMount() {
+ this.customVcc.register('300','300');
+}
+----
+
+== Testing the custom VCC
+
+To save development time, Koji provides an easy way to test a custom VCC before it is published.
+
+. In your custom VCC project, click the *Remote* tab in the right pane.
+. Click *Copy URL* to get the staging URL for your project.
+. Open your consumer project.
+. In your consumer project, open the `Strings` customization file, and click *Code* to view the raw JSON.
+. For the `title` field, change the `type` to match this format, using the URL you just copied as `YOURURL`:
++
+[source,JavaScript]
+"type": "custom"
+. Save the file, and return to the *Visual* view of the customization file.
++
+You should see your custom VCC.
+
+== Connecting the custom VCC to the consumer
+
+If you type in your custom VCC in the consumer application, you will see that nothing happens yet.
+To support the dynamic customization updates of a Koji template, the custom VCC must be able to read and update the values in the JSON file of the consumer application.
+
+You can use methods exposed by the custom-sdk-vcc package to get the initial value from the JSON file and then to write a new value to the file when the user changes it in the VCC.
+
+=== Getting the value from the consumer
+
+In your custom VCC, use the `onUpdate` method to get the latest value from the JSON file in the consumer application.
+
+. In the `App.js` file of your custom VCC application, add the following code to the `componentDidMount` method, after the `register` call:
++
+[source,JavaScript]
+----
+this.customVcc.onUpdate(({ value }) => {
+ this.setState({ value });
+});
+----
++
+The `componentDidMount` method should now look like this example:
++
+[source,JavaScript]
+----
+componentDidMount() {
+ this.customVcc.register('300', '300');
+
+ this.customVcc.onUpdate(({ value }) => {
+ this.setState({ value });
+ });
+}
+----
++
+This code automatically updates the state of the VCC component when the value in the consumer application changes.
+. Save the file, and return to your consumer application.
+Switch to the *Code* view, and then back to the *Visual* view to trigger a reload of your custom VCC.
++
+You should now see the correct value in the input.
+
+=== Setting a new value using the custom VCC
+
+In your custom VCC, use the `change` and `save` methods to send changes from the custom VCC to the consumer application.
+
+. In the `App.js` file of your custom VCC application, update the `onChange` function for the input:
++
+[source,JavaScript]
+----
+ {
+ this.customVcc.change(e.currentTarget.value);
+ this.customVcc.save();
+ }}
+ value={this.state.value}
+/>
+----
++
+This code updates the value and triggers a save of the JSON file.
+. Save the file, and return to your consumer application.
+Switch to the *Code* view, and then back to the *Visual* view to trigger a reload of your custom VCC.
++
+You should now be able to update the title of the application using your own custom VCC.
+
+== Publishing your custom VCC
+
+The staging URL makes it easy to test a custom VCC while it is under development.
+However, it is temporary and changes each time you open a new instance of the project.
+Instead, you can publish your custom VCC so that you can use it in other projects and share it with other developers.
+
+. In the left pane, navigate to *Advanced > Custom domains*.
+. In the upper right, click *Add domain*.
+. Under *Choose a Koji root domain*, select `koji-vccs.com`.
+. In *Domain*, enter a unique name for your VCC.
+For example, `myname-custom-text-vcc`.
++
+You will use this name to implement your custom VCC in consumer applications.
+. Click *Add*.
+. In the left pane, click *Publish Now*.
+Give your VCC a descriptive name, and add a thumbnail if you would like.
++
+The name and thumbnail make it easier for other developers to find your custom VCC and understand what it does.
+For a VCC, a custom thumbnail might be a better representation of the functionality than the automatically generated screenshot.
+. Click *Publish App*.
+
+== Using a published custom VCC
+
+After your custom VCC has been published, you can use it by replacing the `type` in your VCC with the domain name you entered in the last step.
+
+[source,JavaScript]
+"type": "custom"
+
+For example:
+[source,JavaScript]
+"type": "custom"
+
+== Refining your custom VCC
+
+You can refine the custom VCC by styling it to look more like a standard text VCC.
+In this example, we'll define new styling and use additional information from the consumer application to provide context to our custom VCC input.
+
+. To be able to test your work in progress, open your consumer application and switch back to the staging URL of your custom VCC application.
+. In the `App.js` file of your custom VCC application, remove the unused styled component (`Image`).
+. Replace the `Container` styled component and add the following new styled components near the top of the file.
++
+[source,Javascript]
+----
+const InputContainer = styled.div`
+ display: flex;
+ flex-direction: column;
+ width: 100%;
+
+ input {
+ width: 100%;
+ background-color: rgb(255, 255, 255);
+ color: rgb(17, 17, 17);
+ border-width: 1px;
+ border-style: solid;
+ border-color: rgba(0, 0, 0, 0.1);
+ border-image: initial;
+ border-radius: 0px;
+ padding: 8px;
+ outline: none;
+ }
+
+ input:focus {
+ outline: none;
+ border-width: 1px;
+ border-style: solid;
+ border-color: rgb(21, 122, 251);
+ border-image: initial;
+ }
+
+ .description {
+ width: 100%;
+ opacity: 0.4;
+ font-size: 12px;
+ line-height: 1;
+ padding-top: 4px;
+ }
+`;
+
+const Container = styled.div`
+ background-color: #ffffff;
+ color: #000000;
+ padding: 16px;
+ display: flex;
+ align-items: start;
+ width: calc(100% - 40px);
+`;
+
+const Label = styled.label`
+ display: inline-flex;
+ flex-direction: column;
+ align-items: flex-end;
+ padding-right: 16px;
+
+ .name {
+ font-size: 14px;
+ }
+
+ .variable-name {
+ font-size: 10px;
+ line-height: 1.5;
+ color: rgb(102, 102, 102);
+ opacity: 0.9;
+ font-family: Menlo, Monaco, "Courier New", monospace;
+ }
+`;
+----
+. Update the state assignment to add the following properties.
++
+[source,JavaScript]
+----
+state = {
+ description: '',
+ name: '',
+ value: '',
+ variableName: '',
+};
+----
+. Update the `onUpdate` command to set the values of the additional
+properties with information from the consumer application.
++
+[source,JavaScript]
+----
+this.customVcc.onUpdate(({ value, name, variableName, description }) => {
+ this.setState({
+ description,
+ name,
+ value,
+ variableName,
+ });
+});
+----
+. Replace the contents of the `Container` component with the updated input.
++
+[source,JavaScript]
+----
+
+
+ {
+ this.customVcc.change(e.currentTarget.value);
+ this.customVcc.save();
+ }}
+ value={this.state.value}
+ />
+
{this.state.description}
+
+----
+. Save the `App.js` file, return to your consumer application, and reload the VCC.
++
+You should see an updated VCC that looks just like the standard text VCC.
+. Publish your changes to update the presentation of your custom VCC.
+
+== Wrapping up
+
+You've now created a replacement for an existing text VCC and learned the basics of how a custom VCC "talks" to the consumer application.
+
+If you want to create more complex custom VCCs, you can find more information in the https://github.com/madewithkoji/koji-custom-vcc-sdk[package documentation].
+
+You can also find existing custom VCCs by searching for "vcc" on https://withkoji.com.
diff --git a/src/asciidoc/gettingStarted/developer.adoc b/src/asciidoc/gettingStarted/developer.adoc
index f31325025d93..7e80e1f29cb6 100644
--- a/src/asciidoc/gettingStarted/developer.adoc
+++ b/src/asciidoc/gettingStarted/developer.adoc
@@ -21,7 +21,7 @@ image:Koji-developer.svg[Overview of the Koji development process,title="Koji de
For some great resources to help you start developing templates on Koji, see:
* link:../gettingStarted/startGuide1.adoc[Starter guide] – Step-by-step instructions on how to create a remixable web application and publish it as a template on Koji.
-* https://withkoji.com/developer/getting-started-course[Starter course] – Video tutorial of how to start developing applications on Koji.
+* link:../videos/starterCourse.adoc[Starter course] – Video tutorial of how to start developing applications on Koji.
== Staying in Touch
diff --git a/src/asciidoc/videos/imageBestPractices.adoc b/src/asciidoc/videos/imageBestPractices.adoc
new file mode 100644
index 000000000000..32fd3803a588
--- /dev/null
+++ b/src/asciidoc/videos/imageBestPractices.adoc
@@ -0,0 +1,8 @@
+= Image resizing and scaling
+:page-slug: /videos/image-best-practices
+
+Watch the following video to learn how to optimize image sizes in your template.
+
+== Video tutorial
+
+video::4KDoYrSK0VE[youtube,560,361]
diff --git a/src/asciidoc/videos/kaiOS.adoc b/src/asciidoc/videos/kaiOS.adoc
new file mode 100644
index 000000000000..ded771d61c81
--- /dev/null
+++ b/src/asciidoc/videos/kaiOS.adoc
@@ -0,0 +1,8 @@
+= Develop KaiOS apps with Koji
+:page-slug: /videos/kai-OS
+
+Watch the following video to learn how to develop KaiOS apps with Koji.
+
+== Video tutorial
+
+video::BppAed1R1XM[youtube,560,361]
diff --git a/src/asciidoc/videos/starterCourse.adoc b/src/asciidoc/videos/starterCourse.adoc
new file mode 100644
index 000000000000..60a0ed6bef88
--- /dev/null
+++ b/src/asciidoc/videos/starterCourse.adoc
@@ -0,0 +1,14 @@
+= Developer starter course
+:page-slug: /videos/starter-course
+
+If you are ready to start creating your own remixable templates, we recommend the video below.
+In under an hour, you will learn:
+
+* How to find and remix a scaffold as a starting point for your template.
+* How to import code from a GitHub repository.
+* How to use Koji's packages and tools to make your template remixable.
+* How to publish your template.
+
+== Video tutorial
+
+video::XRWM4w8rwT0[youtube,560,361]