<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.appstudio.dev/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sarah</id>
	<title>NSB App Studio - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.appstudio.dev/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Sarah"/>
	<link rel="alternate" type="text/html" href="https://wiki.appstudio.dev/Special:Contributions/Sarah"/>
	<updated>2026-08-28T18:58:15Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://wiki.appstudio.dev/index.php?title=Volt_Documentation&amp;diff=9247</id>
		<title>Volt Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.appstudio.dev/index.php?title=Volt_Documentation&amp;diff=9247"/>
		<updated>2017-05-27T03:45:34Z</updated>

		<summary type="html">&lt;p&gt;Sarah: Added API and JS Docs links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Volt is a platform to electrify your web apps. It provides simple hosting and extended services for your web and mobile apps. As a web host, it provides an easy to use interface to deploy apps, custom names using full HTTPS on a fast, stable platform.&lt;br /&gt;
&lt;br /&gt;
Extended services like user management and server storage are available.&lt;br /&gt;
&lt;br /&gt;
== Getting Started ==&lt;br /&gt;
* [[faq|Frequently Asked Questions]]&lt;br /&gt;
* [[first_app|Your First Volt App]]&lt;br /&gt;
* [[error_handling|Handling Errors]]&lt;br /&gt;
&lt;br /&gt;
== Authentication ==&lt;br /&gt;
* [[user_confirmation|User Confirmation]]&lt;br /&gt;
* [[resetting_passwords|Resetting Passwords]]&lt;br /&gt;
* [[user_registration|Register a User]]&lt;br /&gt;
* [[log_in|Logging In (and Out)]]&lt;br /&gt;
&lt;br /&gt;
== Users ==&lt;br /&gt;
* [[current_user|Working with the Current User]]&lt;br /&gt;
* [[manage_users|Managing Your Users]]&lt;br /&gt;
&lt;br /&gt;
== Apps ==&lt;br /&gt;
* [[manage_apps|Managing Your Apps]]&lt;br /&gt;
* [[Custom Domains]]&lt;br /&gt;
&lt;br /&gt;
== Services ==&lt;br /&gt;
* [[server_storage|Server Storage]]&lt;br /&gt;
* [[app_storage|App Storage]]&lt;br /&gt;
* [[send_email|Sending Email]]&lt;br /&gt;
&lt;br /&gt;
== AppStudio ==&lt;br /&gt;
* [[volt_for_appstudio|Volt for AppStudio Users]]&lt;br /&gt;
&lt;br /&gt;
== API Documentation ==&lt;br /&gt;
* [https://docs.voltcloud.io/api/ Volt API]&lt;br /&gt;
&lt;br /&gt;
== JS Documentation ==&lt;br /&gt;
* [https://docs.voltcloud.io/client/ JS Docs]&lt;/div&gt;</summary>
		<author><name>Sarah</name></author>
	</entry>
	<entry>
		<id>https://wiki.appstudio.dev/index.php?title=Server_storage&amp;diff=9246</id>
		<title>Server storage</title>
		<link rel="alternate" type="text/html" href="https://wiki.appstudio.dev/index.php?title=Server_storage&amp;diff=9246"/>
		<updated>2017-05-27T01:02:54Z</updated>

		<summary type="html">&lt;p&gt;Sarah: Instructions for creating server storage&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Server Storage allows you to save data in (key, value) pairs on the server so it is available next time you run the program. An entry can be created by assigning to appStorage.setItem(&#039;&#039;key&#039;&#039;, &#039;&#039;value&#039;&#039;, &#039;&#039;callback&#039;&#039;), where &#039;&#039;key&#039;&#039; is specified by you. Data is retrieved a similar way. The information in serverStorage is only available to the app itself.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;value&#039;&#039; can be a string, number, array or object. There is no size limit on value, other than it be reasonable.&lt;br /&gt;
&lt;br /&gt;
If your app does not have a live internet connection, the request will time out and an error message will be passed to callback.&lt;br /&gt;
&lt;br /&gt;
Since the calls access information on a server, they are asynchronous (so your app does not look up while the call is being processed). When the call is complete, the function named in &#039;&#039;callback&#039;&#039; is called in your app. It passes two parameters: (&#039;&#039;error&#039;&#039;, &#039;&#039;data&#039;&#039;). If the call is successful, &#039;&#039;error&#039;&#039; is empty and your results are in &#039;&#039;data&#039;&#039;. If the call is unsuccessful, &#039;&#039;error&#039;&#039; is not empty and the error message is in &#039;&#039;data&#039;&#039;.message.&lt;br /&gt;
&lt;br /&gt;
serverStorage is an alias for $volt.user.storage in the Volt API.&lt;br /&gt;
&lt;br /&gt;
== serverStorage.clear ==&lt;br /&gt;
&lt;br /&gt;
This call clears all the items in your app&#039;s serverStorage.&lt;br /&gt;
&lt;br /&gt;
The syntax of the function is:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;serverStorage.clear&#039;&#039;&#039;(&#039;&#039;callback&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;callback&#039;&#039; - function(&#039;&#039;error&#039;&#039;, &#039;&#039;data&#039;&#039;), required. The function in your app to call when the function is complete (or fails).&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
  butClear.onclick = function() {&lt;br /&gt;
    serverStorage.clear(done);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  function done(error, data) {&lt;br /&gt;
    if (error) {&lt;br /&gt;
      if (data == undefined) {&lt;br /&gt;
        data = {&lt;br /&gt;
          message: &amp;quot;Network Error&amp;quot;&lt;br /&gt;
        };&lt;br /&gt;
      }&lt;br /&gt;
      NSB.MsgBox(data.message);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&amp;quot;success&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
  Function butClear_onclick()&lt;br /&gt;
    serverStorage.clear(done)&lt;br /&gt;
  End Function&lt;br /&gt;
&lt;br /&gt;
  Function done(error, data)&lt;br /&gt;
    If error Then&lt;br /&gt;
      If data = undefined Then data = {message: &amp;quot;Network Error&amp;quot;}&lt;br /&gt;
      MsgBox data.message&lt;br /&gt;
    Else&lt;br /&gt;
      console.log(&amp;quot;success&amp;quot;)&lt;br /&gt;
    End If&lt;br /&gt;
  End Function&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== serverStorage.getItem ==&lt;br /&gt;
&lt;br /&gt;
This call returns the value of the item with the specified &#039;&#039;key&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The syntax of the function is:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;serverStorage.getItem&#039;&#039;&#039;(&#039;&#039;key&#039;&#039;, &#039;&#039;callback&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;key&#039;&#039; - The name of the item. String.&lt;br /&gt;
* &#039;&#039;callback&#039;&#039; - function(&#039;&#039;error&#039;&#039;, &#039;&#039;data&#039;&#039;), required. The function in your app to call when the function is complete (or fails).&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
  butGetItem.onclick = function() {&lt;br /&gt;
    serverStorage.getItem(&amp;quot;SimpleString&amp;quot;, getItemCallback);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  function getItemCallback(error, data) {&lt;br /&gt;
    if (error) {&lt;br /&gt;
      if (data == undefined) {&lt;br /&gt;
        data = {&lt;br /&gt;
          message: &amp;quot;Network Error&amp;quot;&lt;br /&gt;
        };&lt;br /&gt;
      }&lt;br /&gt;
      alert(data.message);&lt;br /&gt;
    } else {&lt;br /&gt;
      alert(data);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
  Function butGetItem_onclick()&lt;br /&gt;
    serverStorage.getItem(&amp;quot;SimpleString&amp;quot;, getItemCallback)&lt;br /&gt;
  End Function&lt;br /&gt;
&lt;br /&gt;
  Function getItemCallback(error, data) &lt;br /&gt;
    If error Then&lt;br /&gt;
      If data = undefined Then data = {message: &amp;quot;Network Error&amp;quot;}&lt;br /&gt;
      MsgBox data.message&lt;br /&gt;
    Else&lt;br /&gt;
      MsgBox data&lt;br /&gt;
    End If&lt;br /&gt;
  End Function&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== serverStorage.getAllItems ==&lt;br /&gt;
&lt;br /&gt;
This call returns all the items in your app&#039;s serverStorage in an array of {key, value} objects.&lt;br /&gt;
&lt;br /&gt;
The syntax of the function is:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;serverStorage.getAllItems&#039;&#039;&#039;(&#039;&#039;callback&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;callback&#039;&#039; - function(&#039;&#039;error&#039;&#039;, &#039;&#039;data&#039;&#039;), required. The function in your app to call when the function is complete (or fails).&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
  butGetAllItems.onclick = function() {&lt;br /&gt;
    serverStorage.getAllItems(getAllItemsCallback);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  function getAllItemsCallback(error, data) {&lt;br /&gt;
    if (error) {&lt;br /&gt;
      if (data == undefined) {&lt;br /&gt;
        data = {&lt;br /&gt;
          message: &amp;quot;Network Error&amp;quot;&lt;br /&gt;
        };&lt;br /&gt;
      }&lt;br /&gt;
      NSB.MsgBox(data.message);&lt;br /&gt;
    } else {&lt;br /&gt;
      NSB.Print((false) + &amp;quot;&amp;lt;br&amp;gt;&amp;quot;);&lt;br /&gt;
      for (key in data) {&lt;br /&gt;
        console.log(key, data[key]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
  Function butGetAllItems_onclick()&lt;br /&gt;
    serverStorage.getAllItems(getAllItemsCallback)&lt;br /&gt;
  End Function&lt;br /&gt;
&lt;br /&gt;
  Function getAllItemsCallback(error, data) &lt;br /&gt;
    If error Then&lt;br /&gt;
      If data = undefined Then data = {message: &amp;quot;Network Error&amp;quot;}&lt;br /&gt;
      MsgBox data.message&lt;br /&gt;
    Else&lt;br /&gt;
      Print False&lt;br /&gt;
      For Each key in data&lt;br /&gt;
        console.log(key, data[key])&lt;br /&gt;
        k = [key, key][0]&lt;br /&gt;
        Print k &amp;amp; &amp;quot;: &amp;quot; &amp;amp; data[key].toString()&lt;br /&gt;
      Next&lt;br /&gt;
    End If&lt;br /&gt;
  End Function&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== serverStorage.removeItem ==&lt;br /&gt;
&lt;br /&gt;
This call removes the item with a specified key.&lt;br /&gt;
&lt;br /&gt;
The syntax of the function is:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;serverStorage.removeItem&#039;&#039;&#039;(&#039;&#039;key&#039;&#039;, &#039;&#039;callback&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;key&#039;&#039; - The name of the item. String.&lt;br /&gt;
* &#039;&#039;callback&#039;&#039; - function(&#039;&#039;error&#039;&#039;, &#039;&#039;data&#039;&#039;), required. The function in your app to call when the function is complete (or fails).&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
  butRemoveItem.onclick = function() {&lt;br /&gt;
    serverStorage.removeItem(&amp;quot;SimpleString&amp;quot;, done);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  function done(error, data) {&lt;br /&gt;
    if (error) {&lt;br /&gt;
      if (data == undefined) {&lt;br /&gt;
        data = {&lt;br /&gt;
          message: &amp;quot;Network Error&amp;quot;&lt;br /&gt;
        };&lt;br /&gt;
      }&lt;br /&gt;
      NSB.MsgBox(data.message);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&amp;quot;success&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
  Function butRemoveItem_onclick()&lt;br /&gt;
    serverStorage.removeItem(&amp;quot;SimpleString&amp;quot;, done)&lt;br /&gt;
  End Function&lt;br /&gt;
&lt;br /&gt;
  Function done(error, data)&lt;br /&gt;
    If error Then&lt;br /&gt;
      If data = undefined Then data = {message: &amp;quot;Network Error&amp;quot;}&lt;br /&gt;
      MsgBox data.message&lt;br /&gt;
    Else&lt;br /&gt;
      console.log(&amp;quot;success&amp;quot;)&lt;br /&gt;
    End If&lt;br /&gt;
  End Function&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== serverStorage.setItem ==&lt;br /&gt;
&lt;br /&gt;
This call adds a key, value pair to serverStorage.&lt;br /&gt;
&lt;br /&gt;
The syntax of the function is:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;serverStorage.setItem&#039;&#039;&#039;(&#039;&#039;key&#039;&#039;, &#039;&#039;value&#039;&#039;, &#039;&#039;callback&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;key&#039;&#039; - The name of the item. String.&lt;br /&gt;
* &#039;&#039;value&#039;&#039; - The name of the item. Can be string, number, array, object: any JavaScript data type.&lt;br /&gt;
* &#039;&#039;callback&#039;&#039; - function(&#039;&#039;error&#039;&#039;, &#039;&#039;data&#039;&#039;), required. The function in your app to call when the function is complete (or fails).&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
  butSetItem.onclick = function() {&lt;br /&gt;
    serverStorage.setItem(&amp;quot;SimpleString&amp;quot;, &amp;quot;ABCD&amp;quot;, done);&lt;br /&gt;
    serverStorage.setItem(&amp;quot;Number&amp;quot;, 123, done);&lt;br /&gt;
    serverStorage.setItem(&amp;quot;Array&amp;quot;, [1, 2, 3, 4], done);&lt;br /&gt;
    serverStorage.setItem(&amp;quot;Object&amp;quot;, {&lt;br /&gt;
      firstName: &amp;quot;Eric&amp;quot;,&lt;br /&gt;
      lastName: &amp;quot;Cartman&amp;quot;&lt;br /&gt;
    }, done);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  function done(error, data) {&lt;br /&gt;
    if (error) {&lt;br /&gt;
      if (data == undefined) {&lt;br /&gt;
        data = {&lt;br /&gt;
          message: &amp;quot;Network Error&amp;quot;&lt;br /&gt;
        };&lt;br /&gt;
      }&lt;br /&gt;
      NSB.MsgBox(data.message);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&amp;quot;success&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
  Function butSetItem_onclick()&lt;br /&gt;
    serverStorage.setItem(&amp;quot;SimpleString&amp;quot;, &amp;quot;ABCD&amp;quot;, done)&lt;br /&gt;
    serverStorage.setItem(&amp;quot;Number&amp;quot;, 123, done)&lt;br /&gt;
    serverStorage.setItem(&amp;quot;Array&amp;quot;, [1, 2, 3, 4], done)&lt;br /&gt;
    serverStorage.setItem(&amp;quot;Object&amp;quot;, {firstName: &amp;quot;Eric&amp;quot;, lastName: &amp;quot;Cartman&amp;quot;}, done)&lt;br /&gt;
  End Function&lt;br /&gt;
&lt;br /&gt;
  Function done(error, data)&lt;br /&gt;
    If error Then&lt;br /&gt;
      If data = undefined Then data = {message: &amp;quot;Network Error&amp;quot;}&lt;br /&gt;
      MsgBox data.message&lt;br /&gt;
    Else&lt;br /&gt;
      console.log(&amp;quot;success&amp;quot;)&lt;br /&gt;
    End If&lt;br /&gt;
  End Function&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
&lt;br /&gt;
* JavaScript API: [https://docs.voltcloud.io/client/$volt.user.storage.html https://docs.voltcloud.io/client/$volt.user.storage.html]&lt;br /&gt;
* REST API: [https://docs.voltcloud.io/api/#storage-plug-in https://docs.voltcloud.io/api/#storage-plug-in]&lt;/div&gt;</summary>
		<author><name>Sarah</name></author>
	</entry>
	<entry>
		<id>https://wiki.appstudio.dev/index.php?title=App_storage&amp;diff=9245</id>
		<title>App storage</title>
		<link rel="alternate" type="text/html" href="https://wiki.appstudio.dev/index.php?title=App_storage&amp;diff=9245"/>
		<updated>2017-05-27T00:45:11Z</updated>

		<summary type="html">&lt;p&gt;Sarah: Instructions for creating app storage&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;App Storage allows you to store data as (key, value) pairs on the server so it is available to all users of an app. An entry can be created by assigning to appStorage.setItem(&#039;&#039;key&#039;&#039;, &#039;&#039;value&#039;&#039;, &#039;&#039;callback&#039;&#039;), where &#039;&#039;key&#039;&#039; is specified by you. Data is retrieved a similar way. Apps can only read appStorage. Use the Dashboard to clear, remove or change the entries.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;value&#039;&#039; can be a string, number, array or object. There is no size limit on &#039;&#039;value&#039;&#039;, other than it be reasonable.&lt;br /&gt;
&lt;br /&gt;
If your app does not have a live internet connection, the request will time out and an error message will be passed to callback.&lt;br /&gt;
&lt;br /&gt;
Since the calls access information on a server, they are asynchronous (so your app does not look up while the call is being processed). When the call is complete, the function named in &#039;&#039;callback&#039;&#039; is called in your app. It passes two parameters: (&#039;&#039;error&#039;&#039;, &#039;&#039;data&#039;&#039;). If the call is successful, &#039;&#039;error&#039;&#039; is empty and your results are in &#039;&#039;data&#039;&#039;. If the call is unsuccessful, &#039;&#039;error&#039;&#039; is not empty and the error message is in &#039;&#039;data&#039;&#039;.message.&lt;br /&gt;
&lt;br /&gt;
appStorage is an alias for $volt.storage in the Volt API.&lt;br /&gt;
&lt;br /&gt;
== appStorage.clear ==&lt;br /&gt;
&lt;br /&gt;
This call clears all the items in your app&#039;s appStorage. It is available in the Dashboard only.&lt;br /&gt;
&lt;br /&gt;
The syntax of the function is:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;appStorage.clear&#039;&#039;&#039;(&#039;&#039;callback&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;callback&#039;&#039; - function(&#039;&#039;error&#039;&#039;, &#039;&#039;data&#039;&#039;), required. The function in your app to call when the function is complete (or fails).&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
  butClear.onclick = function() {&lt;br /&gt;
    appStorage.clear(done);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  function done(error, data) {&lt;br /&gt;
    if (error) {&lt;br /&gt;
      if (data == undefined) {&lt;br /&gt;
        data = {&lt;br /&gt;
          message: &amp;quot;Network Error&amp;quot;&lt;br /&gt;
        };&lt;br /&gt;
      }&lt;br /&gt;
      NSB.MsgBox(data.message);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&amp;quot;success&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
  Function butClear_onclick()&lt;br /&gt;
    appStorage.clear(done)&lt;br /&gt;
  End Function&lt;br /&gt;
&lt;br /&gt;
  Function done(error, data)&lt;br /&gt;
    If error Then&lt;br /&gt;
      If data = undefined Then data = {message: &amp;quot;Network Error&amp;quot;}&lt;br /&gt;
      MsgBox data.message&lt;br /&gt;
    Else&lt;br /&gt;
      console.log(&amp;quot;success&amp;quot;)&lt;br /&gt;
    End If&lt;br /&gt;
  End Function&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== appStorage.getItem ==&lt;br /&gt;
&lt;br /&gt;
This call returns the value of the item with the specified &#039;&#039;key&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
The syntax of the function is:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;appStorage.getItem&#039;&#039;&#039;(&#039;&#039;key&#039;&#039;, &#039;&#039;callback&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;key&#039;&#039; - The name of the item. String.&lt;br /&gt;
* &#039;&#039;callback&#039;&#039; - function(&#039;&#039;error&#039;&#039;, &#039;&#039;data&#039;&#039;), required. The function in your app to call when the function is complete (or fails).&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
  butGetItem.onclick = function() {&lt;br /&gt;
    appStorage.getItem(&amp;quot;SimpleString&amp;quot;, getItemCallback);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  function getItemCallback(error, data) {&lt;br /&gt;
    if (error) {&lt;br /&gt;
      if (data == undefined) {&lt;br /&gt;
        data = {&lt;br /&gt;
          message: &amp;quot;Network Error&amp;quot;&lt;br /&gt;
        };&lt;br /&gt;
      }&lt;br /&gt;
      alert(data.message);&lt;br /&gt;
    } else {&lt;br /&gt;
      alert(data);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
  Function butGetItem_onclick()&lt;br /&gt;
    appStorage.getItem(&amp;quot;SimpleString&amp;quot;, getItemCallback)&lt;br /&gt;
  End Function&lt;br /&gt;
&lt;br /&gt;
  Function getItemCallback(error, data) &lt;br /&gt;
    If error Then&lt;br /&gt;
      If data = undefined Then data = {message: &amp;quot;Network Error&amp;quot;}&lt;br /&gt;
      MsgBox data.message&lt;br /&gt;
    Else&lt;br /&gt;
      MsgBox data&lt;br /&gt;
    End If&lt;br /&gt;
  End Function&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== appStorage.getAllItems ==&lt;br /&gt;
&lt;br /&gt;
This call returns all the items in your app&#039;s appStorage in an array of {key, value} objects.&lt;br /&gt;
&lt;br /&gt;
The syntax of the function is:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;appStorage.getAllItems&#039;&#039;&#039;(&#039;&#039;callback&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;callback&#039;&#039; - function(&#039;&#039;error&#039;&#039;, &#039;&#039;data&#039;&#039;), required. The function in your app to call when the function is complete (or fails).&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
  butGetAllItems.onclick = function() {&lt;br /&gt;
    appStorage.getAllItems(getAllItemsCallback);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  function getAllItemsCallback(error, data) {&lt;br /&gt;
    if (error) {&lt;br /&gt;
      if (data == undefined) {&lt;br /&gt;
        data = {&lt;br /&gt;
          message: &amp;quot;Network Error&amp;quot;&lt;br /&gt;
        };&lt;br /&gt;
      }&lt;br /&gt;
      NSB.MsgBox(data.message);&lt;br /&gt;
    } else {&lt;br /&gt;
      NSB.Print((false) + &amp;quot;&amp;lt;br&amp;gt;&amp;quot;);&lt;br /&gt;
      for (key in data) {&lt;br /&gt;
        console.log(key, data[key]);&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
  Function butGetAllItems_onclick()&lt;br /&gt;
    appStorage.getAllItems(getAllItemsCallback)&lt;br /&gt;
  End Function&lt;br /&gt;
&lt;br /&gt;
  Function getAllItemsCallback(error, data) &lt;br /&gt;
    If error Then&lt;br /&gt;
      If data = undefined Then data = {message: &amp;quot;Network Error&amp;quot;}&lt;br /&gt;
      MsgBox data.message&lt;br /&gt;
    Else&lt;br /&gt;
      Print False&lt;br /&gt;
      For Each key in data&lt;br /&gt;
        console.log(key, data[key])&lt;br /&gt;
        k = [key, key][0]&lt;br /&gt;
        Print k &amp;amp; &amp;quot;: &amp;quot; &amp;amp; data[key].toString()&lt;br /&gt;
      Next&lt;br /&gt;
    End If&lt;br /&gt;
  End Function&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== appStorage.removeItem ==&lt;br /&gt;
&lt;br /&gt;
This call removes the item with a specified key.  It is available in the Dashboard only.&lt;br /&gt;
&lt;br /&gt;
The syntax of the function is:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;appStorage.removeItem&#039;&#039;&#039;(&#039;&#039;key&#039;&#039;, &#039;&#039;callback&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;key&#039;&#039; - The name of the item. String.&lt;br /&gt;
* &#039;&#039;callback&#039;&#039; - function(&#039;&#039;error&#039;&#039;, &#039;&#039;data&#039;&#039;), required. The function in your app to call when the function is complete (or fails).&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
  butRemoveItem.onclick = function() {&lt;br /&gt;
    appStorage.removeItem(&amp;quot;SimpleString&amp;quot;, done);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  function done(error, data) {&lt;br /&gt;
    if (error) {&lt;br /&gt;
      if (data == undefined) {&lt;br /&gt;
        data = {&lt;br /&gt;
          message: &amp;quot;Network Error&amp;quot;&lt;br /&gt;
        };&lt;br /&gt;
      }&lt;br /&gt;
      NSB.MsgBox(data.message);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&amp;quot;success&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
  Function butRemoveItem_onclick()&lt;br /&gt;
    appStorage.removeItem(&amp;quot;SimpleString&amp;quot;, done)&lt;br /&gt;
  End Function&lt;br /&gt;
&lt;br /&gt;
  Function done(error, data)&lt;br /&gt;
    If error Then&lt;br /&gt;
      If data = undefined Then data = {message: &amp;quot;Network Error&amp;quot;}&lt;br /&gt;
      MsgBox data.message&lt;br /&gt;
    Else&lt;br /&gt;
      console.log(&amp;quot;success&amp;quot;)&lt;br /&gt;
    End If&lt;br /&gt;
  End Function&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== appStorage.setItem ==&lt;br /&gt;
&lt;br /&gt;
This call adds a key, value pair to appStorage. It is available in the Dashboard only.&lt;br /&gt;
&lt;br /&gt;
The syntax of the function is:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;appStorage.setItem&#039;&#039;&#039;(&#039;&#039;key&#039;&#039;, *value*, &#039;&#039;callback&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;key&#039;&#039; - The name of the item. String.&lt;br /&gt;
* *value* - The name of the item. Can be string, number, array, object: any JavaScript data type.&lt;br /&gt;
* &#039;&#039;callback&#039;&#039; - function(&#039;&#039;error&#039;&#039;, &#039;&#039;data&#039;&#039;), required. The function in your app to call when the function is complete (or fails).&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
  butSetItem.onclick = function() {&lt;br /&gt;
    appStorage.setItem(&amp;quot;SimpleString&amp;quot;, &amp;quot;ABCD&amp;quot;, done);&lt;br /&gt;
    appStorage.setItem(&amp;quot;Number&amp;quot;, 123, done);&lt;br /&gt;
    appStorage.setItem(&amp;quot;Array&amp;quot;, [1, 2, 3, 4], done);&lt;br /&gt;
    appStorage.setItem(&amp;quot;Object&amp;quot;, {&lt;br /&gt;
      firstName: &amp;quot;Eric&amp;quot;,&lt;br /&gt;
      lastName: &amp;quot;Cartman&amp;quot;&lt;br /&gt;
    }, done);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  function done(error, data) {&lt;br /&gt;
    if (error) {&lt;br /&gt;
      if (data == undefined) {&lt;br /&gt;
        data = {&lt;br /&gt;
            message: &amp;quot;Network Error&amp;quot;&lt;br /&gt;
        };&lt;br /&gt;
      }&lt;br /&gt;
      NSB.MsgBox(data.message);&lt;br /&gt;
    } else {&lt;br /&gt;
      console.log(&amp;quot;success&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
  Function butSetItem_onclick()&lt;br /&gt;
    appStorage.setItem(&amp;quot;SimpleString&amp;quot;, &amp;quot;ABCD&amp;quot;, done)&lt;br /&gt;
    appStorage.setItem(&amp;quot;Number&amp;quot;, 123, done)&lt;br /&gt;
    appStorage.setItem(&amp;quot;Array&amp;quot;, [1, 2, 3, 4], done)&lt;br /&gt;
    appStorage.setItem(&amp;quot;Object&amp;quot;, {firstName: &amp;quot;Eric&amp;quot;, lastName: &amp;quot;Cartman&amp;quot;}, done)&lt;br /&gt;
  End Function&lt;br /&gt;
&lt;br /&gt;
  Function done(error, data)&lt;br /&gt;
    If error Then&lt;br /&gt;
      If data = undefined Then data = {message: &amp;quot;Network Error&amp;quot;}&lt;br /&gt;
      MsgBox data.message&lt;br /&gt;
    Else&lt;br /&gt;
      console.log(&amp;quot;success&amp;quot;)&lt;br /&gt;
    End If&lt;br /&gt;
  End Function&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
&lt;br /&gt;
* JavaScript API: [https://docs.voltcloud.io/client/$volt.storage.html https://docs.voltcloud.io/client/$volt.storage.html]&lt;br /&gt;
* REST API: [https://docs.voltcloud.io/api/#storage-plug-in https://docs.voltcloud.io/api/#storage-plug-in]&lt;/div&gt;</summary>
		<author><name>Sarah</name></author>
	</entry>
	<entry>
		<id>https://wiki.appstudio.dev/index.php?title=Send_email&amp;diff=9244</id>
		<title>Send email</title>
		<link rel="alternate" type="text/html" href="https://wiki.appstudio.dev/index.php?title=Send_email&amp;diff=9244"/>
		<updated>2017-05-26T23:44:36Z</updated>

		<summary type="html">&lt;p&gt;Sarah: Instructions for sending email to currently signed on user&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Volt lets you send email messages to the currently signed on user, much like the &#039;Confirm Password&#039; email. To do this, you first have to set some things up.&lt;br /&gt;
&lt;br /&gt;
== Email Plugin Settings ==&lt;br /&gt;
&lt;br /&gt;
# Open a [http://sendgrid.com/ SendGrid] account (It&#039;s free for low volumes).&lt;br /&gt;
# In SendGrid settings, choose API Keys.&lt;br /&gt;
# In API Keys, click on Create API Key (general). The only setting needed is to choose &amp;quot;Full Access&amp;quot; for Mail Send.&lt;br /&gt;
# When you click Save, you will get a long API key. Save this value.&lt;br /&gt;
# Open your app in the [https://dashboard.voltcloud.io/ Volt Dashboard].&lt;br /&gt;
# For Email From, enter the email address you want to show as the From address. It can be anything.&lt;br /&gt;
# For Email API, enter the long API key from Step 4.&lt;br /&gt;
# Save.&lt;br /&gt;
&lt;br /&gt;
[[File:Sending-email.png]]&lt;br /&gt;
&lt;br /&gt;
== Sending Email ==&lt;br /&gt;
&lt;br /&gt;
Now you can send an email to to currently logged in user of your app using the $volt.email.send() function.&lt;br /&gt;
&lt;br /&gt;
The syntax of the function is:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;$volt.email.send&#039;&#039;&#039;(&#039;&#039;subject&#039;&#039;, &#039;&#039;text&#039;&#039;, &#039;&#039;callback&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;subject&#039;&#039; - string, required. The text to appear as the Subject of the email.&lt;br /&gt;
* &#039;&#039;text&#039;&#039; - string, required. The text to appear as the Body of the email.&lt;br /&gt;
* &#039;&#039;callback&#039;&#039; - function(error, data), required. The function in your app to call when the request to Volt is complete (or fails).&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
  butSendEmail.onclick = function() {&lt;br /&gt;
    var subject = &#039;Email from &#039; + AppTitle;&lt;br /&gt;
    var text = &#039;This message was sent from a Volt app to the currently signed on user.&#039;;&lt;br /&gt;
    $volt.email.send(subject, text, sendEmailCallback);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  function sendEmailCallback(error, data) {&lt;br /&gt;
    if (error) {&lt;br /&gt;
      if (!data) {&lt;br /&gt;
        data = { message: &#039;Network Error&#039; };&lt;br /&gt;
      }&lt;br /&gt;
      alert(data.message);&lt;br /&gt;
    } else {&lt;br /&gt;
      alert(&#039;Email Sent.&#039;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
  Function butSendEmail_onclick()&lt;br /&gt;
    Dim subject = &amp;quot;Email from &amp;quot; &amp;amp; AppTitle&lt;br /&gt;
    Dim text = &amp;quot;This message was sent from a Volt app to the currently signed on user.&amp;quot;&lt;br /&gt;
    setBusyIcon(this)&lt;br /&gt;
    $volt.email.send(subject, text, sendEmailCallback)&lt;br /&gt;
  End Function&lt;br /&gt;
&lt;br /&gt;
  Function sendEmailCallback(error, data)&lt;br /&gt;
    clearBusyIcon(this)&lt;br /&gt;
    If error Then&lt;br /&gt;
      If (!data) Then data = { message: &amp;quot;Network Error&amp;quot; }&lt;br /&gt;
      MsgBox data.message&lt;br /&gt;
    Else&lt;br /&gt;
      MsgBox &amp;quot;Email Sent.&amp;quot;&lt;br /&gt;
    End If&lt;br /&gt;
  End Function&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
&lt;br /&gt;
* JavaScript API: [https://docs.voltcloud.io/client/$volt.email.html#.send https://docs.voltcloud.io/client/$volt.email.html#.send]&lt;br /&gt;
* REST API: [https://docs.voltcloud.io/api/#email-plug-in-email-endpoint-post https://docs.voltcloud.io/api/#email-plug-in-email-endpoint-post]&lt;/div&gt;</summary>
		<author><name>Sarah</name></author>
	</entry>
	<entry>
		<id>https://wiki.appstudio.dev/index.php?title=Current_user&amp;diff=9243</id>
		<title>Current user</title>
		<link rel="alternate" type="text/html" href="https://wiki.appstudio.dev/index.php?title=Current_user&amp;diff=9243"/>
		<updated>2017-05-26T23:23:23Z</updated>

		<summary type="html">&lt;p&gt;Sarah: Instructions for creating and working with the current user&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Here are some functions for managing the users of your app. You&#039;ll need to [[first_app|initialize your app]], after which you can get the information for the logged in user, modify it or delete it.&lt;br /&gt;
&lt;br /&gt;
== Get User information ==&lt;br /&gt;
&lt;br /&gt;
You can get information on the currently logged on user with the  &amp;lt;code&amp;gt;$volt.user.get()&amp;lt;/code&amp;gt; function.&lt;br /&gt;
&lt;br /&gt;
The syntax of the function is:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;$volt.use.get&#039;&#039;&#039;(&#039;&#039;callback&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;callback&#039;&#039; - function(error, data), required. The function in your app to call when the request to Volt is complete (or fails).&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
  var user;&lt;br /&gt;
&lt;br /&gt;
  butGetUser.onclick = function() {&lt;br /&gt;
    $volt.user.get(getUserCallback);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function getUserCallback(error, data) {&lt;br /&gt;
    if (error) {&lt;br /&gt;
      if (!data) {&lt;br /&gt;
        data = { message: &#039;Network Error&#039; };&lt;br /&gt;
      }&lt;br /&gt;
      alert(data.message);&lt;br /&gt;
      user = null;&lt;br /&gt;
    } else {&lt;br /&gt;
      user = data;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
  Dim user&lt;br /&gt;
&lt;br /&gt;
  Function butGetUser_onclick()&lt;br /&gt;
    $volt.user.get(getUserCallback)&lt;br /&gt;
  End Function&lt;br /&gt;
&lt;br /&gt;
  Function getUserCallback(error, data)&lt;br /&gt;
    If error Then&lt;br /&gt;
      If (!data) Then data = { message: &amp;quot;Network Error&amp;quot; }&lt;br /&gt;
      alert(data.message)&lt;br /&gt;
      user = null&lt;br /&gt;
    Else&lt;br /&gt;
      user = data&lt;br /&gt;
    End If&lt;br /&gt;
  End Function&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
What gets returned? Here is what is in the initial release of Volt:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;id&amp;quot;: &amp;quot;7PQipR&amp;quot;,&lt;br /&gt;
    &amp;quot;email&amp;quot;: &amp;quot;support@nsbasic.com&amp;quot;,&lt;br /&gt;
    &amp;quot;confirmed&amp;quot;: true,&lt;br /&gt;
    &amp;quot;first_name&amp;quot;: &amp;quot;John&amp;quot;,&lt;br /&gt;
    &amp;quot;last_name&amp;quot;: &amp;quot;Smith&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Modify User information ==&lt;br /&gt;
&lt;br /&gt;
You can change information for the currently logged on user with the &amp;lt;code&amp;gt;$volt.user.update()&amp;lt;/code&amp;gt; function.&lt;br /&gt;
&lt;br /&gt;
The syntax of the function is:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;$volt.user.get&#039;&#039;&#039;(&#039;&#039;data&#039;&#039;, &#039;&#039;callback&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;data&#039;&#039; - object, required. An object with the user details to update.&lt;br /&gt;
* &#039;&#039;callback&#039;&#039; - function(error, data), required. The function in your app to call when the request to Volt is complete (or fails).&lt;br /&gt;
&lt;br /&gt;
The data object should be of the following form:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;email&amp;quot;: &amp;quot;new@email.com&amp;quot;,&lt;br /&gt;
    &amp;quot;password&amp;quot;: {&lt;br /&gt;
      &amp;quot;old&amp;quot;: &amp;quot;myOldPassword&amp;quot;,&lt;br /&gt;
      &amp;quot;new&amp;quot;: &amp;quot;myNewPassword&amp;quot;,&lt;br /&gt;
      &amp;quot;confirmation&amp;quot;: &amp;quot;myNewPassword&amp;quot;&lt;br /&gt;
    },&lt;br /&gt;
    &amp;quot;first_name&amp;quot;: &amp;quot;Alan&amp;quot;,&lt;br /&gt;
    &amp;quot;last_name&amp;quot;: &amp;quot;Turing&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can pass &amp;lt;code&amp;gt;email&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;password&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;first_name&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;last_name&amp;lt;/code&amp;gt; or any combination thereof. Here&#039;s an example of changing the logged in user&#039;s email:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
  butUpdateUser.onclick = function() {&lt;br /&gt;
    $volt.user.update({ email: inpNewEmail.value }, updateUserCallback);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function updateUserCallback(error, data) {&lt;br /&gt;
    if (error) {&lt;br /&gt;
      if (!data) {&lt;br /&gt;
        data = { message: &#039;Network Error&#039; };&lt;br /&gt;
      }&lt;br /&gt;
      alert(data.message);&lt;br /&gt;
    } else {&lt;br /&gt;
      alert(&#039;User updated.&#039;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
  Function butUpdateUser_onclick()&lt;br /&gt;
    $volt.user.update({ email: inpNewEmail.value }, updateUserCallback)&lt;br /&gt;
  End Function&lt;br /&gt;
&lt;br /&gt;
  Function getUserCallback(error, data)&lt;br /&gt;
    If error Then&lt;br /&gt;
      If (!data) Then data = { message: &amp;quot;Network Error&amp;quot; }&lt;br /&gt;
      alert(data.message)&lt;br /&gt;
    Else&lt;br /&gt;
      alert(&amp;quot;User updated.&amp;quot;)&lt;br /&gt;
    End If&lt;br /&gt;
  End Function&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Delete a User ==&lt;br /&gt;
&lt;br /&gt;
You can provide your users with a way to close/delete their accounts using the &amp;lt;code&amp;gt;$volt.user.delete()&amp;lt;/code&amp;gt; function.&lt;br /&gt;
&lt;br /&gt;
The syntax of the function is:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;$volt.user.delete&#039;&#039;&#039;(&#039;&#039;callback&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;callback&#039;&#039; - function(error, data), required. The function in your app to call when the request to Volt is complete (or fails).&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
  function deleteUser() {&lt;br /&gt;
    $volt.user.delete(deleteUserCallback);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function deleteUserCallback(error, data) {&lt;br /&gt;
    if (error) {&lt;br /&gt;
      if (!data) {&lt;br /&gt;
        data = { message: &#039;Network Error&#039; };&lt;br /&gt;
      }&lt;br /&gt;
      alert(data.message);&lt;br /&gt;
    } else {&lt;br /&gt;
      alert(&#039;User deleted.&#039;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
  Function deleteUser()&lt;br /&gt;
    $volt.user.delete(deleteUserCallback)&lt;br /&gt;
  End Function&lt;br /&gt;
&lt;br /&gt;
  Function deleteUserCallback(error, data)&lt;br /&gt;
    If error Then&lt;br /&gt;
      If (!data) Then data = { message: &amp;quot;Network Error&amp;quot; }&lt;br /&gt;
      MsgBox data.message&lt;br /&gt;
    Else&lt;br /&gt;
      MsgBox &amp;quot;User Deleted&amp;quot;&lt;br /&gt;
    End If&lt;br /&gt;
  End Function&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
&lt;br /&gt;
* JavaScript API&lt;br /&gt;
  * [https://docs.voltcloud.io/client/$volt.user.html#.get https://docs.voltcloud.io/client/$volt.user.html#.get]&lt;br /&gt;
  * [https://docs.voltcloud.io/client/$volt.user.html#.update https://docs.voltcloud.io/client/$volt.user.html#.update]&lt;br /&gt;
  * [https://docs.voltcloud.io/client/$volt.user.html#.delete https://docs.voltcloud.io/client/$volt.user.html#.delete]&lt;br /&gt;
* REST API&lt;br /&gt;
  * [https://docs.voltcloud.io/api/#users-current-user-get https://docs.voltcloud.io/api/#users-current-user-get]&lt;br /&gt;
  * [https://docs.voltcloud.io/api/#users-current-user-put https://docs.voltcloud.io/api/#users-current-user-put]&lt;br /&gt;
  * [https://docs.voltcloud.io/api/#users-current-user-delete https://docs.voltcloud.io/api/#users-current-user-delete]&lt;/div&gt;</summary>
		<author><name>Sarah</name></author>
	</entry>
	<entry>
		<id>https://wiki.appstudio.dev/index.php?title=User_confirmation&amp;diff=9242</id>
		<title>User confirmation</title>
		<link rel="alternate" type="text/html" href="https://wiki.appstudio.dev/index.php?title=User_confirmation&amp;diff=9242"/>
		<updated>2017-05-26T23:08:10Z</updated>

		<summary type="html">&lt;p&gt;Sarah: Instructions for creating user confirmations&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Volt allows you to require your users to confirm their accounts via email. By default this is turned off. You can turn it on by setting the confirmation URL in the Dashboard.&lt;br /&gt;
&lt;br /&gt;
== Setting up the Dashboard ==&lt;br /&gt;
&lt;br /&gt;
In the Dashboard, you can set the page in your app that handles user confirmations. The special value &amp;lt;nowiki&amp;gt;{{token}}&amp;lt;/nowiki&amp;gt; is replaced by an actual confirmation token that your app can use to reset the password.&lt;br /&gt;
&lt;br /&gt;
[[File:User-confirmation.png]]&lt;br /&gt;
&lt;br /&gt;
The sample string shown is a reasonable one:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;/#&amp;lt;/nowiki&amp;gt; - indicates you want to go to a page (form) in your app.&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;/confirm&amp;lt;/nowiki&amp;gt; - specifically, the confirmation form.&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;{{token}}&amp;lt;/nowiki&amp;gt; - substitute the reset token here. This will be passed back to Volt later to confirm the reset.&lt;br /&gt;
&lt;br /&gt;
== Confirming the user ==&lt;br /&gt;
&lt;br /&gt;
Once your user registers, Volt will send a confirmation email to make sure he is a legitimate user.&lt;br /&gt;
&lt;br /&gt;
Here&#039;s an email similar to what Volt will send to your user. If the link is clicked on, your app will open. Confirmations expire after 12 hours.&lt;br /&gt;
&lt;br /&gt;
  Thanks for signing up! Please click the link below to confirm your account:&lt;br /&gt;
  &lt;br /&gt;
  https://signon.volt.live/#/confirm/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0NzUxNjE3OTcsImV4cCI6MTQ3NTIwNDk5NywiYXVkIjoiL2FwaS9hdXRoL2NvbmZpcm0iLCJpc3MiOiJzaWdub24udm9sdC5saXZlIiwic3ViIjoiN2J2aTR6In0.EkJz1uL3Uo59PPa24bQN2ctXZY4LRwiAVH00kvFpNN0&lt;br /&gt;
  &lt;br /&gt;
  If you didn&#039;t sign up for an account, you can ignore this message.&lt;br /&gt;
&lt;br /&gt;
The complete string will be in &amp;lt;code&amp;gt;location.hash&amp;lt;/code&amp;gt; in your app.&lt;br /&gt;
&lt;br /&gt;
Once the user clicks on the URL in the email, your app can send the confirmation to Volt using the &amp;lt;code&amp;gt;$volt.auth.confirm()&amp;lt;/code&amp;gt; function.&lt;br /&gt;
&lt;br /&gt;
The syntax of the function is:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;$volt.auth.confirm&#039;&#039;&#039;(&#039;&#039;token&#039;&#039;, &#039;&#039;callback&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;token&#039;&#039; - string, required. The token in the URL.&lt;br /&gt;
* &#039;&#039;callback&#039;&#039; - function(error, data), required. The function in your app to call when the request to Volt is complete (or fails).&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
  function confirm() {&lt;br /&gt;
    var queryParams = location.hash.split(&#039;/&#039;);&lt;br /&gt;
&lt;br /&gt;
    $volt.auth.confirm(queryParams[2], confirmCallback);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function confirmCallback(error, data) {&lt;br /&gt;
    if (error) {&lt;br /&gt;
      if (!data) {&lt;br /&gt;
        data = { message: &#039;Network Error&#039; };&lt;br /&gt;
      }&lt;br /&gt;
      alert(data.message);&lt;br /&gt;
    } else {&lt;br /&gt;
      alert(&#039;Your account is confirmed. Have a nice day!&#039;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
  Function confirm()&lt;br /&gt;
    Dim queryParams&lt;br /&gt;
    queryParams = location.hash.split(&amp;quot;/&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    $volt.auth.confirm(queryParams[2], confirmCallback);&lt;br /&gt;
  End Function&lt;br /&gt;
&lt;br /&gt;
  Function confirmCallback(error, data)&lt;br /&gt;
    If error Then&lt;br /&gt;
      If (!data) Then data = { message: &amp;quot;Network Error&amp;quot; }&lt;br /&gt;
      MsgBox data.message&lt;br /&gt;
    Else&lt;br /&gt;
      MsgBox &amp;quot;Your account is confirmed. Have a nice day!&amp;quot;&lt;br /&gt;
    End If&lt;br /&gt;
  End Function&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resending Confirmations ==&lt;br /&gt;
&lt;br /&gt;
Occasionally an account confirmation may not be delivered due to the nature of email. Additionally account confirmations expire after 12 hours. In these cases, you can provide your users with the capability to resend an account confirmation using the &amp;lt;code&amp;gt;$volt.auth.resend()&amp;lt;/code&amp;gt; function.&lt;br /&gt;
&lt;br /&gt;
The syntax of the function is:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;$volt.auth.resend&#039;&#039;&#039;(&#039;&#039;email&#039;&#039;, &#039;&#039;appId&#039;&#039;, &#039;&#039;callback&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;email&#039;&#039; - string, required. The email to resend the confirmation to.&lt;br /&gt;
* &#039;&#039;appId&#039;&#039; - string, optional. The Volt ID of the app to sign into. If not supplied, defaults to value set in &amp;lt;code&amp;gt;$volt.init(appId)&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;callback&#039;&#039; - function(error, data), required. The function in your app to call when the request to Volt is complete (or fails).&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
  butResendConfirmation.onclick = function () {&lt;br /&gt;
    $volt.auth.resend(inpEmail.value, butResendConfirmationCallback);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function butResendConfirmationCallback(error, data) {&lt;br /&gt;
    if (error) {&lt;br /&gt;
      if (!data) {&lt;br /&gt;
        data = { message: &#039;Network Error&#039; };&lt;br /&gt;
      }&lt;br /&gt;
      alert(data.message);&lt;br /&gt;
    } else {&lt;br /&gt;
      alert(&#039;An email is on its way to you.&#039;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
  Function butResendConfirmation_onclick()&lt;br /&gt;
    $volt.auth.forgot(inpEmail.value, butResendConfirmationCallback)&lt;br /&gt;
  End Function&lt;br /&gt;
&lt;br /&gt;
  Function butResendConfirmationCallback(error, data)&lt;br /&gt;
    If (error) Then&lt;br /&gt;
      If (!data) Then data = { message: &amp;quot;Network Error&amp;quot; }&lt;br /&gt;
      MsgBox data.message&lt;br /&gt;
    Else&lt;br /&gt;
      MsgBox &amp;quot;An email is on its way to you.&amp;quot;&lt;br /&gt;
    End If&lt;br /&gt;
  End Function&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
&lt;br /&gt;
* JavaScript API&lt;br /&gt;
** [https://docs.voltcloud.io/client/$volt.auth.html#.confirm https://docs.voltcloud.io/client/$volt.auth.html#.confirm]&lt;br /&gt;
** [https://docs.voltcloud.io/client/$volt.auth.html#.resend https://docs.voltcloud.io/client/$volt.auth.html#.resend]&lt;br /&gt;
* REST API&lt;br /&gt;
** [https://docs.voltcloud.io/api/#authentication-confirm-account-post https://docs.voltcloud.io/api/#authentication-confirm-account-post]&lt;br /&gt;
** [https://docs.voltcloud.io/api/#authentication-resend-confirmation-post https://docs.voltcloud.io/api/#authentication-resend-confirmation-post]&lt;/div&gt;</summary>
		<author><name>Sarah</name></author>
	</entry>
	<entry>
		<id>https://wiki.appstudio.dev/index.php?title=Resetting_passwords&amp;diff=9241</id>
		<title>Resetting passwords</title>
		<link rel="alternate" type="text/html" href="https://wiki.appstudio.dev/index.php?title=Resetting_passwords&amp;diff=9241"/>
		<updated>2017-05-26T22:54:08Z</updated>

		<summary type="html">&lt;p&gt;Sarah: Instructions for resetting passwords&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Sometimes your users will forget their passwords. Other times, their passwords may need to be reset. Volt has functions to help you deal with this.&lt;br /&gt;
&lt;br /&gt;
First, let&#039;s review what happens when a user forgets a password:&lt;br /&gt;
# In the login form, if the user can&#039;t remember the password, &amp;quot;Forget Password&amp;quot; is clicked.&lt;br /&gt;
# This sends a message to Volt to start the reset process.&lt;br /&gt;
# Volt sends an email to the user with a link to reset the password.&lt;br /&gt;
# The link is under your control: it&#039;s set in the Dashboard.&lt;br /&gt;
# The link opens your app to its password reset form.&lt;br /&gt;
# The new password information is sent to Volt to update the user&#039;s data.&lt;br /&gt;
&lt;br /&gt;
The capability to reset passwords is disabled by default. You can enable it by setting your app&#039;s Reset URL in the Dashbaord.&lt;br /&gt;
&lt;br /&gt;
== Setting up the Dashboard ==&lt;br /&gt;
&lt;br /&gt;
In the Dashboard, you can set the page in your app that handles user password resets. The special value &amp;lt;nowiki&amp;gt;{{token}}&amp;lt;/nowiki&amp;gt; is replaced by an actual confirmation token that your app can use to reset the password. Confirmation tokens expire one hour after sending.&lt;br /&gt;
&lt;br /&gt;
[[File:Resetting-passwords-reset.png]]&lt;br /&gt;
&lt;br /&gt;
The sample string shown is a reasonable one:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;/#&amp;lt;/nowiki&amp;gt; - indicates you want to go to a page (form) in your app.&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;/reset&amp;lt;/nowiki&amp;gt; - specifically, the reset form.&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;{{token}}&amp;lt;/nowiki&amp;gt; - substitute the reset token here. This will be passed back to Volt later to authenticate the reset.&lt;br /&gt;
&lt;br /&gt;
== Forgotten Passwords ==&lt;br /&gt;
&lt;br /&gt;
To ask Volt to reset a forgotten password, you can call the &amp;lt;code&amp;gt;$volt.auth.forgot()&amp;lt;/code&amp;gt; function to start the process.&lt;br /&gt;
&lt;br /&gt;
The syntax of the function is:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;$volt.auth.forgot&#039;&#039;&#039;(&#039;&#039;email&#039;&#039;, &#039;&#039;appId&#039;&#039;, &#039;&#039;callback&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;email&#039;&#039; - string, required. The email address of the user.&lt;br /&gt;
* &#039;&#039;appId&#039;&#039; - string, optional. The Volt ID of the app to sign into. If not supplied, defaults to value set in &amp;lt;code&amp;gt;$volt.init(appId)&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;callback&#039;&#039; - function(error, data), required. The function in your app to call when the request to Volt is complete (or fails).&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
  butSendResetPassword.onclick = function () {&lt;br /&gt;
    $volt.auth.forgot(inpEmail.value, butSendResetPasswordCallback);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function butSendResetPasswordCallback(error, data) {&lt;br /&gt;
    if (error) {&lt;br /&gt;
      if (!data) {&lt;br /&gt;
        data = { message: &#039;Network Error&#039; };&lt;br /&gt;
      }&lt;br /&gt;
      alert(data.message);&lt;br /&gt;
    } else {&lt;br /&gt;
      alert(&#039;An email is on its way to you.&#039;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
  Function butSendResetPassword_onclick()&lt;br /&gt;
    $volt.auth.forgot(inpEmail.value, butSendResetPasswordCallback)&lt;br /&gt;
  End Function&lt;br /&gt;
&lt;br /&gt;
  Function butSendResetPasswordCallback(error, data)&lt;br /&gt;
    If (error) Then&lt;br /&gt;
      If (!data) Then data = { message: &amp;quot;Network Error&amp;quot; }&lt;br /&gt;
      MsgBox data.message&lt;br /&gt;
    Else&lt;br /&gt;
      MsgBox &amp;quot;An email is on its way to you.&amp;quot;&lt;br /&gt;
    End If&lt;br /&gt;
  End Function&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Resetting Passwords ==&lt;br /&gt;
&lt;br /&gt;
Here&#039;s an email similar to what Volt will send to your user. If the link is clicked on, your app will open. Password resets expire after one hour.&lt;br /&gt;
&lt;br /&gt;
  Click the link below to reset your password:&lt;br /&gt;
  &lt;br /&gt;
  https://project1.voltcloud.io/#/reset/eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE0NzUxMDUyMDgsImV4cCI6MTQ3NTEwODgwOCwiYXVkIjoiL2FwaS9hdXRoL3Jlc2V0IiwiaXNzIjoiZGFzaGJvYXJkLnZvbHRjbG91ZC5pbyIsInN1YiI6IjdQUWlwUiJ9.MVv2wK3WtB9NF2QlFfPlG2GYgy9T7UtJD9jqEWrCj0U&lt;br /&gt;
  &lt;br /&gt;
  If you didn&#039;t request a password reset, you can ignore this message.&lt;br /&gt;
&lt;br /&gt;
The complete string will be in &amp;lt;code&amp;gt;location.hash&amp;lt;/code&amp;gt; in your app. You&#039;ll want to show a form which looks something like this:&lt;br /&gt;
&lt;br /&gt;
[[File:Resetting-passwords-form.png]]&lt;br /&gt;
&lt;br /&gt;
Once the user has filled in the new password and confirmation, you can send it to Volt using the &amp;lt;code&amp;gt;$volt.auth.reset()&amp;lt;/code&amp;gt; function.&lt;br /&gt;
&lt;br /&gt;
The syntax of the function is:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;$volt.auth.reset&#039;&#039;&#039;(&#039;&#039;token&#039;&#039;, &#039;&#039;password&#039;&#039;, &#039;&#039;confirmation&#039;&#039;, &#039;&#039;callback&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;token&#039;&#039; - string, required. The token in the URL.&lt;br /&gt;
* &#039;&#039;password&#039;&#039; - string, required. The new password.&lt;br /&gt;
* &#039;&#039;confirmation&#039;&#039; - string, required. The confirmation password. Should be the same.&lt;br /&gt;
* &#039;&#039;callback&#039;&#039; - function(error, data), required. The function in your app to call when the request to Volt is complete (or fails).&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
  butResetPassword.onclick = function () {&lt;br /&gt;
    var queryParams = location.hash.split(&#039;/&#039;);&lt;br /&gt;
&lt;br /&gt;
    $volt.auth.reset(queryParams[2], inpPasswordNew.value, inpPasswordConfirm.value, resetPasswordCallback);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function resetPasswordCallback(error, data) {&lt;br /&gt;
    if (error) {&lt;br /&gt;
      if (!data) {&lt;br /&gt;
        data = { message: &#039;Network Error&#039; };&lt;br /&gt;
      }&lt;br /&gt;
      alert(data.message);&lt;br /&gt;
    } else {&lt;br /&gt;
      alert(&#039;Password Updated.&#039;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
  Function butResetPassword_onclick()&lt;br /&gt;
    Dim queryParams&lt;br /&gt;
    queryParams = location.hash.split(&amp;quot;/&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    $volt.auth.reset(queryParams[2], inpPasswordNew.value, inpPasswordConfirm.value, resetPasswordCallback);&lt;br /&gt;
  End Function&lt;br /&gt;
&lt;br /&gt;
  Function resetPasswordCallback(error, data)&lt;br /&gt;
    If error Then&lt;br /&gt;
      If (!data) Then data = { message: &amp;quot;Network Error&amp;quot; }&lt;br /&gt;
      MsgBox data.message&lt;br /&gt;
    Else&lt;br /&gt;
      MsgBox &amp;quot;Password Updated.&amp;quot;&lt;br /&gt;
    End If&lt;br /&gt;
  End Function&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== AppStudio Users ==&lt;br /&gt;
&lt;br /&gt;
[https://www.nsbasic.com/ AppStudio] includes a form called frmSignOn. If you include it in your app, forgot is built in.  For resets, do the following:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
  var queryParams = location.hash.split(&#039;/&#039;);&lt;br /&gt;
&lt;br /&gt;
  function Main() {&lt;br /&gt;
    if ((queryParams.length &amp;gt; 1)) {&lt;br /&gt;
      if (queryParams[1] == &#039;reset&#039;) {&lt;br /&gt;
        showResetPassword();&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
  Dim queryParams&lt;br /&gt;
  queryParams = location.hash.split(&amp;quot;/&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
  Sub Main()&lt;br /&gt;
    If (queryParams.length &amp;gt; 1) Then&lt;br /&gt;
      If queryParams[1] = &amp;quot;reset&amp;quot; Then&lt;br /&gt;
        showResetPassword()&lt;br /&gt;
      End If&lt;br /&gt;
    End If&lt;br /&gt;
  End Sub&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
&lt;br /&gt;
* JavaScript API&lt;br /&gt;
** [https://docs.voltcloud.io/client/$volt.auth.html#.forgot https://docs.voltcloud.io/client/$volt.auth.html#.forgot]&lt;br /&gt;
** [https://docs.voltcloud.io/client/$volt.auth.html#.reset https://docs.voltcloud.io/client/$volt.auth.html#.reset]&lt;br /&gt;
* REST API&lt;br /&gt;
** [https://docs.voltcloud.io/api/#authentication-forgot-password-post https://docs.voltcloud.io/api/#authentication-forgot-password-post]&lt;br /&gt;
** [https://docs.voltcloud.io/api/#authentication-reset-password-post https://docs.voltcloud.io/api/#authentication-reset-password-post]&lt;/div&gt;</summary>
		<author><name>Sarah</name></author>
	</entry>
	<entry>
		<id>https://wiki.appstudio.dev/index.php?title=User_registration&amp;diff=9240</id>
		<title>User registration</title>
		<link rel="alternate" type="text/html" href="https://wiki.appstudio.dev/index.php?title=User_registration&amp;diff=9240"/>
		<updated>2017-05-26T22:33:23Z</updated>

		<summary type="html">&lt;p&gt;Sarah: Instructions for registering users&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;To sign a user up for your app, you&#039;ll need to get an email address and a password from them and send it to Volt. If enabled, Volt will send a [[user_confirmation|confirmation]] email. Once the user registers, they will be able to [[log_in|sign on to your app]].&lt;br /&gt;
&lt;br /&gt;
== Registering a User ==&lt;br /&gt;
&lt;br /&gt;
Here&#039;s a typical user registration screen:&lt;br /&gt;
&lt;br /&gt;
[[File:Registering-a-user.png]]&lt;br /&gt;
&lt;br /&gt;
Once you&#039;ve collected the data, you can call Volt using &amp;lt;code&amp;gt;$volt.auth.register()&amp;lt;/code&amp;gt; function to register. This will create an account.&lt;br /&gt;
&lt;br /&gt;
The syntax of the function is:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;$volt.auth.register&#039;&#039;&#039;(&#039;&#039;email&#039;&#039;, &#039;&#039;password&#039;&#039;, &#039;&#039;confirmation&#039;&#039;, &#039;&#039;appId&#039;&#039;, &#039;&#039;callback&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;email&#039;&#039; - string, required. The email address of the user.&lt;br /&gt;
* &#039;&#039;password&#039;&#039; - string, required. The user&#039;s password.&lt;br /&gt;
* &#039;&#039;confirmation&#039;&#039; - string, required. The confirmation password. Must match.&lt;br /&gt;
* &#039;&#039;appId&#039;&#039; - string, optional. The Volt ID of the app to sign into. If not supplied, defaults to value set in &amp;lt;code&amp;gt;$volt.init(appId)&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;callback&#039;&#039; - function(error, data), required. The function in your app to call when the register is complete (or fails).&lt;br /&gt;
&lt;br /&gt;
After Volt receives the registration, it will send a [[user_confirmation|confirmation email]] if you have enabled that functionality.&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
  butCreateAccount.onclick = function () {&lt;br /&gt;
    $volt.auth.register(inpEmail.value, inpPassword.value, inpPasswordConfirm.value, createAccountCallback);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function createAccountCallback(error, data) {&lt;br /&gt;
    if (error) {&lt;br /&gt;
      if (!data) {&lt;br /&gt;
        data = { message: &#039;Network Error&#039; };&lt;br /&gt;
      }&lt;br /&gt;
      alert(data.message);&lt;br /&gt;
    } else {&lt;br /&gt;
      alert(&#039;Your account has been registered.&#039;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
  Function butCreateAccount_onclick() &lt;br /&gt;
    $volt.auth.register(inpEmail.value, inpPassword.value, inpPasswordConfirm.value, createAccountCallback)&lt;br /&gt;
  End Function&lt;br /&gt;
&lt;br /&gt;
  Function createAccountCallback(error, data) {&lt;br /&gt;
    If error Then&lt;br /&gt;
      If (!data) Then data = { message: &amp;quot;Network Error&amp;quot; }&lt;br /&gt;
      MsgBox data.message&lt;br /&gt;
    Else&lt;br /&gt;
      MsgBox &amp;quot;Your account has been registered.&amp;quot;&lt;br /&gt;
    End If&lt;br /&gt;
  End Function&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== AppStudio Users ==&lt;br /&gt;
&lt;br /&gt;
[https://www.nsbasic.com/ AppStudio] includes a form called frmSignOn. If you include it in your app, a register form is included. To use it, do the following:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
  showCreateAccount();&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
  showCreateAccount()&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
&lt;br /&gt;
* JavaScript API: [https://docs.voltcloud.io/client/$volt.auth.html#.register https://docs.voltcloud.io/client/$volt.auth.html#.register]&lt;br /&gt;
* REST API: [https://docs.voltcloud.io/api/#authentication-register-post https://docs.voltcloud.io/api/#authentication-register-post]&lt;/div&gt;</summary>
		<author><name>Sarah</name></author>
	</entry>
	<entry>
		<id>https://wiki.appstudio.dev/index.php?title=Manage_apps&amp;diff=9239</id>
		<title>Manage apps</title>
		<link rel="alternate" type="text/html" href="https://wiki.appstudio.dev/index.php?title=Manage_apps&amp;diff=9239"/>
		<updated>2017-05-26T22:21:07Z</updated>

		<summary type="html">&lt;p&gt;Sarah: Instructions for managing apps&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Volt supplies a [https://dashboard.voltcloud.io/ Dashboard] to help manage your apps. Once you sign in, you will see a list of your apps. You can then perform a variety of tasks, including renaming, deleting and managing users.&lt;br /&gt;
&lt;br /&gt;
== Your Apps ==&lt;br /&gt;
&lt;br /&gt;
Here is what you see when you log into the Dashboard:&lt;br /&gt;
&lt;br /&gt;
[[File:Managing-your-apps-overview.png]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Your Apps&#039;&#039;&#039; shows a summary of your apps. Clicking on the name of the app will open &#039;&#039;&#039;App Information&#039;&#039;&#039; for that app. Clicking the URL will open the app and run it in your browser. You can also scan the QR code on your device to open the app - it&#039;s much quicker than entering a URL on a mobile device keyboard.&lt;br /&gt;
&lt;br /&gt;
== App Information ==&lt;br /&gt;
&lt;br /&gt;
[[File:Managing-your-apps-detail.png]]&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;App Information&#039;&#039; shows, and allows your to edit, the information about your app.&lt;br /&gt;
&lt;br /&gt;
=== Details ===&lt;br /&gt;
&lt;br /&gt;
Here&#039;s what the fields are:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Name&#039;&#039;&#039; - The name of the app. It&#039;s initially set up to be appname-randomWord-randomWord, so it will be unique. You can change it to whatever you like as long as that name isn’t already taken by another user. It must start with a letter or number and can only contain lowercase letters, numbers, and dashes.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ID&#039;&#039;&#039; - The unique ID assigned to this app by Volt. It cannot be edited. If you&#039;re using AppStudio, you will see this value in Volt AppID in Project Properties after your project has been uploaded to Volt.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Upload&#039;&#039;&#039; - The date of the most recent upload. It cannot be edited.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;URL&#039;&#039;&#039; - The URL of the app on the AppStudio server. Click on it to load and run the app. If you change the &#039;&#039;&#039;Name&#039;&#039;&#039;, the URL will change.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Confirm Page&#039;&#039;&#039; - The page in your app that handles user confirmation. The special value &amp;lt;nowiki&amp;gt;{{token}}&amp;lt;/nowiki&amp;gt; is replaced by an actual confirmation token that your app can use to confirm the account. Learn more about [[user_confirmation|user confirmations]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Reset Page&#039;&#039;&#039; - The page in your app that handles user password resets. The special value &amp;lt;nowiki&amp;gt;{{token}}&amp;lt;/nowiki&amp;gt; is replaced by an actual confirmation token that your app can use to reset the password. Learn more about [[resetting_passwords|resetting passwords]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Framing&#039;&#039;&#039; - Controls if the app can be framed by another site. Can be set to none, self, any, or domain. If set to none (the default) then framing is not allowed. If set to self, then the app can only frame itself. If set to any then any site can frame the app (this is not recommended). If set to domain then only the URL which is specified will be allowed to frame the site.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;CORS&#039;&#039;&#039; - Controls if the app&#039;s API allows incoming requests from other domains (CORS). cors_type can be set to none, any, or domain. If set to none (the default), then no cross domain requests are allowed. If set to any, requests from any domain are allowed (this is not recommended). If set to domain, requests will be allowed only from specified URL.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Nice Links&#039;&#039;&#039; - If set, the server will redirect links that aren&#039;t found to index.html, allowing a client side router to service any links. No # character will appear in the URL. For AppStudio users, be sure to set NiceLinks in [[Properties_Window|Project Properties]] to true as well.&lt;br /&gt;
&lt;br /&gt;
=== Actions ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Users&#039;&#039;&#039; - Opens the [[manage_users|Users]] screen. Use it to see the list of your users for the app, and to delete them.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delete&#039;&#039;&#039; - Delete the app. All users must be deleted first. This action CANNOT be undone. It will permanently delete the app and all of its storage.&lt;/div&gt;</summary>
		<author><name>Sarah</name></author>
	</entry>
	<entry>
		<id>https://wiki.appstudio.dev/index.php?title=Log_in&amp;diff=9238</id>
		<title>Log in</title>
		<link rel="alternate" type="text/html" href="https://wiki.appstudio.dev/index.php?title=Log_in&amp;diff=9238"/>
		<updated>2017-05-26T22:04:43Z</updated>

		<summary type="html">&lt;p&gt;Sarah: Instructions for logging in and out&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;After you&#039;ve [[First_app|initialized]], you can use Volt to control who is allowed to use your app. Only users who have registered will be able to log into your app.&lt;br /&gt;
&lt;br /&gt;
== Checking if user is logged in ==&lt;br /&gt;
&lt;br /&gt;
Use the &amp;lt;code&amp;gt;$volt.auth.isLoggedIn()&amp;lt;/code&amp;gt; to check if a user is logged in:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
  if ($volt.auth.isLoggedIn()) {&lt;br /&gt;
    // Ok to do processing&lt;br /&gt;
  } else {&lt;br /&gt;
    // ask user to log in&lt;br /&gt;
  }&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
  If $volt.auth.isLoggedIn() Then&lt;br /&gt;
    &#039;Ok to do processing&lt;br /&gt;
  Else&lt;br /&gt;
    &#039;ask user to log in&lt;br /&gt;
  End If&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Logging In ==&lt;br /&gt;
&lt;br /&gt;
Logging in identifies your user to the Volt server. Here is a typical log in screen:&lt;br /&gt;
&lt;br /&gt;
[[File:Logging-in-and-out.png]]&lt;br /&gt;
&lt;br /&gt;
Once you have have obtained the user&#039;s email and password (either from a screen like the above or otherwise), you can call the &amp;lt;code&amp;gt;$volt.auth.login()&amp;lt;/code&amp;gt; function to log the user in.&lt;br /&gt;
&lt;br /&gt;
The syntax of the function is:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;$volt.auth.login&#039;&#039;&#039;(&#039;&#039;email&#039;&#039;, &#039;&#039;password&#039;&#039;, &#039;&#039;appId&#039;&#039;, &#039;&#039;callback&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;email&#039;&#039; - string, required. The email address of the user.&lt;br /&gt;
* &#039;&#039;password&#039;&#039; - string, required. The user&#039;s password.&lt;br /&gt;
* &#039;&#039;appId&#039;&#039; - string, optional. The Volt ID of the app to sign into. If not supplied, defaults to value set in &amp;lt;code&amp;gt;$volt.init(appId)&amp;lt;/code&amp;gt;.&lt;br /&gt;
* &#039;&#039;callback&#039;&#039; - function(error, data), required. The function in your app to call when the login is complete (or fails).&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
  butSignOn.onclick = function () {&lt;br /&gt;
    $volt.auth.login(inpEmail.value, inpPassword.value, signOnCallback);&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
  function signOnCallback(error, data) {&lt;br /&gt;
    if (error) {&lt;br /&gt;
      if (!data) {&lt;br /&gt;
        data = { message: &#039;Network Error&#039; };&lt;br /&gt;
      }&lt;br /&gt;
      alert(data.message);&lt;br /&gt;
    } else {&lt;br /&gt;
      alert(&#039;User successfully logged in&#039;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
  Sub butSignOn.onclick()&lt;br /&gt;
    $volt.auth.login(inpEmail.value, inpPassword.value, signOnCallback);&lt;br /&gt;
  End Sub&lt;br /&gt;
&lt;br /&gt;
  Function signOnCallback(error, data)&lt;br /&gt;
    If error Then&lt;br /&gt;
      If (!data) Then data = { message: &amp;quot;Network Error&amp;quot; }&lt;br /&gt;
      MsgBox data.message&lt;br /&gt;
    Else&lt;br /&gt;
      MsgBox &amp;quot;User successfully logged in&amp;quot;&lt;br /&gt;
    End If&lt;br /&gt;
  End Sub&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Logging Out ==&lt;br /&gt;
&lt;br /&gt;
You can log your user out by using &amp;lt;code&amp;gt;$volt.auth.logout()&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
  $volt.auth.logout();&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
  $volt.auth.logout()&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== AppStudio Users ==&lt;br /&gt;
&lt;br /&gt;
[https://www.nsbasic.com/ AppStudio] includes a form for handling login duties, called frmSignOn. If you include it in your app, you can call it as follows:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
  butSignIn.onclick = function() {&lt;br /&gt;
    showSignIn(signInCallback);&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
  function signInCallback() {&lt;br /&gt;
    butSignIn.disabled = true;&lt;br /&gt;
    NSB.MsgBox(&#039;SignIn successful.&#039;);&lt;br /&gt;
  }&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
  Function butSignIn_onclick()&lt;br /&gt;
    showSignIn(signInCallback)&lt;br /&gt;
  End Function&lt;br /&gt;
&lt;br /&gt;
  Function signInCallback()&lt;br /&gt;
    butSignIn.disabled = True&lt;br /&gt;
    MsgBox &amp;quot;SignIn successful.&amp;quot;&lt;br /&gt;
  End Function&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
&lt;br /&gt;
* JavaScript API&lt;br /&gt;
** [[https://docs.voltcloud.io/client/$volt.auth.html#.isLoggedIn https://docs.voltcloud.io/client/$volt.auth.html#.isLoggedIn]]&lt;br /&gt;
** [[https://docs.voltcloud.io/client/$volt.auth.html#.login https://docs.voltcloud.io/client/$volt.auth.html#.login]]&lt;br /&gt;
** [[https://docs.voltcloud.io/client/$volt.auth.html#.logout https://docs.voltcloud.io/client/$volt.auth.html#.logout]]&lt;br /&gt;
* REST API: [[https://docs.voltcloud.io/api/#authentication-login-post https://docs.voltcloud.io/api/#authentication-login-post]]&lt;/div&gt;</summary>
		<author><name>Sarah</name></author>
	</entry>
	<entry>
		<id>https://wiki.appstudio.dev/index.php?title=Volt_for_appstudio&amp;diff=9237</id>
		<title>Volt for appstudio</title>
		<link rel="alternate" type="text/html" href="https://wiki.appstudio.dev/index.php?title=Volt_for_appstudio&amp;diff=9237"/>
		<updated>2017-05-26T21:49:15Z</updated>

		<summary type="html">&lt;p&gt;Sarah: Information and instructions for AppStudio users for using Volt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Introduction ==&lt;br /&gt;
&lt;br /&gt;
[https://www.voltcloud.io Volt] is a cloud service which provides additional functionality for AppStudio. It&#039;s designed as a platform, so new features can be added.&lt;br /&gt;
&lt;br /&gt;
Volt replaces the AppStudio Server, and does much more! Initial features include:&lt;br /&gt;
&lt;br /&gt;
* App Hosting: Upload your apps to Volt and they can be accessed by users anywhere in the world. Permanent hosting is available.&lt;br /&gt;
* Custom Domains: Use custom domains you own for your apps, or use domains assigned by Volt.&lt;br /&gt;
* App Management: Display and configure your apps on the Volt server using your [https://dashboard.voltcloud.io Dashboard].&lt;br /&gt;
* User Management: Allow your users to sign into your app with usernames and passwords.&lt;br /&gt;
&lt;br /&gt;
== AppStudio Demo Users ==&lt;br /&gt;
&lt;br /&gt;
If you&#039;re using the AppStudio Demo, you don&#039;t need to create an account to use Volt. When you deploy, your app will be placed on the Volt server, and you will be given a link to access it. It will remain on the server for an hour.&lt;br /&gt;
&lt;br /&gt;
Once you sign up for AppStudio, you can create a Volt account and use all the Volt services.&lt;br /&gt;
&lt;br /&gt;
== AppStudio Registered Users ==&lt;br /&gt;
&lt;br /&gt;
If you are a licensed AppStudio user, Volt replaces the AppStudio Server you previously used. Deploy works the same way. We encourage you to get your free Volt account because it will help you manage your apps.&lt;br /&gt;
&lt;br /&gt;
If you do not want to use any of the additional features (such as Users, Email, etc.) don&#039;t worry about them. There is no need to know more at this point.&lt;br /&gt;
&lt;br /&gt;
== Managing Your Own Account ==&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t have an account, you will still be able to deploy apps. They will be available for about an hour. If you want to apps to remain longer or use Volt features, you will need to sign up.&lt;br /&gt;
&lt;br /&gt;
To sign up, go into the Volt tab in AppStudio Preferences and click on &amp;quot;Sign up for Volt&amp;quot;. Follow the instructions and a free Volt account will be set up for you. Once this is done, enter the email and password for your account into AppStudio&#039;s Volt Preferences tab.&lt;br /&gt;
&lt;br /&gt;
== Using Volt from AppStudio ==&lt;br /&gt;
&lt;br /&gt;
There are several places which AppStudio interacts with Volt.&lt;br /&gt;
&lt;br /&gt;
=== The Run Menu ===&lt;br /&gt;
&lt;br /&gt;
[[File:Volt-for-appstudio-users-runmenu.png]]&lt;br /&gt;
&lt;br /&gt;
* Deploy to Volt: This uploads your app to the Volt server. If you have an account, it should be entered into Preferences. If you do not, the app will only remain on the server for an hour.&lt;br /&gt;
* Manage your Volt App: This opens the Volt Dashboard to your currently loaded app and lets you customize its features.&lt;br /&gt;
* Sign In/Sign Up to Volt: This opens the Volt Dashboard and lets you sign in to manage your apps. If you do not have an account, you can sign up for one here.&lt;br /&gt;
&lt;br /&gt;
== Volt Preferences ==&lt;br /&gt;
&lt;br /&gt;
In Preferences. Use this panel to enter your Volt email and password. This will let AppStudio sign you on directly when you deploy.&lt;br /&gt;
&lt;br /&gt;
[[File:Volt-for-appstudio-users-voltprefs.png]]&lt;br /&gt;
&lt;br /&gt;
== The Dashboard - Your Apps ==&lt;br /&gt;
&lt;br /&gt;
The Dashboard is an app for managing your Volt apps. You can get to it by going to [https://dashboard.voltcloud.io/ https://dashboard.voltcloud.io/]. Here&#039;s the main screen:&lt;br /&gt;
&lt;br /&gt;
[[File:Volt-for-appstudio-users-dashboard.png]]&lt;br /&gt;
&lt;br /&gt;
* Open will run the App&lt;br /&gt;
* Clicking on one of the items will open the App Details&lt;br /&gt;
&lt;br /&gt;
== The Dashboard - App Information ==&lt;br /&gt;
&lt;br /&gt;
[[File:Volt-for-appstudio-users-appdetails.png]]&lt;br /&gt;
&lt;br /&gt;
* On that same page, there are actions you can perform on your app:&lt;br /&gt;
&lt;br /&gt;
[[File:Volt-for-appstudio-users-appactions.png]]&lt;br /&gt;
&lt;br /&gt;
* Delete removes your app from Volt.&lt;br /&gt;
* Users let your view and remove users of that app.&lt;br /&gt;
&lt;br /&gt;
== The Dashboard - Users ==&lt;br /&gt;
&lt;br /&gt;
[[File:Volt-for-appstudio-users-appusers.png]]&lt;br /&gt;
&lt;br /&gt;
== Managing your App&#039;s User Accounts ==&lt;br /&gt;
&lt;br /&gt;
Volt lets you manage a list of users who are allowed to access your app. It handles signing up, signing in, signing out and all the other functions which are needed (email confirmations, forgot passwords, etc...).&lt;br /&gt;
&lt;br /&gt;
When you sign up for a Volt account, you&#039;re using the same mechanism. You will find samples in BASIC and JavaScript in the AppStudio Samples, in a new folder called Volt. You&#039;re welcome to adapt these samples into your own apps.&lt;br /&gt;
&lt;br /&gt;
== Email ==&lt;br /&gt;
&lt;br /&gt;
Coming soon.&lt;br /&gt;
&lt;br /&gt;
== Samples ==&lt;br /&gt;
&lt;br /&gt;
Samples for using Volt features in AppStudio are included with the normal AppStudio samples, under &amp;quot;4 Volt Services&amp;quot;. To use these samples, deploy them to Volt. They will not work in your local browser.&lt;/div&gt;</summary>
		<author><name>Sarah</name></author>
	</entry>
	<entry>
		<id>https://wiki.appstudio.dev/index.php?title=Manage_users&amp;diff=9236</id>
		<title>Manage users</title>
		<link rel="alternate" type="text/html" href="https://wiki.appstudio.dev/index.php?title=Manage_users&amp;diff=9236"/>
		<updated>2017-05-26T21:33:55Z</updated>

		<summary type="html">&lt;p&gt;Sarah: Instructions on managing app users.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Volt supplies a [https://dashboard.voltcloud.io/ Dashboard] to help manage your apps. One of its features is that you can use it to manage the users who have signed up for the app.&lt;br /&gt;
&lt;br /&gt;
== Users ==&lt;br /&gt;
&lt;br /&gt;
Here is what you see when you log into the Dashboard, choose an app and click on the Users button:&lt;br /&gt;
&lt;br /&gt;
[[File:Managing-your-users.png]]&lt;br /&gt;
&lt;br /&gt;
Each of your users is shown, whether they are confirmed or not.&lt;br /&gt;
&lt;br /&gt;
To delete a user, click on the Delete button. All information about the user will be permanently removed. The user will have to sign up again to use your app.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Delete All Users&#039;&#039;&#039; will delete all the users of your app. Use this very carefully!&lt;/div&gt;</summary>
		<author><name>Sarah</name></author>
	</entry>
	<entry>
		<id>https://wiki.appstudio.dev/index.php?title=File:Volt-for-appstudio-users-appactions.png&amp;diff=9235</id>
		<title>File:Volt-for-appstudio-users-appactions.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.appstudio.dev/index.php?title=File:Volt-for-appstudio-users-appactions.png&amp;diff=9235"/>
		<updated>2017-05-26T21:28:53Z</updated>

		<summary type="html">&lt;p&gt;Sarah: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sarah</name></author>
	</entry>
	<entry>
		<id>https://wiki.appstudio.dev/index.php?title=File:Volt-for-appstudio-users-appdetails.png&amp;diff=9234</id>
		<title>File:Volt-for-appstudio-users-appdetails.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.appstudio.dev/index.php?title=File:Volt-for-appstudio-users-appdetails.png&amp;diff=9234"/>
		<updated>2017-05-26T21:28:33Z</updated>

		<summary type="html">&lt;p&gt;Sarah: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sarah</name></author>
	</entry>
	<entry>
		<id>https://wiki.appstudio.dev/index.php?title=File:Volt-for-appstudio-users-appusers.png&amp;diff=9233</id>
		<title>File:Volt-for-appstudio-users-appusers.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.appstudio.dev/index.php?title=File:Volt-for-appstudio-users-appusers.png&amp;diff=9233"/>
		<updated>2017-05-26T21:28:04Z</updated>

		<summary type="html">&lt;p&gt;Sarah: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sarah</name></author>
	</entry>
	<entry>
		<id>https://wiki.appstudio.dev/index.php?title=File:Volt-for-appstudio-users-dashboard.png&amp;diff=9232</id>
		<title>File:Volt-for-appstudio-users-dashboard.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.appstudio.dev/index.php?title=File:Volt-for-appstudio-users-dashboard.png&amp;diff=9232"/>
		<updated>2017-05-26T21:27:44Z</updated>

		<summary type="html">&lt;p&gt;Sarah: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sarah</name></author>
	</entry>
	<entry>
		<id>https://wiki.appstudio.dev/index.php?title=File:Volt-for-appstudio-users-runmenu.png&amp;diff=9231</id>
		<title>File:Volt-for-appstudio-users-runmenu.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.appstudio.dev/index.php?title=File:Volt-for-appstudio-users-runmenu.png&amp;diff=9231"/>
		<updated>2017-05-26T21:27:22Z</updated>

		<summary type="html">&lt;p&gt;Sarah: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sarah</name></author>
	</entry>
	<entry>
		<id>https://wiki.appstudio.dev/index.php?title=File:Volt-for-appstudio-users-voltprefs.png&amp;diff=9230</id>
		<title>File:Volt-for-appstudio-users-voltprefs.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.appstudio.dev/index.php?title=File:Volt-for-appstudio-users-voltprefs.png&amp;diff=9230"/>
		<updated>2017-05-26T21:26:45Z</updated>

		<summary type="html">&lt;p&gt;Sarah: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sarah</name></author>
	</entry>
	<entry>
		<id>https://wiki.appstudio.dev/index.php?title=File:Logging-in-and-out.png&amp;diff=9229</id>
		<title>File:Logging-in-and-out.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.appstudio.dev/index.php?title=File:Logging-in-and-out.png&amp;diff=9229"/>
		<updated>2017-05-26T21:26:20Z</updated>

		<summary type="html">&lt;p&gt;Sarah: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sarah</name></author>
	</entry>
	<entry>
		<id>https://wiki.appstudio.dev/index.php?title=File:Managing-your-apps-overview.png&amp;diff=9228</id>
		<title>File:Managing-your-apps-overview.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.appstudio.dev/index.php?title=File:Managing-your-apps-overview.png&amp;diff=9228"/>
		<updated>2017-05-26T21:24:46Z</updated>

		<summary type="html">&lt;p&gt;Sarah: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sarah</name></author>
	</entry>
	<entry>
		<id>https://wiki.appstudio.dev/index.php?title=File:Managing-your-users.png&amp;diff=9227</id>
		<title>File:Managing-your-users.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.appstudio.dev/index.php?title=File:Managing-your-users.png&amp;diff=9227"/>
		<updated>2017-05-26T21:23:39Z</updated>

		<summary type="html">&lt;p&gt;Sarah: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sarah</name></author>
	</entry>
	<entry>
		<id>https://wiki.appstudio.dev/index.php?title=File:Registering-a-user.png&amp;diff=9226</id>
		<title>File:Registering-a-user.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.appstudio.dev/index.php?title=File:Registering-a-user.png&amp;diff=9226"/>
		<updated>2017-05-26T21:22:55Z</updated>

		<summary type="html">&lt;p&gt;Sarah: Screenshot of the user registration form.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Screenshot of the user registration form.&lt;/div&gt;</summary>
		<author><name>Sarah</name></author>
	</entry>
	<entry>
		<id>https://wiki.appstudio.dev/index.php?title=File:Resetting-passwords-form.png&amp;diff=9225</id>
		<title>File:Resetting-passwords-form.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.appstudio.dev/index.php?title=File:Resetting-passwords-form.png&amp;diff=9225"/>
		<updated>2017-05-26T21:21:55Z</updated>

		<summary type="html">&lt;p&gt;Sarah: Screenshot of the reset password form&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Screenshot of the reset password form&lt;/div&gt;</summary>
		<author><name>Sarah</name></author>
	</entry>
	<entry>
		<id>https://wiki.appstudio.dev/index.php?title=File:Resetting-passwords-reset.png&amp;diff=9224</id>
		<title>File:Resetting-passwords-reset.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.appstudio.dev/index.php?title=File:Resetting-passwords-reset.png&amp;diff=9224"/>
		<updated>2017-05-26T21:21:11Z</updated>

		<summary type="html">&lt;p&gt;Sarah: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Sarah</name></author>
	</entry>
	<entry>
		<id>https://wiki.appstudio.dev/index.php?title=File:User-confirmation.png&amp;diff=9223</id>
		<title>File:User-confirmation.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.appstudio.dev/index.php?title=File:User-confirmation.png&amp;diff=9223"/>
		<updated>2017-05-26T21:20:29Z</updated>

		<summary type="html">&lt;p&gt;Sarah: Screenshot of confirm page input&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Screenshot of confirm page input&lt;/div&gt;</summary>
		<author><name>Sarah</name></author>
	</entry>
	<entry>
		<id>https://wiki.appstudio.dev/index.php?title=File:Sending-email.png&amp;diff=9222</id>
		<title>File:Sending-email.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.appstudio.dev/index.php?title=File:Sending-email.png&amp;diff=9222"/>
		<updated>2017-05-26T21:19:00Z</updated>

		<summary type="html">&lt;p&gt;Sarah: Screenshot of the email plugin form.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Screenshot of the email plugin form.&lt;/div&gt;</summary>
		<author><name>Sarah</name></author>
	</entry>
	<entry>
		<id>https://wiki.appstudio.dev/index.php?title=File:Managing-your-apps-detail.png&amp;diff=9221</id>
		<title>File:Managing-your-apps-detail.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.appstudio.dev/index.php?title=File:Managing-your-apps-detail.png&amp;diff=9221"/>
		<updated>2017-05-26T21:17:52Z</updated>

		<summary type="html">&lt;p&gt;Sarah: Detailed image of the App Info form on the Volt Dashboard.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Detailed image of the App Info form on the Volt Dashboard.&lt;/div&gt;</summary>
		<author><name>Sarah</name></author>
	</entry>
	<entry>
		<id>https://wiki.appstudio.dev/index.php?title=Error_handling&amp;diff=9220</id>
		<title>Error handling</title>
		<link rel="alternate" type="text/html" href="https://wiki.appstudio.dev/index.php?title=Error_handling&amp;diff=9220"/>
		<updated>2017-05-26T18:12:34Z</updated>

		<summary type="html">&lt;p&gt;Sarah: Instructions on handling various types of errors.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;As much as we&#039;d like to avoid errors, they happen from time to time. When making asynchronous calls using Volt&#039;s [https://docs.voltcloud.io/client/ client library] the callbacks are always of the form: &amp;lt;code&amp;gt;callback(error, data)&amp;lt;/code&amp;gt;. If &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; is [https://developer.mozilla.org/en-US/docs/Glossary/Truthy truthy] it means an error has occurred while making your request. Here are some tips for understanding exactly what has gone wrong.&lt;br /&gt;
&lt;br /&gt;
== The Error Object ==&lt;br /&gt;
&lt;br /&gt;
We&#039;ll start by taking a look at the &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; parameter of the callback. If an error has occurred, it will be a standard [https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error JavaScript Error] object.&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;error&amp;lt;/code&amp;gt; parameter is always guaranteed to have a &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; attribute. In the case of network timeouts and errors, this will be the only attribute set. You might consider using an alert to display this message to the user:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
  $volt.user.get(function (error, data) {&lt;br /&gt;
    if (error) {&lt;br /&gt;
      alert(error.message);&lt;br /&gt;
    } else {&lt;br /&gt;
      alert(&#039;Success!&#039;);&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
  Function userCallback(error, data)&lt;br /&gt;
    If error Then&lt;br /&gt;
      alert(error.message)&lt;br /&gt;
    Else&lt;br /&gt;
      alert(&amp;quot;Success!&amp;quot;)&lt;br /&gt;
    End If&lt;br /&gt;
  End Function&lt;br /&gt;
&lt;br /&gt;
  $volt.user.get(userCallback)&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the [https://docs.voltcloud.io/api/ Volt API] is reachable and responds with an error, an additional parameter is added to the error object: &amp;lt;code&amp;gt;status&amp;lt;/code&amp;gt;. If &amp;lt;code&amp;gt;error.status&amp;lt;/code&amp;gt; is defined, it will be set to the HTTP status code returned by the API. This value can be useful for debugging or logging.&lt;br /&gt;
&lt;br /&gt;
== The Data Object ==&lt;br /&gt;
&lt;br /&gt;
For nearly all API errors, Volt returns an additional data object that gives you more specific information about what has caused the error. At a minimum that object will be of this form:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;type&amp;quot;: &amp;quot;VoltError&amp;quot;,&lt;br /&gt;
    &amp;quot;message&amp;quot;: &amp;quot;Detailed description of the error.&amp;quot;&lt;br /&gt;
  }&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Generally &amp;lt;code&amp;gt;data.message&amp;lt;/code&amp;gt; can be useful to display to an end user whereas &amp;lt;code&amp;gt;data.type&amp;lt;/code&amp;gt; is useful for debugging or logging. We can modify our code above to display &amp;lt;code&amp;gt;data.message&amp;lt;/code&amp;gt; if it&#039;s available:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;JavaScript&amp;quot;&amp;gt;&lt;br /&gt;
  $volt.user.get(function (error, data) {&lt;br /&gt;
    if (error) {&lt;br /&gt;
      if (data) {&lt;br /&gt;
        alert(data.message);&lt;br /&gt;
      } else {&lt;br /&gt;
        alert(error.message);&lt;br /&gt;
      }&lt;br /&gt;
    } else {&lt;br /&gt;
      alert(&#039;Success!&#039;);&lt;br /&gt;
    }&lt;br /&gt;
  });&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;basic&amp;quot;&amp;gt;&lt;br /&gt;
  Function userCallback(error, data)&lt;br /&gt;
    If error Then&lt;br /&gt;
      If data Then&lt;br /&gt;
        alert(data.message)&lt;br /&gt;
      Else&lt;br /&gt;
        alert(error.message)&lt;br /&gt;
      End If&lt;br /&gt;
    Else&lt;br /&gt;
      alert(&amp;quot;Success!&amp;quot;)&lt;br /&gt;
    End If&lt;br /&gt;
  End Function&lt;br /&gt;
&lt;br /&gt;
  $volt.user.get(userCallback)&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Extended Error Data ==&lt;br /&gt;
&lt;br /&gt;
Certain types of Volt errors include additional information in their data object.&lt;br /&gt;
&lt;br /&gt;
=== ValidationError ===&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;ValidationError&amp;lt;/code&amp;gt; occurs when the data you&#039;ve passed in your request is invalid in some way. It may include an additional attribute: &amp;lt;code&amp;gt;validations&amp;lt;/code&amp;gt;. If &amp;lt;code&amp;gt;validations&amp;lt;/code&amp;gt; it truthy, it will be either in the form of a general validation, or a password validation.&lt;br /&gt;
&lt;br /&gt;
==== General Validation Errors ====&lt;br /&gt;
&lt;br /&gt;
For general validation errors, &amp;lt;code&amp;gt;error.validations.body&amp;lt;/code&amp;gt; will be an object of the following form:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;body&amp;quot;: [&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;value&amp;quot;: &amp;quot;notanemail&amp;quot;,&lt;br /&gt;
        &amp;quot;property&amp;quot;: &amp;quot;request.body.email&amp;quot;,&lt;br /&gt;
        &amp;quot;messages&amp;quot;: [&lt;br /&gt;
          &amp;quot;does not conform to the \&amp;quot;email\&amp;quot; format&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
      },&lt;br /&gt;
      {&lt;br /&gt;
        &amp;quot;property&amp;quot;: &amp;quot;request.body&amp;quot;,&lt;br /&gt;
        &amp;quot;messages&amp;quot;: [&lt;br /&gt;
          &amp;quot;requires property \&amp;quot;password\&amp;quot;&amp;quot;&lt;br /&gt;
        ]&lt;br /&gt;
      }&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The above response was generated from the following invalid call: &amp;lt;code&amp;gt;$volt.auth.register(&#039;notanemail, undefined, &#039;does not match&#039;, callback);&amp;lt;c/ode&amp;gt;. If &amp;lt;code&amp;gt;error.validations.body&amp;lt;/code&amp;gt; exists, it will be an array of objects. Each object will have at a minimum &amp;lt;code&amp;gt;property&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;messages&amp;lt;/code&amp;gt; attributes. Some will also have a &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; attribute.&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;property&amp;lt;/code&amp;gt; - the property that failed validation. You can ignore the &amp;lt;code&amp;gt;request.body&amp;lt;/code&amp;gt; portion. In the case that the property is exactly equal to &amp;lt;code&amp;gt;request.body&amp;lt;/code&amp;gt; it indicates a problem with the entire request.&lt;br /&gt;
* &amp;lt;code&amp;gt;messages&amp;lt;/code&amp;gt; - an array of messages describing why validation failed.&lt;br /&gt;
* &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; - the value that failed validation, if applicable.&lt;br /&gt;
&lt;br /&gt;
Generally, you will want to perform client side validation and not depend on only server side validation. However, the above data structure can provide valuable insight into why your requests are failing.&lt;br /&gt;
&lt;br /&gt;
==== Password Validation Errors ====&lt;br /&gt;
&lt;br /&gt;
For invalid passwords, &amp;lt;code&amp;gt;error.validations.password&amp;lt;/code&amp;gt; is an array of messages indicating which validations were failed by the password:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;json&amp;quot;&amp;gt;&lt;br /&gt;
  {&lt;br /&gt;
    &amp;quot;password&amp;quot;: [&lt;br /&gt;
      &amp;quot;The password must be at least 10 characters long.&amp;quot;,&lt;br /&gt;
      &amp;quot;The password must contain at least one uppercase letter.&amp;quot;,&lt;br /&gt;
      &amp;quot;The password must contain at least one number.&amp;quot;,&lt;br /&gt;
      &amp;quot;The password must contain at least one special character.&amp;quot;&lt;br /&gt;
    ]&lt;br /&gt;
  }&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== ConflictError ===&lt;br /&gt;
&lt;br /&gt;
A &amp;lt;code&amp;gt;ConflictError&amp;lt;/code&amp;gt; occurs when your request would cause a conflict, for instance if you attempt to register using an email address that&#039;s already in use. It includes an additional attribute, &amp;lt;code&amp;gt;conflict&amp;lt;/code&amp;gt;, that includes an identifier of the existing object that would be in conflict. This is generally useful for debugging.&lt;br /&gt;
&lt;br /&gt;
=== UnknownClientError ===&lt;br /&gt;
&lt;br /&gt;
It&#039;s rare that you&#039;ll see an &amp;lt;code&amp;gt;UnknownClientError&amp;lt;/code&amp;gt;. It generally means something was wrong with your request to the API. It includes an additional attribute in the data object: &amp;lt;code&amp;gt;detail&amp;lt;/code&amp;gt;. This may provide additional detail as to why the error occurred.&lt;/div&gt;</summary>
		<author><name>Sarah</name></author>
	</entry>
	<entry>
		<id>https://wiki.appstudio.dev/index.php?title=First_app&amp;diff=9161</id>
		<title>First app</title>
		<link rel="alternate" type="text/html" href="https://wiki.appstudio.dev/index.php?title=First_app&amp;diff=9161"/>
		<updated>2017-05-18T20:20:49Z</updated>

		<summary type="html">&lt;p&gt;Sarah: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Volt is designed to require very little code to get started. Currently, there are two ways to create and upload an app:&lt;br /&gt;
&lt;br /&gt;
# From the &amp;quot;Your Apps&amp;quot; page in the [https://dashboard.voltcloud.io dashboard] click on &amp;quot;+ Add App&amp;quot;. Once your App has been created, you can click on the &amp;quot;Upload&amp;quot; button on the &amp;quot;App Information&amp;quot; page. This will prompt you to upload a zip file of your app.&lt;br /&gt;
# You can upload any app you create in [[Faq#AppStudio_Users|AppStudio]].&lt;br /&gt;
&lt;br /&gt;
We&#039;re working to allow apps to be uploaded and deployed using a wide variety of common tools.&lt;br /&gt;
&lt;br /&gt;
== Initializing ==&lt;br /&gt;
&lt;br /&gt;
Once you&#039;ve created a new app and obtained your app ID from the Dashboard, you can create your first Volt app. The following example shows the simplest functioning app you could create:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot; highlight=&amp;quot;9,10,11,12,13&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
  &amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Volt Example&amp;lt;/volt&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;It doesn&#039;t get much simpler than this!&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;/api/client/volt.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
      var appId = &#039;abc123&#039;;&lt;br /&gt;
      $volt.init(appId);&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/html&amp;gt;&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The highlighted section of this example is the most important. It shows two sets of script tags:&lt;br /&gt;
&lt;br /&gt;
# The first script tag includes the Volt [https://docs.voltcloud.io/client/ client library]. The library will always be available at this location when your app is hosted on the Volt server.&lt;br /&gt;
# The second script tag initializes your app. Every app has an ID, and you must initialize volt with your app ID before you can use the client library to make further Volt calls.&lt;br /&gt;
&lt;br /&gt;
== For AppStudio Users ==&lt;br /&gt;
&lt;br /&gt;
AppStudio is tightly integrated with Volt, making it easy to upload, run and manage your apps.&lt;br /&gt;
&lt;br /&gt;
=== Uploading to Volt ===&lt;br /&gt;
&lt;br /&gt;
On the Run menu, choose &amp;quot;Deploy to Volt&amp;quot;. Your app will be uploaded to Volt and the URL to run it will be displayed. The Volt AppId will be placed in your [[Properties_Window|Project Properties]].&lt;br /&gt;
&lt;br /&gt;
=== Managing your App ===&lt;br /&gt;
&lt;br /&gt;
If you have subscribed to AppStudio and have entered a Volt password, you can use the Volt [https://dashboard.voltcloud.io/ Dashboard] to [[Manage_apps|manage your apps]].&lt;br /&gt;
&lt;br /&gt;
You can open the Dashboard at [https://dashboard.voltcloud.io/ https://dashboard.voltcloud.io/] or from the AppStudio [[Menu_Options|Run menu]].&lt;br /&gt;
&lt;br /&gt;
=== Managing your Volt Account ===&lt;br /&gt;
&lt;br /&gt;
If you have [https://www.nsbasic.com/i/Subscription/ subscribed] to AppStudio on any of the plans (including the free demo), you&#039;re entitled to deploy to Volt from the AppStudio Run menu.&lt;br /&gt;
&lt;br /&gt;
To use the [https://dashboard.voltcloud.io/ Dashboard], you&#039;ll need a Volt account. If you have a Starter, Essential or Pro subscription, you&#039;re entitled to a free Volt account. Reply to the registration confirmation email by setting up a password and you&#039;ll be allowed to use it.&lt;br /&gt;
&lt;br /&gt;
You can also set up a Volt account from the AppStudio Run menu or from [[Preferences|Volt Preferences]].&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
&lt;br /&gt;
* JavaScript API: [https://docs.voltcloud.io/client/$volt.html#.init https://docs.voltcloud.io/client/$volt.html#.init]&lt;/div&gt;</summary>
		<author><name>Sarah</name></author>
	</entry>
	<entry>
		<id>https://wiki.appstudio.dev/index.php?title=First_app&amp;diff=9160</id>
		<title>First app</title>
		<link rel="alternate" type="text/html" href="https://wiki.appstudio.dev/index.php?title=First_app&amp;diff=9160"/>
		<updated>2017-05-18T20:19:42Z</updated>

		<summary type="html">&lt;p&gt;Sarah: Tutorial for creating, initializing, and deploying your first Volt app&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Volt is designed to require very little code to get started. Currently, there are two ways to create and upload an app:&lt;br /&gt;
&lt;br /&gt;
1. From the &amp;quot;Your Apps&amp;quot; page in the [https://dashboard.voltcloud.io dashboard] click on &amp;quot;+ Add App&amp;quot;. Once your App has been created, you can click on the &amp;quot;Upload&amp;quot; button on the &amp;quot;App Information&amp;quot; page. This will prompt you to upload a zip file of your app.&lt;br /&gt;
2. You can upload any app you create in [[Faq#AppStudio_Users|AppStudio]].&lt;br /&gt;
&lt;br /&gt;
We&#039;re working to allow apps to be uploaded and deployed using a wide variety of common tools.&lt;br /&gt;
&lt;br /&gt;
== Initializing ==&lt;br /&gt;
&lt;br /&gt;
Once you&#039;ve created a new app and obtained your app ID from the Dashboard, you can create your first Volt app. The following example shows the simplest functioning app you could create:&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;syntaxhighlight lang=&amp;quot;html&amp;quot; highlight=&amp;quot;9,10,11,12,13&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
  &amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;Volt Example&amp;lt;/volt&amp;gt;&lt;br /&gt;
  &amp;lt;/head&amp;gt;&lt;br /&gt;
  &amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;p&amp;gt;It doesn&#039;t get much simpler than this!&amp;lt;/p&amp;gt;&lt;br /&gt;
    &amp;lt;script src=&amp;quot;/api/client/volt.min.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
      var appId = &#039;abc123&#039;;&lt;br /&gt;
      $volt.init(appId);&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
  &amp;lt;/body&amp;gt;&lt;br /&gt;
  &amp;lt;/html&amp;gt;&lt;br /&gt;
  &amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The highlighted section of this example is the most important. It shows two sets of script tags:&lt;br /&gt;
&lt;br /&gt;
1. The first script tag includes the Volt [https://docs.voltcloud.io/client/ client library]. The library will always be available at this location when your app is hosted on the Volt server.&lt;br /&gt;
2. The second script tag initializes your app. Every app has an ID, and you must initialize volt with your app ID before you can use the client library to make further Volt calls.&lt;br /&gt;
&lt;br /&gt;
== For AppStudio Users ==&lt;br /&gt;
&lt;br /&gt;
AppStudio is tightly integrated with Volt, making it easy to upload, run and manage your apps.&lt;br /&gt;
&lt;br /&gt;
=== Uploading to Volt ===&lt;br /&gt;
&lt;br /&gt;
On the Run menu, choose &amp;quot;Deploy to Volt&amp;quot;. Your app will be uploaded to Volt and the URL to run it will be displayed. The Volt AppId will be placed in your [[Properties_Window|Project Properties]].&lt;br /&gt;
&lt;br /&gt;
=== Managing your App ===&lt;br /&gt;
&lt;br /&gt;
If you have subscribed to AppStudio and have entered a Volt password, you can use the Volt [https://dashboard.voltcloud.io/ Dashboard] to [[Manage_apps|manage your apps]].&lt;br /&gt;
&lt;br /&gt;
You can open the Dashboard at [https://dashboard.voltcloud.io/ https://dashboard.voltcloud.io/] or from the AppStudio [[Menu_Options|Run menu]].&lt;br /&gt;
&lt;br /&gt;
=== Managing your Volt Account ===&lt;br /&gt;
&lt;br /&gt;
If you have [https://www.nsbasic.com/i/Subscription/ subscribed] to AppStudio on any of the plans (including the free demo), you&#039;re entitled to deploy to Volt from the AppStudio Run menu.&lt;br /&gt;
&lt;br /&gt;
To use the [https://dashboard.voltcloud.io/ Dashboard], you&#039;ll need a Volt account. If you have a Starter, Essential or Pro subscription, you&#039;re entitled to a free Volt account. Reply to the registration confirmation email by setting up a password and you&#039;ll be allowed to use it.&lt;br /&gt;
&lt;br /&gt;
You can also set up a Volt account from the AppStudio Run menu or from [[Preferences|Volt Preferences]].&lt;br /&gt;
&lt;br /&gt;
== Reference ==&lt;br /&gt;
&lt;br /&gt;
* JavaScript API: [https://docs.voltcloud.io/client/$volt.html#.init https://docs.voltcloud.io/client/$volt.html#.init]&lt;/div&gt;</summary>
		<author><name>Sarah</name></author>
	</entry>
	<entry>
		<id>https://wiki.appstudio.dev/index.php?title=Faq&amp;diff=9158</id>
		<title>Faq</title>
		<link rel="alternate" type="text/html" href="https://wiki.appstudio.dev/index.php?title=Faq&amp;diff=9158"/>
		<updated>2017-05-18T18:45:27Z</updated>

		<summary type="html">&lt;p&gt;Sarah: /* Does it cost extra to use Volt? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== General ==&lt;br /&gt;
&lt;br /&gt;
=== What is Volt? ===&lt;br /&gt;
Volt is a platform to electrify your web apps! It provides simple hosting and extended services for your web and mobile apps via an easy to use interface to deploy your apps, and custom names using full HTTPS on a fast, stable platform.&lt;br /&gt;
&lt;br /&gt;
Extended services currently include user management and server storage. We would like to offer a steady stream of additional services, and would like to hear from you about what services would make your experience using Volt better! [mailto:support@nsbasic.com Let us know what you&#039;re interested in!]&lt;br /&gt;
&lt;br /&gt;
=== How safe is my data? ===&lt;br /&gt;
&lt;br /&gt;
The safety of your data is top priority to us! Your data is backed up by a reliable and redundant on-site solution, and hard drive failures are tolerated by utilizing [https://en.wikipedia.org/wiki/RAID RAID] across many drives.&lt;br /&gt;
&lt;br /&gt;
Additionally, the Volt server is built on industry standard technology - updates and security advisories are installed on a continuous basis.&lt;br /&gt;
&lt;br /&gt;
=== What does it cost to use? ===&lt;br /&gt;
&lt;br /&gt;
There is no initial cost to use Volt. Several tiered service plans will be available depending on your needs, but we expect there will always be a free plan.&lt;br /&gt;
&lt;br /&gt;
=== Can I host my apps on it? ===&lt;br /&gt;
&lt;br /&gt;
Yes. When you deploy your app to Volt, we take care of the rest. No worries about security certificates, MIME type configuration, updating servers or maintaining the server stack. &lt;br /&gt;
&lt;br /&gt;
=== I used to host my web app on Dropbox. Can I use Volt instead? ===&lt;br /&gt;
&lt;br /&gt;
Yes, Volt is designed to be the optimal server for web apps!&lt;br /&gt;
&lt;br /&gt;
Dropbox announced that on Oct 3, 2016, [https://www.dropbox.com/help/files-folders/public-folder they will no longer allow content to display in-browser]. Acting as a web server isn’t what they wanted to do.&lt;br /&gt;
&lt;br /&gt;
=== Can I run PHP on Volt? ===&lt;br /&gt;
&lt;br /&gt;
We are moving away from the use of PHP because it can be tricky, especially for new users, and it&#039;s a chore to set up and maintain. Volt is designed to have many of the same features you get using PHP, but in a vastly easier-to-use environment!&lt;br /&gt;
&lt;br /&gt;
=== I need a custom service. Can I talk to you about it? ===&lt;br /&gt;
&lt;br /&gt;
Yes. Drop us a line at [mailto:support@nsbasic.com support@nsbasic.com]. If we think your idea might be useful to other users (and you don’t mind), we’ll even give you a break on the dev costs!&lt;br /&gt;
&lt;br /&gt;
=== Volt calls my app https://mygreatapp.volt.live. Can I use my own URL? ===&lt;br /&gt;
&lt;br /&gt;
This service will be available soon. You will be able to use a URL of your choice (like https://mygreatapp.com), so long as you control the domain. &lt;br /&gt;
&lt;br /&gt;
While some setup will be needed to use this service, the result will be that your apps will look like they originate from your website, but are actually served by Volt.&lt;br /&gt;
&lt;br /&gt;
=== Are there any restrictions on what I can do with Volt? ===&lt;br /&gt;
&lt;br /&gt;
Nearly any legal use is acceptable. You can learn more from our [https://www.nsbasic.com/app/AppStudioTOS.txt terms of service].&lt;br /&gt;
&lt;br /&gt;
=== Who can use it? ===&lt;br /&gt;
&lt;br /&gt;
Initially, just AppStudio users. However, you can [mailto:support@nsbasic.com contact us] to request early access if you&#039;re not an AppStudio user. Note that the service is just launching and we&#039;re still likely to make changes to it.&lt;br /&gt;
&lt;br /&gt;
== AppStudio Users ==&lt;br /&gt;
&lt;br /&gt;
=== How is this different from the AppStudio Server (nsbapp.com)? ===&lt;br /&gt;
&lt;br /&gt;
The AppStudio Server was designed to help with development, but not permanent hosting. Volt is a permanent hosting solution. It provides all the tools you need to either host your app, or provide a backend for a hybrid app or existing server.&lt;br /&gt;
&lt;br /&gt;
=== Can I continue to use the AppStudio Server? ===&lt;br /&gt;
&lt;br /&gt;
If you are on AppStudio 5 or older, the AppStudio server will continue to work until May 1st, 2017. AppStudio 6 always uses Volt.&lt;br /&gt;
&lt;br /&gt;
=== How do I sign up for Volt? ===&lt;br /&gt;
&lt;br /&gt;
Volt is free with your [https://www.nsbasic.com/i/Subscription/ subscription] to AppStudio 6! By subscribing you’ll receive continual updates to AppStudio, plus access to Volt Essential - our new cloud services platform built from the ground up to work with AppStudio.&lt;br /&gt;
&lt;br /&gt;
If you are using a demo of AppStudio 6, you are able to sign up at our Starter level for free by clicking on the “Run” menu and choosing “Sign-up/Sign-in to Volt”.&lt;br /&gt;
&lt;br /&gt;
=== Why has AppStudio switched to subscription billing? ===&lt;br /&gt;
&lt;br /&gt;
In order to continue providing you with the innovative, high quality product you are used to, AppStudio has transitioned to a subscription billing. This transition will not only allow us to continue making AppStudio more useful to you, but also allow us to provide tight integration with a cloud service provider built from the ground up for AppStudio - namely Volt.&lt;br /&gt;
&lt;br /&gt;
=== Can I use Volt with AppStudio 5? ===&lt;br /&gt;
&lt;br /&gt;
No. AppStudio 5 does not have the interfaces required. AppStudio 5 is only designed to work with AppStudio Server.&lt;br /&gt;
&lt;br /&gt;
=== Does it cost extra to use Volt? ===&lt;br /&gt;
&lt;br /&gt;
If you purchase a subscription to AppStudio, then Volt is free for the duration of your subscription. We highly suggest purchasing a subscription to get the most out of AppStudio and Volt. &lt;br /&gt;
&lt;br /&gt;
A limited version of Volt for free with the AppStudio 6 demo.&lt;br /&gt;
&lt;br /&gt;
=== When I try to reset my password I get a message &amp;quot;Unauthorized&amp;quot;. What do I do? ===&lt;br /&gt;
&lt;br /&gt;
Account activation expires after an hour. Fortunately, getting a new link is easy:&lt;br /&gt;
&lt;br /&gt;
1. Navigate to [https://dashboard.voltcloud.io/](https://dashboard.voltcloud.io/)&lt;br /&gt;
2. Click on “Forgot your password?”&lt;br /&gt;
3. Enter in the email address you registered with.&lt;br /&gt;
4. A new email should arrive shortly.&lt;/div&gt;</summary>
		<author><name>Sarah</name></author>
	</entry>
	<entry>
		<id>https://wiki.appstudio.dev/index.php?title=Faq&amp;diff=9157</id>
		<title>Faq</title>
		<link rel="alternate" type="text/html" href="https://wiki.appstudio.dev/index.php?title=Faq&amp;diff=9157"/>
		<updated>2017-05-18T18:42:04Z</updated>

		<summary type="html">&lt;p&gt;Sarah: Frequently asked questions about Volt.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== General ==&lt;br /&gt;
&lt;br /&gt;
=== What is Volt? ===&lt;br /&gt;
Volt is a platform to electrify your web apps! It provides simple hosting and extended services for your web and mobile apps via an easy to use interface to deploy your apps, and custom names using full HTTPS on a fast, stable platform.&lt;br /&gt;
&lt;br /&gt;
Extended services currently include user management and server storage. We would like to offer a steady stream of additional services, and would like to hear from you about what services would make your experience using Volt better! [mailto:support@nsbasic.com Let us know what you&#039;re interested in!]&lt;br /&gt;
&lt;br /&gt;
=== How safe is my data? ===&lt;br /&gt;
&lt;br /&gt;
The safety of your data is top priority to us! Your data is backed up by a reliable and redundant on-site solution, and hard drive failures are tolerated by utilizing [https://en.wikipedia.org/wiki/RAID RAID] across many drives.&lt;br /&gt;
&lt;br /&gt;
Additionally, the Volt server is built on industry standard technology - updates and security advisories are installed on a continuous basis.&lt;br /&gt;
&lt;br /&gt;
=== What does it cost to use? ===&lt;br /&gt;
&lt;br /&gt;
There is no initial cost to use Volt. Several tiered service plans will be available depending on your needs, but we expect there will always be a free plan.&lt;br /&gt;
&lt;br /&gt;
=== Can I host my apps on it? ===&lt;br /&gt;
&lt;br /&gt;
Yes. When you deploy your app to Volt, we take care of the rest. No worries about security certificates, MIME type configuration, updating servers or maintaining the server stack. &lt;br /&gt;
&lt;br /&gt;
=== I used to host my web app on Dropbox. Can I use Volt instead? ===&lt;br /&gt;
&lt;br /&gt;
Yes, Volt is designed to be the optimal server for web apps!&lt;br /&gt;
&lt;br /&gt;
Dropbox announced that on Oct 3, 2016, [https://www.dropbox.com/help/files-folders/public-folder they will no longer allow content to display in-browser]. Acting as a web server isn’t what they wanted to do.&lt;br /&gt;
&lt;br /&gt;
=== Can I run PHP on Volt? ===&lt;br /&gt;
&lt;br /&gt;
We are moving away from the use of PHP because it can be tricky, especially for new users, and it&#039;s a chore to set up and maintain. Volt is designed to have many of the same features you get using PHP, but in a vastly easier-to-use environment!&lt;br /&gt;
&lt;br /&gt;
=== I need a custom service. Can I talk to you about it? ===&lt;br /&gt;
&lt;br /&gt;
Yes. Drop us a line at [mailto:support@nsbasic.com support@nsbasic.com]. If we think your idea might be useful to other users (and you don’t mind), we’ll even give you a break on the dev costs!&lt;br /&gt;
&lt;br /&gt;
=== Volt calls my app https://mygreatapp.volt.live. Can I use my own URL? ===&lt;br /&gt;
&lt;br /&gt;
This service will be available soon. You will be able to use a URL of your choice (like https://mygreatapp.com), so long as you control the domain. &lt;br /&gt;
&lt;br /&gt;
While some setup will be needed to use this service, the result will be that your apps will look like they originate from your website, but are actually served by Volt.&lt;br /&gt;
&lt;br /&gt;
=== Are there any restrictions on what I can do with Volt? ===&lt;br /&gt;
&lt;br /&gt;
Nearly any legal use is acceptable. You can learn more from our [https://www.nsbasic.com/app/AppStudioTOS.txt terms of service].&lt;br /&gt;
&lt;br /&gt;
=== Who can use it? ===&lt;br /&gt;
&lt;br /&gt;
Initially, just AppStudio users. However, you can [mailto:support@nsbasic.com contact us] to request early access if you&#039;re not an AppStudio user. Note that the service is just launching and we&#039;re still likely to make changes to it.&lt;br /&gt;
&lt;br /&gt;
== AppStudio Users ==&lt;br /&gt;
&lt;br /&gt;
=== How is this different from the AppStudio Server (nsbapp.com)? ===&lt;br /&gt;
&lt;br /&gt;
The AppStudio Server was designed to help with development, but not permanent hosting. Volt is a permanent hosting solution. It provides all the tools you need to either host your app, or provide a backend for a hybrid app or existing server.&lt;br /&gt;
&lt;br /&gt;
=== Can I continue to use the AppStudio Server? ===&lt;br /&gt;
&lt;br /&gt;
If you are on AppStudio 5 or older, the AppStudio server will continue to work until May 1st, 2017. AppStudio 6 always uses Volt.&lt;br /&gt;
&lt;br /&gt;
=== How do I sign up for Volt? ===&lt;br /&gt;
&lt;br /&gt;
Volt is free with your [https://www.nsbasic.com/i/Subscription/ subscription] to AppStudio 6! By subscribing you’ll receive continual updates to AppStudio, plus access to Volt Essential - our new cloud services platform built from the ground up to work with AppStudio.&lt;br /&gt;
&lt;br /&gt;
If you are using a demo of AppStudio 6, you are able to sign up at our Starter level for free by clicking on the “Run” menu and choosing “Sign-up/Sign-in to Volt”.&lt;br /&gt;
&lt;br /&gt;
=== Why has AppStudio switched to subscription billing? ===&lt;br /&gt;
&lt;br /&gt;
In order to continue providing you with the innovative, high quality product you are used to, AppStudio has transitioned to a subscription billing. This transition will not only allow us to continue making AppStudio more useful to you, but also allow us to provide tight integration with a cloud service provider built from the ground up for AppStudio - namely Volt.&lt;br /&gt;
&lt;br /&gt;
=== Can I use Volt with AppStudio 5? ===&lt;br /&gt;
&lt;br /&gt;
No. AppStudio 5 does not have the interfaces required. AppStudio 5 is only designed to work with AppStudio Server.&lt;br /&gt;
&lt;br /&gt;
=== Does it cost extra to use Volt? ===&lt;br /&gt;
&lt;br /&gt;
If you purchase a subscription to AppStudio, then Volt is free for the duration of your subscription. We highly suggest purchasing a subscription to get the most out of AppStudio and Volt. &lt;br /&gt;
&lt;br /&gt;
A limited version of Volt can be used without a subscription to AppStudio.&lt;br /&gt;
&lt;br /&gt;
=== When I try to reset my password I get a message &amp;quot;Unauthorized&amp;quot;. What do I do? ===&lt;br /&gt;
&lt;br /&gt;
Account activation expires after an hour. Fortunately, getting a new link is easy:&lt;br /&gt;
&lt;br /&gt;
1. Navigate to [https://dashboard.voltcloud.io/](https://dashboard.voltcloud.io/)&lt;br /&gt;
2. Click on “Forgot your password?”&lt;br /&gt;
3. Enter in the email address you registered with.&lt;br /&gt;
4. A new email should arrive shortly.&lt;/div&gt;</summary>
		<author><name>Sarah</name></author>
	</entry>
	<entry>
		<id>https://wiki.appstudio.dev/index.php?title=Volt_Documentation&amp;diff=9149</id>
		<title>Volt Documentation</title>
		<link rel="alternate" type="text/html" href="https://wiki.appstudio.dev/index.php?title=Volt_Documentation&amp;diff=9149"/>
		<updated>2017-05-13T04:45:12Z</updated>

		<summary type="html">&lt;p&gt;Sarah: Landing page for all Volt documentation and support articles&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Volt is a platform to electrify your web apps. It provides simple hosting and extended services for your web and mobile apps. As a web host, it provides an easy to use interface to deploy apps, custom names using full HTTPS on a fast, stable platform.&lt;br /&gt;
&lt;br /&gt;
Extended services like user management and server storage are available.&lt;br /&gt;
&lt;br /&gt;
== Getting Started ==&lt;br /&gt;
* [[faq|Frequently Asked Questions]]&lt;br /&gt;
* [[first_app|Your First Volt App]]&lt;br /&gt;
* [[error_handling|Handling Errors]]&lt;br /&gt;
&lt;br /&gt;
== Authentication ==&lt;br /&gt;
* [[user_confirmation|User Confirmation]]&lt;br /&gt;
* [[resetting_passwords|Resetting Passwords]]&lt;br /&gt;
* [[user_registration|Register a User]]&lt;br /&gt;
* [[log_in|Logging In (and Out)]]&lt;br /&gt;
&lt;br /&gt;
== Users ==&lt;br /&gt;
* [[current_user|Working with the Current User]]&lt;br /&gt;
* [[manage_users|Managing Your Users]]&lt;br /&gt;
&lt;br /&gt;
== Apps ==&lt;br /&gt;
* [[manage_apps|Managing Your Apps]]&lt;br /&gt;
&lt;br /&gt;
== Services ==&lt;br /&gt;
* [[server_storage|Server Storage]]&lt;br /&gt;
* [[app_storage|App Storage]]&lt;br /&gt;
* [[send_email|Sending Email]]&lt;br /&gt;
&lt;br /&gt;
== AppStudio ==&lt;br /&gt;
* [[volt_for_appstudio|Volt for AppStudio Users]]&lt;/div&gt;</summary>
		<author><name>Sarah</name></author>
	</entry>
</feed>