<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Deployment &#8211; Xojo Programming Blog</title>
	<atom:link href="https://blog.xojo.com/tag/deployment/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.xojo.com</link>
	<description>Blog about the Xojo programming language and IDE</description>
	<lastBuildDate>Mon, 18 Aug 2025 20:37:15 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>
	<item>
		<title>Deploy Xojo Web Apps with Caddy Reverse Proxy</title>
		<link>https://blog.xojo.com/2025/08/04/deploy-xojo-web-apps-with-caddy-reverse-proxy/</link>
		
		<dc:creator><![CDATA[Gabriel Ludosanu]]></dc:creator>
		<pubDate>Mon, 04 Aug 2025 18:45:28 +0000</pubDate>
				<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Deployment]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[Xojo Web]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=15201</guid>

					<description><![CDATA[Deploying Xojo web applications offers developers flexible pathways to production. For devs prioritizing minimal infrastructure management,&#160;Xojo Cloud&#160;provides a fully-managed solution with automatic scaling, SSL, and&#8230;]]></description>
										<content:encoded><![CDATA[
<p>Deploying Xojo web applications offers developers flexible pathways to production. For devs prioritizing minimal infrastructure management,&nbsp;<a href="https://www.xojo.com/cloud/" target="_blank" rel="noreferrer noopener">Xojo Cloud</a>&nbsp;provides a fully-managed solution with automatic scaling, SSL, and zero-server-maintenance. However, for developers requiring granular control over their deployment environment, implementing a reverse proxy like <a href="https://caddyserver.com/" data-type="link" data-id="https://caddyserver.com/" target="_blank" rel="noreferrer noopener">Caddy</a> delivers enterprise-grade performance while simplifying critical operations.</p>



<p>This guide focuses on production-ready Caddy configurations that streamline deployments for self-managed Xojo applications, delivering:</p>



<ul class="wp-block-list">
<li>Automated TLS certificate management</li>



<li>Native load balancing between instances</li>



<li>Simplified configuration compared to traditional proxies</li>



<li>Header optimizations specifically tuned for Xojo’s framework</li>
</ul>



<p>You’ll learn configuration strategies that <em>in some benchmarks, can have resource savings as high as 40%</em> over conventional proxies while maintaining Xojo’s signature performance characteristics.</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Core Configuration Strategies</h3>



<p><strong>Basic Reverse Proxy Setup</strong></p>



<pre class="wp-block-code"><code>yourdomain.com {
    # Connect to Xojo application
    reverse_proxy localhost:8080 {
        # Preserve client information
        header_up X-Forwarded-For {http.request.remote.host}
        header_up Host {http.request.host}
    }
    
    # Automate HTTPS
    tls admin@yourdomain.com
}</code></pre>



<p><em>Note: The&nbsp;<code>header_up</code>&nbsp;directives ensure Xojo correctly logs client IPs in web events</em></p>



<p><strong>Load Balancing Across Instances</strong></p>



<pre class="wp-block-code"><code>app.yourdomain.com {
    reverse_proxy localhost:8080 localhost:8081 localhost:8082 {
        load_balancer {
            policy round_robin
            health_interval 10s
            health_uri /health
        }
        # Timeouts for heavy processing
        lb_try_duration 30s
    }
}</code></pre>



<p><strong>Security Hardening Measures</strong></p>



<pre class="wp-block-code"><code>yourdomain.com { 
	# Critical protection headers 
	header { 
		X-Content-Type-Options "nosniff" 
		X-Frame-Options "DENY" 
		Content-Security-Policy "default-src 'self'" 
	} 

	# Rate limiting for API endpoints 
	route /api/* { 
		rate_limit { 
			zone api 
			burst 100 
			period 10s 
		} 
	} 
}</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Production-Ready Deployment Scripts</h3>



<p><strong>Linux Systemd Service</strong><br><code>/etc/systemd/system/xojo-caddy.service</code>:</p>



<pre class="wp-block-code"><code>&#91;Unit]
Description=Xojo Caddy Reverse Proxy
After=network.target

&#91;Service]
Type=simple
User=caddy
ExecStart=/usr/bin/caddy run --config /etc/caddy/Caddyfile
Restart=on-failure
RestartSec=5

&#91;Install]
WantedBy=multi-user.target</code></pre>



<p>For a broader, step-by-step guide on preparing your server, please see our foundational tutorial:&nbsp;<a href="https://blog.xojo.com/2021/05/28/tutorial-deploying-web-apps-on-linux/" target="_blank" rel="noreferrer noopener">Tutorial: Deploying Web Apps on Linux</a>. The&nbsp;<code>systemd</code>&nbsp;service above integrates perfectly into that workflow.</p>



<p><strong>Windows Deployment Package</strong><br><code>Xojo-Caddy.bat</code>:</p>



<pre class="wp-block-code"><code>@echo off
REM Start Xojo application instances
start "Xojo Instance 1" /MIN XojoWebApp.exe --port=8080
start "Xojo Instance 2" /MIN XojoWebApp.exe --port=8081

REM Launch Caddy reverse proxy
start "Caddy Proxy" /MIN caddy.exe run --config C:\caddy\Caddyfile</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p><strong>Optimized Xojo-Caddy Template</strong><br>Save as&nbsp;<code>Caddyfile</code>&nbsp;in your deployment root:</p>



<pre class="wp-block-code"><code># Production-Grade Xojo Proxy Template
yourdomain.com, www.yourdomain.com {
    # Automated HTTPS
    tls contact@yourdomain.com
    
    # Primary app routing
    reverse_proxy localhost:8080 localhost:8081 {
        header_up X-Forwarded-Proto https
        header_up X-Real-IP {http.request.remote}
    }
    
    # Static content handling
    handle /static/* {
        root * /var/www/static
        file_server
    }
    
    # Security headers
    header {
        Strict-Transport-Security "max-age=31536000"
        Referrer-Policy "strict-origin-when-cross-origin"
    }
}</code></pre>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">Conclusion</h3>



<p>Caddy eliminates proxy complexity while delivering enterprise capabilities:</p>



<ol class="wp-block-list">
<li><strong>Simplified Operations</strong>: Single configuration file replaces complex proxy setups</li>



<li><strong>Automatic Security</strong>: Continuous HTTPS protection without maintenance</li>



<li><strong>Effortless Scaling</strong>: Built-in load balancing grows with your user base</li>



<li><strong>Reduced Overhead</strong>: 40% fewer resources than traditional proxies in benchmarks</li>
</ol>



<p>Implement the provided Xojo-Caddy template to achieve production-grade deployment in under 15 minutes. Monitor performance via Caddy’s built-in&nbsp;<code>/metrics</code>&nbsp;endpoint and scale horizontally as traffic increases.</p>



<p><em>Gabriel is a digital marketing enthusiast who loves coding with Xojo to create cool software tools for any platform. He is always eager to learn and share new ideas!</em></p>



<ul class="wp-block-social-links has-normal-icon-size is-content-justification-center is-layout-flex wp-container-core-social-links-is-layout-16018d1d wp-block-social-links-is-layout-flex"><li class="wp-social-link wp-social-link-facebook  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.facebook.com/goxojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12 2C6.5 2 2 6.5 2 12c0 5 3.7 9.1 8.4 9.9v-7H7.9V12h2.5V9.8c0-2.5 1.5-3.9 3.8-3.9 1.1 0 2.2.2 2.2.2v2.5h-1.3c-1.2 0-1.6.8-1.6 1.6V12h2.8l-.4 2.9h-2.3v7C18.3 21.1 22 17 22 12c0-5.5-4.5-10-10-10z"></path></svg><span class="wp-block-social-link-label screen-reader-text">Facebook</span></a></li>

<li class="wp-social-link wp-social-link-x  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://x.com/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M13.982 10.622 20.54 3h-1.554l-5.693 6.618L8.745 3H3.5l6.876 10.007L3.5 21h1.554l6.012-6.989L15.868 21h5.245l-7.131-10.378Zm-2.128 2.474-.697-.997-5.543-7.93H8l4.474 6.4.697.996 5.815 8.318h-2.387l-4.745-6.787Z" /></svg><span class="wp-block-social-link-label screen-reader-text">X</span></a></li>

<li class="wp-social-link wp-social-link-linkedin  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.linkedin.com/company/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M19.7,3H4.3C3.582,3,3,3.582,3,4.3v15.4C3,20.418,3.582,21,4.3,21h15.4c0.718,0,1.3-0.582,1.3-1.3V4.3 C21,3.582,20.418,3,19.7,3z M8.339,18.338H5.667v-8.59h2.672V18.338z M7.004,8.574c-0.857,0-1.549-0.694-1.549-1.548 c0-0.855,0.691-1.548,1.549-1.548c0.854,0,1.547,0.694,1.547,1.548C8.551,7.881,7.858,8.574,7.004,8.574z M18.339,18.338h-2.669 v-4.177c0-0.996-0.017-2.278-1.387-2.278c-1.389,0-1.601,1.086-1.601,2.206v4.249h-2.667v-8.59h2.559v1.174h0.037 c0.356-0.675,1.227-1.387,2.526-1.387c2.703,0,3.203,1.779,3.203,4.092V18.338z"></path></svg><span class="wp-block-social-link-label screen-reader-text">LinkedIn</span></a></li>

<li class="wp-social-link wp-social-link-github  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://github.com/topics/xojo" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M12,2C6.477,2,2,6.477,2,12c0,4.419,2.865,8.166,6.839,9.489c0.5,0.09,0.682-0.218,0.682-0.484 c0-0.236-0.009-0.866-0.014-1.699c-2.782,0.602-3.369-1.34-3.369-1.34c-0.455-1.157-1.11-1.465-1.11-1.465 c-0.909-0.62,0.069-0.608,0.069-0.608c1.004,0.071,1.532,1.03,1.532,1.03c0.891,1.529,2.341,1.089,2.91,0.833 c0.091-0.647,0.349-1.086,0.635-1.337c-2.22-0.251-4.555-1.111-4.555-4.943c0-1.091,0.39-1.984,1.03-2.682 C6.546,8.54,6.202,7.524,6.746,6.148c0,0,0.84-0.269,2.75,1.025C10.295,6.95,11.15,6.84,12,6.836 c0.85,0.004,1.705,0.114,2.504,0.336c1.909-1.294,2.748-1.025,2.748-1.025c0.546,1.376,0.202,2.394,0.1,2.646 c0.64,0.699,1.026,1.591,1.026,2.682c0,3.841-2.337,4.687-4.565,4.935c0.359,0.307,0.679,0.917,0.679,1.852 c0,1.335-0.012,2.415-0.012,2.741c0,0.269,0.18,0.579,0.688,0.481C19.138,20.161,22,16.416,22,12C22,6.477,17.523,2,12,2z"></path></svg><span class="wp-block-social-link-label screen-reader-text">GitHub</span></a></li>

<li class="wp-social-link wp-social-link-youtube  wp-block-social-link"><a rel="noopener nofollow" target="_blank" href="https://www.youtube.com/c/XojoInc" class="wp-block-social-link-anchor"><svg width="24" height="24" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" aria-hidden="true" focusable="false"><path d="M21.8,8.001c0,0-0.195-1.378-0.795-1.985c-0.76-0.797-1.613-0.801-2.004-0.847c-2.799-0.202-6.997-0.202-6.997-0.202 h-0.009c0,0-4.198,0-6.997,0.202C4.608,5.216,3.756,5.22,2.995,6.016C2.395,6.623,2.2,8.001,2.2,8.001S2,9.62,2,11.238v1.517 c0,1.618,0.2,3.237,0.2,3.237s0.195,1.378,0.795,1.985c0.761,0.797,1.76,0.771,2.205,0.855c1.6,0.153,6.8,0.201,6.8,0.201 s4.203-0.006,7.001-0.209c0.391-0.047,1.243-0.051,2.004-0.847c0.6-0.607,0.795-1.985,0.795-1.985s0.2-1.618,0.2-3.237v-1.517 C22,9.62,21.8,8.001,21.8,8.001z M9.935,14.594l-0.001-5.62l5.404,2.82L9.935,14.594z"></path></svg><span class="wp-block-social-link-label screen-reader-text">YouTube</span></a></li></ul>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Tutorial: Deploying Web Apps on Linux</title>
		<link>https://blog.xojo.com/2021/05/28/tutorial-deploying-web-apps-on-linux/</link>
		
		<dc:creator><![CDATA[Javier Menendez]]></dc:creator>
		<pubDate>Fri, 28 May 2021 15:00:00 +0000</pubDate>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Xojo Cloud]]></category>
		<category><![CDATA[App Hosting]]></category>
		<category><![CDATA[Cloud]]></category>
		<category><![CDATA[Deployment]]></category>
		<category><![CDATA[Hello World]]></category>
		<category><![CDATA[Nginx]]></category>
		<category><![CDATA[SSH]]></category>
		<category><![CDATA[webdev]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=8552</guid>

					<description><![CDATA[This tutorial provides a step-by-step guide to deploying Xojo web apps on a Linux server. You'll find deployment of more complex web apps can follow the same basic principles. If all of this seems too complex, Xojo Cloud is the easy, powerful and secure way to deploy web apps.]]></description>
										<content:encoded><![CDATA[<p>This tutorial provides a step-by-step guide to deploying Xojo web apps on a Linux server. We will use <strong>Ubuntu 20.4</strong> (64-bit) running on a remote server (VPS) in this example, but this tutorial should work on other Linux distros with minimal change, for example CentOS.</p>
<p>First, in order to deploy a web app you&#8217;ll need a way to access the remote server using the Terminal (macOS) or through the Command line, also a way to create and/or modify several files, and to copy files from your local computer to the remote server using (S)FTP.</p>
<blockquote><p><strong>Note:</strong> While we are using the &#8220;root&#8221; user for all the operations to keep the tutorial as short as possible, including files/folders/directories creation/edition and also for launching the web app, you&#8217;ll probably want to create a specific user with the proper privileges/group configuration for this. As we all know, you don&#8217;t usually want to run anything as the root user!</p></blockquote>
<p>Though this tutorial is focused on the <strong>deployment</strong> aspects of a web app, we&#8217;ll first create a very simple web app in Xojo. Feel free to use a web app of your own. At the end of this tutorial, you&#8217;ll find deployment of more complex web apps can follow the same basic principles.</p>
<h2>1. The Web App</h2>
<p>This very simple app will display a message when the button is clicked.  Start the Xojo IDE and choose Web from the Project Selector window:</p>
<p><img fetchpriority="high" decoding="async" class="size-full wp-image-8553 aligncenter" src="https://blog.xojo.com/wp-content/uploads/2021/05/1-ProyectoWeb.png" alt="" width="882" height="538" srcset="https://blog.xojo.com/wp-content/uploads/2021/05/1-ProyectoWeb.png 882w, https://blog.xojo.com/wp-content/uploads/2021/05/1-ProyectoWeb-300x183.png 300w, https://blog.xojo.com/wp-content/uploads/2021/05/1-ProyectoWeb-768x468.png 768w" sizes="(max-width: 882px) 100vw, 882px" /></p>
<p>Click on the <code>WebPage1</code> item displayed in the Navigator to access the webpage Layout Editor.</p>
<p>Next, drag a button from the Library panel and drop it anywhere on the Layout Editor.</p>
<p><img decoding="async" class="size-full wp-image-8554 aligncenter" src="https://blog.xojo.com/wp-content/uploads/2021/05/2-Pagina.png" alt="" width="766" height="583" srcset="https://blog.xojo.com/wp-content/uploads/2021/05/2-Pagina.png 766w, https://blog.xojo.com/wp-content/uploads/2021/05/2-Pagina-300x228.png 300w" sizes="(max-width: 766px) 100vw, 766px" /></p>
<p>With the button still selected, add the <code>Pressed</code> Event Handler and type this line of code in the Code Editor:</p>
<pre>MessageBox "Hola Mundo"</pre>
<p>The classic &#8220;Hello World&#8221; en español, this is everything the web app will do.</p>
<h2>2. Setting the Deployment Options</h2>
<p>Click on the <code>Shared</code> option found under the <code>Build Settings</code> section in the Navigator. Next, enter <code>9000</code> as the port under the <code>Build Settings</code> section in the Inspector Panel.</p>
<blockquote><p><strong>Note:</strong> Adding the port is not required at this time because the port can be assigned when running the app once it is deployed to the server.</p></blockquote>
<p><img decoding="async" class="size-full wp-image-8567 aligncenter" src="https://blog.xojo.com/wp-content/uploads/2021/05/InspectorPanel.png" alt="" width="301" height="710" srcset="https://blog.xojo.com/wp-content/uploads/2021/05/InspectorPanel.png 301w, https://blog.xojo.com/wp-content/uploads/2021/05/InspectorPanel-127x300.png 127w" sizes="(max-width: 301px) 100vw, 301px" /></p>
<h2>3. Compile the Web App</h2>
<p>Make sure to choose the Linux checkbox in <code>Build Settings</code>. Then, select <code>X86 64 bit</code> from the <code>Build</code> popup menu in the Inspector Panel.</p>
<p><img loading="lazy" decoding="async" class="size-full wp-image-8556 aligncenter" src="https://blog.xojo.com/wp-content/uploads/2021/05/4-AjustesCompilacion.jpg" alt="" width="596" height="355" srcset="https://blog.xojo.com/wp-content/uploads/2021/05/4-AjustesCompilacion.jpg 596w, https://blog.xojo.com/wp-content/uploads/2021/05/4-AjustesCompilacion-300x179.jpg 300w" sizes="auto, (max-width: 596px) 100vw, 596px" /></p>
<p>Next, click on the <code>Build</code> button in Xojo&#8217;s IDE toolbar. Once the app is compiled, you&#8217;ll get a Folder/Directory with the following items inside:</p>
<p><img loading="lazy" decoding="async" class="size-full wp-image-8557 aligncenter" src="https://blog.xojo.com/wp-content/uploads/2021/05/5-BuiltApp.png" alt="" width="626" height="341" srcset="https://blog.xojo.com/wp-content/uploads/2021/05/5-BuiltApp.png 626w, https://blog.xojo.com/wp-content/uploads/2021/05/5-BuiltApp-300x163.png 300w" sizes="auto, (max-width: 626px) 100vw, 626px" /></p>
<p>This is the folder you will copy to the server. I&#8217;m using the <a href="https://cyberduck.io">Cyberduck</a> app on macOS but you can choose any method you like.</p>
<h2>4. Copying the App Folder to the Server</h2>
<p>Make sure to copy the folder with the compiled app to the <code>/var/XojoApps</code> path on the server (you&#8217;ll need to create that folder/directory first). Once all the files have been copied, make sure to set <code>750</code> as the privileges value for the folder and files (choose the option to apply these recursively to all of them).</p>
<p><img loading="lazy" decoding="async" class="size-large wp-image-8568 aligncenter" src="https://blog.xojo.com/wp-content/uploads/2021/05/SFTP-CopyFiles-1024x462.png" alt="" width="1024" height="462" srcset="https://blog.xojo.com/wp-content/uploads/2021/05/SFTP-CopyFiles-1024x462.png 1024w, https://blog.xojo.com/wp-content/uploads/2021/05/SFTP-CopyFiles-300x135.png 300w, https://blog.xojo.com/wp-content/uploads/2021/05/SFTP-CopyFiles-768x346.png 768w, https://blog.xojo.com/wp-content/uploads/2021/05/SFTP-CopyFiles.png 1426w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></p>
<h2>5. Installing Nginx</h2>
<p>If the server doesn&#8217;t have <a href="http://nginx.com">Nginx</a> already installed, install it now. Nginx is a light web server which provides more performance when compared with Apache (that is, it is able to serve more requests per second, among other improvements).</p>
<p>To install Nginx, access the remote server using SSH:</p>
<pre>&gt; SSH root@xxx.xxx.xxx.xxx</pre>
<p>Once the new session is open, type the following commands to install Nginx:</p>
<pre>$ sudo apt update
$ sudo apt install nginx</pre>
<h2></h2>
<h2>6. (Really) Basic Firewall Configuration</h2>
<p>Let&#8217;s tackle the firewall. It will need to accept incoming connections from Nginx. Nginx registers itself as a <a href="https://en.wikipedia.org/wiki/Uncomplicated_Firewall"><code>ufw</code></a> service during its installation. In order to simplify the deployment example, use the most restrictive option allowing only web traffic from port 80:</p>
<pre>$ sudo ufw allow 'Nginx HTTP'</pre>
<p>Type the following command to verify the changes:</p>
<pre>$ sudo ufw status</pre>
<p>The output should be similar to this (in my case access from SSH and 8080 ports are also enabled).</p>
<p><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-8592" src="https://blog.xojo.com/wp-content/uploads/2021/05/7-ufw-status.png" alt="" width="390" height="143" srcset="https://blog.xojo.com/wp-content/uploads/2021/05/7-ufw-status.png 390w, https://blog.xojo.com/wp-content/uploads/2021/05/7-ufw-status-300x110.png 300w" sizes="auto, (max-width: 390px) 100vw, 390px" /></p>
<blockquote><p><strong>Note:</strong> This tutorial does not discuss web security which in the overwhelming majority of cases should be a paramount issue and not ignored. Securing a server is a very complicated process which is why we take care of the for you with <a href="https://www.xojo.com/cloud">Xojo Cloud</a>.</p></blockquote>
<h2>7. Creating a New Nginx &#8220;block&#8221;</h2>
<p>Once Nginx is installed, Ubuntu automatically starts this process, so the web server should be active already. Test this by typing:</p>
<pre>$ systemctl status nginx</pre>
<p>The output  should be similar to this:</p>
<p><img loading="lazy" decoding="async" class="size-full wp-image-8559 aligncenter" src="https://blog.xojo.com/wp-content/uploads/2021/05/8-Nginx-Status.png" alt="" width="841" height="192" srcset="https://blog.xojo.com/wp-content/uploads/2021/05/8-Nginx-Status.png 841w, https://blog.xojo.com/wp-content/uploads/2021/05/8-Nginx-Status-300x68.png 300w, https://blog.xojo.com/wp-content/uploads/2021/05/8-Nginx-Status-768x175.png 768w" sizes="auto, (max-width: 841px) 100vw, 841px" /></p>
<p>Once the server is running, create a new server block. Think about this block like the virtual hosts on Apache. They will encapsulate the configuration details and will allow hosting of more than one domain on the same server.</p>
<p>Nginx loads these configuration files from the <code>/etc/nginx/sites-available</code> path. Create a new file using the <code>nano</code> editor:</p>
<pre>$ sudo nano /etc/nginx/sites-available/XojoDemo</pre>
<p>Next type the following block in the resulting new document:</p>
<pre>server	{
listen 80;
listen [::]:80;
root /var/XojoApps/XojoDemo;
index index.html index.htm index.nginx-debian.html;

server_name xxx.xxx.xxx.xxx;

location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:9000;
}
}</pre>
<p>Replace <code>xxx.xxx.xxx.xxx</code> with your server IP address or the server domain (DNS record, if you have one pointing to it). We are instructing Nginx to redirect the traffic from port 80 to 9000 where our web app will be listening.</p>
<p>Save the file and exit <code>nano</code>. Next, enable the file by creating a link from the file to the <code>sites-enabled</code> directory where Nginx reads the configuration files:</p>
<pre>$ sudo ln -s /etc/nginx/sites-available/XojoDemo /etc/nginx/sites-enabled/</pre>
<p>Finally, check for syntax errors in the Nginx configuration files:</p>
<pre>$ sudo nginx -t</pre>
<p><img loading="lazy" decoding="async" class="size-full wp-image-8560 aligncenter" src="https://blog.xojo.com/wp-content/uploads/2021/05/9-Nginx-check.png" alt="" width="486" height="44" srcset="https://blog.xojo.com/wp-content/uploads/2021/05/9-Nginx-check.png 486w, https://blog.xojo.com/wp-content/uploads/2021/05/9-Nginx-check-300x27.png 300w" sizes="auto, (max-width: 486px) 100vw, 486px" /></p>
<p>If everything is Ok, then reload <code>Nginx</code> so it reads the configuration files again and applies the changes:</p>
<pre>$ sudo systemctl restart nginx</pre>
<h2></h2>
<h2>8. Executing the Xojo Web App</h2>
<p>It&#8217;s time to start our Xojo web app and test the access from the web browser of your choice. Change the current path to the one where you copied the web app. In this example:</p>
<pre>$ cd /var/XojoApps/XojoDemo</pre>
<p>Next, start the app by issuing the following command:</p>
<pre>$ ./XojoDemo --port=9000</pre>
<p>Open a new window/tab in the web browser and enter the IP address/web domain pointing to the web server. There is the web app up and running:</p>
<p><img loading="lazy" decoding="async" class="size-large wp-image-8561 aligncenter" src="https://blog.xojo.com/wp-content/uploads/2021/05/10-HolaMundo-1024x592.png" alt="" width="1024" height="592" srcset="https://blog.xojo.com/wp-content/uploads/2021/05/10-HolaMundo-1024x592.png 1024w, https://blog.xojo.com/wp-content/uploads/2021/05/10-HolaMundo-300x174.png 300w, https://blog.xojo.com/wp-content/uploads/2021/05/10-HolaMundo-768x444.png 768w, https://blog.xojo.com/wp-content/uploads/2021/05/10-HolaMundo.png 1070w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></p>
<p>Congrats! Now for the harsh truth. This way of executing web apps is not ideal. Because it started from the SSH session on the server, if we exit or interrupt the SSH connection, the web app will exit and won&#8217;t be accessible anymore for anyone. This problem also results in a 504 Gateway Time-Out page served by Nginx:</p>
<p><img loading="lazy" decoding="async" class="size-large wp-image-8562 aligncenter" src="https://blog.xojo.com/wp-content/uploads/2021/05/11-TimeOut-1024x592.png" alt="" width="1024" height="592" srcset="https://blog.xojo.com/wp-content/uploads/2021/05/11-TimeOut-1024x592.png 1024w, https://blog.xojo.com/wp-content/uploads/2021/05/11-TimeOut-300x174.png 300w, https://blog.xojo.com/wp-content/uploads/2021/05/11-TimeOut-768x444.png 768w, https://blog.xojo.com/wp-content/uploads/2021/05/11-TimeOut.png 1070w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></p>
<p>In order to fix this problem, create a <code>Service</code>.  A service will allow the app to run without any intervention, even if there is a server interruption, for example, if the server is restarted or the app crashes.</p>
<h2>9. Creating a Service</h2>
<p>Type the following in the current SSH session:</p>
<pre>$ sudo nano /lib/systemd/XojoDemoApp.service</pre>
<p>Next, type the following snippet of text in the new, opened document (make sure to save the changes once you exit nano).</p>
<pre>[Service]
Type=simple
Restart=always
RestartSec=3
User=root
ExecStart=/var/XojoApps/XojoDemo/XojoDemo --port=9000
[Install]
WantedBy=multi-user.target</pre>
<p>Now that you have exited nano, and with the new service created, activate it with the following commands:</p>
<pre>$ sudo systemctl enable /lib/systemd/XojoDemoApp.service
$ sudo systemctl start XojoDemoApp.service</pre>
<p>Get the service status by typing the following command:</p>
<pre>$ sudo systemctl status XojoDemoApp.service</pre>
<p>You should get an output similar to this:</p>
<p><img loading="lazy" decoding="async" class="size-full wp-image-8570 aligncenter" src="https://blog.xojo.com/wp-content/uploads/2021/05/ServiceStatus.png" alt="" width="664" height="134" srcset="https://blog.xojo.com/wp-content/uploads/2021/05/ServiceStatus.png 664w, https://blog.xojo.com/wp-content/uploads/2021/05/ServiceStatus-300x61.png 300w" sizes="auto, (max-width: 664px) 100vw, 664px" /></p>
<p>Now, you can be confident that the Xojo web app will be running even if you close the current SSH connection with the remote server <em>and</em> that it will restart even if the remote server is restarted or the app crashes.</p>
<p>If all of this seems more complex than you care to manage, <a href="https://www.xojo.com/cloud">Xojo Cloud</a> is the easy, powerful and secure way to deploy web apps. Xojo does not provide support for configuring your web server for use with Xojo web apps. To read more about deploying Xojo web apps, visit the Xojo Docs <a href="https://documentation.xojo.com/topics/application_deployment/web/deployment_overview.html">Web Deployment Overview</a> and the <a href="https://documentation.xojo.com/topics/application_deployment/web/deployment_details.html">Web Deployment Details</a> pages.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>3 Steps to Seamlessly Deploy SQLite Projects on Desktop, Web &#038; iOS</title>
		<link>https://blog.xojo.com/2020/03/17/3-steps-to-seamlessly-deploy-sqlite-projects-on-desktop-web-ios/</link>
		
		<dc:creator><![CDATA[Javier Menendez]]></dc:creator>
		<pubDate>Tue, 17 Mar 2020 10:00:25 +0000</pubDate>
				<category><![CDATA[Database]]></category>
		<category><![CDATA[Desktop]]></category>
		<category><![CDATA[iOS]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Xojo Cloud]]></category>
		<category><![CDATA[Deployment]]></category>
		<category><![CDATA[Mobile]]></category>
		<category><![CDATA[Multi-Platform Development]]></category>
		<category><![CDATA[Object-Oriented]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[SQLite]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">https://blog.xojo.com/?p=6725</guid>

					<description><![CDATA[This tutorial will show you how to deploy your SQLite based projects so they behave right on Desktop, Web and iOS, copying the database file to the right place on every target.]]></description>
										<content:encoded><![CDATA[<p>This tutorial will show you how to deploy your SQLite based projects so they behave right on Desktop, Web and iOS, copying the database file to the right place on every target.</p>
<h2>1. Adding the database file</h2>
<p>You probably created your SQLite database file using an external editor; so first add that file to your Xojo project.</p>
<p>You can do that in several ways, but usually it&#8217;s best to add a Build Step. This way, the file will be added automatically to the folder of your choice every time you compile your app. <em>Bonus: Doing this allows you to decide to use different paths when debugging or deploying your app.</em></p>
<p>In order to add a new Build Step in a <span style="text-decoration: underline;">Desktop</span> project select the target in the Build Settings then, from the contextual menu, choose the &#8220;Add to Build Settings &gt; Build Step &gt; Copy Files&#8221; option.</p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-6726 aligncenter" src="https://blog.xojo.com/wp-content/uploads/2020/03/Screenshot-2020-03-04-at-12.37.51-300x70.png" alt="" width="300" height="70" srcset="https://blog.xojo.com/wp-content/uploads/2020/03/Screenshot-2020-03-04-at-12.37.51-300x70.png 300w, https://blog.xojo.com/wp-content/uploads/2020/03/Screenshot-2020-03-04-at-12.37.51.png 655w" sizes="auto, (max-width: 300px) 100vw, 300px" /></p>
<p>The previous action will give you access to the Inspector Panel for the just-added item where you will be able to type a name for the Build Step, choose if the copy file action will be executed both for debugging or deployment and, most importantly, choose the location where the file should be copied when the app compiles.</p>
<p>In fact, the Destination menu contains a number of typical paths (or most relevant folders). For example, a good Destination option would be &#8220;Resources Folder&#8221;. Of course, don&#8217;t forget to add the database file itself using the buttons on the Build Editor toolbar.</p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-6727 aligncenter" src="https://blog.xojo.com/wp-content/uploads/2020/03/Screenshot-2020-03-04-at-12.42.04-300x173.png" alt="" width="300" height="173" srcset="https://blog.xojo.com/wp-content/uploads/2020/03/Screenshot-2020-03-04-at-12.42.04-300x173.png 300w, https://blog.xojo.com/wp-content/uploads/2020/03/Screenshot-2020-03-04-at-12.42.04.png 359w" sizes="auto, (max-width: 300px) 100vw, 300px" /></p>
<p>When you&#8217;re working with a <span style="text-decoration: underline;">Web project</span>, you&#8217;ll find exactly the same behavior, even if you choose to deploy with Xojo Cloud.</p>
<p>On <span style="text-decoration: underline;">iOS</span>, the only change is that you&#8217;ll have to choose the icon with an iPhone picture in it in order to access the Build Step contextual menu; in addition to the fact that every added resource needs to be signed with a certificate.</p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-6728 aligncenter" src="https://blog.xojo.com/wp-content/uploads/2020/03/Screenshot-2020-03-04-at-12.43.45-300x47.png" alt="" width="300" height="47" srcset="https://blog.xojo.com/wp-content/uploads/2020/03/Screenshot-2020-03-04-at-12.43.45-300x47.png 300w, https://blog.xojo.com/wp-content/uploads/2020/03/Screenshot-2020-03-04-at-12.43.45.png 608w" sizes="auto, (max-width: 300px) 100vw, 300px" /></p>
<h2>2. Copying the database file to a &#8220;Working&#8221; folder</h2>
<p>You may think that the previous step is all you need to do, because if the database file is already copied in a well know path then you only need to provide that path as the DatabaseFile property on a new SQLiteDatabase or iOSSQLiteDatabase instance. But this is not the case.</p>
<p>They are many reasons you shouldn&#8217;t do that, specifically because the database would be open in read/write mode and if you write to that database file inside an application bundle, then you&#8217;ll be modifying a resource that would invalidate any certificate signature on your app.</p>
<p>The best thing to do is o detect every time you run the app if the database file has already been copied from the app bundle (or folder) into a target folder that doesn&#8217;t have an access problem when it is time to use the database. The Application Support folder is a good place for Desktop apps, while the Documents folder is fine for Xojo Cloud and iOS apps.</p>
<p>For example, if our database file is named &#8220;EddiesElectronics.sqlite&#8221; and our app name is &#8220;Xojotest&#8221;, then we can add the following code fragment into the Open Event Handler of a Desktop app:</p>
<pre>Var source As FolderItem = SpecialFolder.Resource("EddiesElectronics.sqlite")
Var name As String = app.ExecutableFile.name.NthField(".",1)

// We check if there is a folder with the App name in special Application Data
// if not, we create it and copy the database file from Resources bundle/directory
If Not (SpecialFolder.ApplicationData.Child(name).Exists And SpecialFolder.ApplicationData.Child(name).IsFolder) Then SpecialFolder.ApplicationData.Child(name).CreateFolder
If Not SpecialFolder.ApplicationData.child(name).child(source).exists Then source.CopyTo(SpecialFolder.ApplicationData.Child(name))

Try
  // Create a SQLiteDatabase instance and try to open our database file from
  // the path
  pDatabase = New SQLiteDatabase
  pDatabase.DatabaseFile = SpecialFolder.ApplicationData.Child(name).Child("EddiesElectronics.sqlite")
  pDatabase.Connect

Catch e As DatabaseException
  MessageBox e.Message
End Try</pre>
<p>For an iOS app, the code would be:</p>
<pre>Var source As Xojo.IO.FolderItem = xojo.io.SpecialFolder.GetResource("EddiesElectronics.sqlite")

// We check if there is our database file already copied on the Documents Sandbox folder
// if not, we copy the database file from Resources bundle/directory
If Not xojo.io.SpecialFolder.Documents.Child("EddiesElectronics.sqlite").Exists Then
  source.CopyTo(xojo.io.SpecialFolder.documents)
End If

Try
  // Create a SQLiteDatabase instance and try to open our database file from
  // the path
  pDatabase = New iosSQLiteDatabase

  Var f As FolderItem = xojo.io.SpecialFolder.Documents
  pDatabase.DatabaseFile = f.Child("EddiesElectronics.sqlite")
  Call pDatabase.Connect

Catch e As RuntimeException
  MessageBox e.Reason
End Try</pre>
<p>If you&#8217;re working on Xojo Cloud, the code will be even shorter. First, make sure that the Copy File Build Step has the following values in the Inspector Panel:</p>
<ul>
<li><strong>Destination:</strong> Contents Folder</li>
<li><strong>Subdirectory:</strong> Documents</li>
</ul>
<p>Then, the code will be:</p>
<pre>Try
  pDatabase = new SQLiteDatabase
  pDatabase.DatabaseFile = SpecialFolder.Documents.Child("EddiesElectronics.sqlite")
  pDatabase.connect
Catch e as RuntimeException
  MessageBox e.Reason
End Try</pre>
<p>What about a Web app that you host? That would mean you are in control about the folder/directory you want to use to store the app resources. Thus, it wouldn&#8217;t make much sense to automatize this process (but it is certainly doable following the same principles).</p>
<h2>3. Simplifying the process</h2>
<p>What we have seen already works, but that means that you need to change the file database name and probably that would change on every app you build. That also means that you&#8217;ll have to write the same code snippet again and again on every new app. Wouldn&#8217;t it be great to be able to extend the SQLiteDatabase and iOSSQLiteDatabase classes in order to simplify that?</p>
<p>Well, you can do that! Start by adding a new Module to the example project (for example one named &#8220;DatabaseExtensions&#8221;) with a couple of methods on it. The first method will be the one executed on our Desktop, Web and Console apps, because all of these targets use the SQLiteDatabase class.</p>
<p>So, add a new method using the following signature in the just-created module:</p>
<pre>OpenDatabase( databaseName as String )</pre>
<p>It extends the SQLiteDatabase class, adding a new method that takes as parameter the name of the file we want to copy on the &#8220;work&#8221; folder/directory.</p>
<p>The code you should type on this method is:</p>
<pre>pDatabase = New SQLiteDatabase

#If TargetDesktop Or TargetConsole Or TargetWeb Then

  Var source As FolderItem = SpecialFolder.Resource( databaseName )
  Var name As String = app.ExecutableFile.name.NthField(".",1)
  // We check if there is a folder with the App name in special Application Data
  // if not, we create it and copy the database file from Resources bundle/directory
  If Not (SpecialFolder.ApplicationData.Child(name).Exists And SpecialFolder.ApplicationData.Child(name).IsFolder) Then
SpecialFolder.ApplicationData.Child(name).CreateFolder
If Not SpecialFolder.ApplicationData.Child(nam).Child(Source).exists Then source.CopyTo(SpecialFolder.ApplicationData.Child(name))

  Try
    // Create a SQLiteDatabase instance and try to open our database file from
    // the path
    pDatabase.DatabaseFile = SpecialFolder.ApplicationData.Child(name).Child(databaseName)
    pDatabase.Connect

  Catch e As DatabaseException
    MessageBox e.Message
  End Try

#ElseIf TargetXojoCloud
  Try
    pDatabase.DatabaseFile = SpecialFolder.Documents.Child( databaseName )
    pDatabase.connect
  Catch e As RuntimeException
    MessageBox e.Reason
  End Try
#EndIf</pre>
<p>Of course, we need to add the &#8220;pDatabase&#8221; property to our module too: pDatabase As SQLiteDatabase</p>
<p>Now, you&#8217;ll only need to use:</p>
<pre>OpenDatabase("EddiesElectronics.sqlite")</pre>
<p>With the method selected in the Project Browser, click on the Attributes section of the Inspector Panel (the Cog Wheel icon), and uncheck the &#8220;iOS 64&#8221; checkbox. This way, that method will not be included when compiling for iOS apps.</p>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-6729 aligncenter" src="https://blog.xojo.com/wp-content/uploads/2020/03/Captura-de-pantalla-2020-03-09-a-las-6.55.49-281x300.png" alt="" width="281" height="300" srcset="https://blog.xojo.com/wp-content/uploads/2020/03/Captura-de-pantalla-2020-03-09-a-las-6.55.49-281x300.png 281w, https://blog.xojo.com/wp-content/uploads/2020/03/Captura-de-pantalla-2020-03-09-a-las-6.55.49.png 420w" sizes="auto, (max-width: 281px) 100vw, 281px" /></p>
<p>Do the same thing with the &#8220;pDatabase&#8221; property, so it is only compiled on the supported targets.</p>
<p>The second method is the one we will be using for iOS apps. The method signature would be:</p>
<pre>OpenDatabase(databseName as String)</pre>
<p>And typing the following fragment of code in the associated Code Editor:</p>
<pre>pIOSDatabase = New iOSSQLiteDatabase

Var source As Xojo.IO.FolderItem = xojo.io.SpecialFolder.GetResource( databaseName )

// We check if there is our database file already copied on the Documents Sandbox folder
// if not, we copy the database file from Resources bundle/directory
If Not xojo.io.SpecialFolder.Documents.Child( databaseName ).Exists Then
  source.CopyTo(xojo.io.SpecialFolder.documents)
End If

Try
  // Create a SQLiteDatabase instance and try to open our database file from
  // the path

  Var f As FolderItem = xojo.io.SpecialFolder.Documents
  pIOSDatabase.DatabaseFile = f.Child( databaseName )
  Call db.Connect

Catch e As RuntimeException
  MessageBox e.Reason
End Try</pre>
<p><img loading="lazy" decoding="async" class="size-medium wp-image-6730 aligncenter" src="https://blog.xojo.com/wp-content/uploads/2020/03/Captura-de-pantalla-2020-03-09-a-las-6.55.27-282x300.png" alt="" width="282" height="300" srcset="https://blog.xojo.com/wp-content/uploads/2020/03/Captura-de-pantalla-2020-03-09-a-las-6.55.27-282x300.png 282w, https://blog.xojo.com/wp-content/uploads/2020/03/Captura-de-pantalla-2020-03-09-a-las-6.55.27.png 423w" sizes="auto, (max-width: 282px) 100vw, 282px" /></p>
<p>Lastly, and with the method item still selected in the Project Browser, go to the Attributes section of the Inspector Panel and make sure that the &#8220;iOS 64&#8221; checkbox is the only one selected under the &#8220;Include In&#8221; section. This way, we make sure that the method will be compiled only on iOS targets.</p>
<p>And do the same thing with the &#8220;piOSDatabase&#8221;, so it is only compiled for iOS targets.</p>
<h2>To Summarize</h2>
<p>As we see, the use of Modules in combination with OOP Class Extension is a good way to get more flexibility when developing your apps; using a common function (or method) name no matter if you are working on Desktop, Web or iOS. Additionally, that leads to a more convenient reutilization of your codeand, of course, less code to maintain through all our projects!</p>
<p>(You can find this article in Spanish <a href="https://www.aprendexojo.com/2020/03/prepara-bases-de-datos-sqlite-para-despliegue-en-desktop-web-y-ios/">here</a>)</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>A Better Alternative to PHP</title>
		<link>https://blog.xojo.com/2017/07/28/an-better-alternative-to-php/</link>
		
		<dc:creator><![CDATA[Paul Lefebvre]]></dc:creator>
		<pubDate>Fri, 28 Jul 2017 10:28:51 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Xojo Cloud]]></category>
		<category><![CDATA[Deployment]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[webdev]]></category>
		<guid isPermaLink="false">http://blog.xojo.com/?p=2742</guid>

					<description><![CDATA[Like PHP, Xojo is object-oriented. Unlike PHP Xojo has a coherent framework design that is easier to work with. And the language is simpler and more focused as well. Try out Xojo and see how easy creating web apps can be!]]></description>
										<content:encoded><![CDATA[<p>Are you tired of the hassles of creating web apps using PHP? Why not develop faster and smarter with Xojo?</p>
<p>Like PHP, Xojo is object-oriented. Unlike PHP, Xojo has a coherent framework design that is easy to work with; plus the Xojo language is simple and focused.</p>
<p><span id="more-2742"></span></p>
<h3>Work Faster with an IDE</h3>
<p>Save yourself time and trouble by using an integrated development environment (<a href="https://en.wikipedia.org/wiki/Integrated_development_environment">IDE</a>). Why juggle text editors, FTP software, web servers and everything else you need to develop using PHP? With Xojo, you just need the IDE itself. Plus Xojo has a visual layout designer. You can design your web pages by dragging and dropping controls and positioning things how you want.</p>
<p align="center"><img decoding="async" src="https://www.xojo.com/resources/images/php/Figure01-VisualDesigner.png" alt="Xojo Visual Designer Web" /></p>
<h3>Learn One Thing</h3>
<p>Rather than having to master the details of PHP, HTML, JavaScript, AJAX, CSS and other somewhat related technologies, with Xojo you only have to know Xojo. You write your code in the Xojo language. Don’t worry about HTML or JavaScript -although you can if you want, Xojo is flexible. Xojo creates the HTML, CSS, JavaScript and AJAX code on the fly at runtime.</p>
<h3>Expandable</h3>
<p>Do you have existing JavaScript controls that you want to use? Take advantage of the Xojo Web SDK, which provides an API for you to integrate JavaScript (and HTML) controls and frameworks into Xojo.</p>
<p>This is Yahoo’s Rich Text Editor in a Xojo web app:</p>
<p align="center"><img decoding="async" src="https://www.xojo.com/resources/images/php/Figure02-YUIEditor.png" alt="Xojo UI Editor" /></p>
<h3>Easy Deployment</h3>
<p>Of course you can deploy your web apps to your own properly configured servers. But if you don&#8217;t have web server configuration experience or you just want a simple and secure deployment option, you can use <a href="http://www.xojo.com/cloud">Xojo Cloud</a>. Hosting with Xojo Cloud is as easy as clicking the “Deploy” button in Xojo; your app is built and uploaded to your Xojo Cloud server for immediate availability. You don’t have to worry about permissions, security or configuration.</p>
<p>See a Xojo web app hosted on Xojo Cloud here: <a href="http://demos.xojo.com">http://demos.xojo.com</a></p>
<p align="center"><img decoding="async" src="https://www.xojo.com/resources/images/php/Figure03-WebApp.png" alt="Xojo Web App" /></p>
<h3>Free to Develop</h3>
<p>Xojo is free to use for learning and development. <a href="http://www.xojo.com/download">Download and try it today</a> and see why people are choosing the simplicity of Xojo.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Simple Web Development with Xojo</title>
		<link>https://blog.xojo.com/2017/06/13/simple-web-development-with-xojo/</link>
		
		<dc:creator><![CDATA[Paul Lefebvre]]></dc:creator>
		<pubDate>Tue, 13 Jun 2017 20:24:33 +0000</pubDate>
				<category><![CDATA[Learning]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Xojo Cloud]]></category>
		<category><![CDATA[Beginner Tips]]></category>
		<category><![CDATA[Deployment]]></category>
		<category><![CDATA[Rapid Application Development]]></category>
		<category><![CDATA[webdev]]></category>
		<category><![CDATA[Xojo Programming Language]]></category>
		<guid isPermaLink="false">http://blog.xojo.com/?p=2705</guid>

					<description><![CDATA[HTML, CSS, JavaScript, AJAX can all be challenging languages, and frameworks such as Ruby on Rails, ASP.NET, PHP and Java can be overwhelming. Instead of doing it the hard way, take a look at Xojo Web - a single, RAD language and IDE that builds secure web apps.]]></description>
										<content:encoded><![CDATA[<p>Do you find it frustrating to create web apps? HTML, CSS, JavaScript, and AJAX can be challenging, and frameworks such as Node, React, Ruby on Rails, ASP.NET, PHP and Java are often overwhelming for those just beginning web development.</p>
<p>There is a simpler solution: Xojo. Using a single programming language and a single IDE, you can go from zero to a working web app in an amazingly short amount of time with Xojo.</p>
<p><span id="more-2705"></span></p>
<h3>User Interface Layout</h3>
<p>We all know how slow and error-prone it is creating the user interface for your web app using code, which is what you have to do with most tools. But with Xojo’s Layout Editor, you just drag controls and position them where you want.</p>
<p align="center"><img loading="lazy" decoding="async" class="aligncenter size-full wp-image-3400" src="https://blog.xojo.com/wp-content/uploads/2017/06/Screen-Shot-2017-09-08-at-8.57.40-AM.png" alt="" width="3240" height="2274" /></p>
<p>Xojo web apps work on desktop, tablet and mobile browsers. With the Layout Editor, you can design layouts for each type of browser for your app to switch between at ease.</p>
<h3>Writing Code</h3>
<p>The Xojo programming language and framework are event-based, fully object-oriented and incredibly easy to learn. With the code editor’s helpful auto-complete feature, you’ll be able to write code faster.</p>
<p align="center"><img decoding="async" src="https://www.xojo.com/resources/images/webapps/Figure02-Code.png" alt="Xojo Code Editor" /></p>
<p>Xojo has the tools to help you code quickly, including a debugger that greatly simplifies tracking down bugs in your code.</p>
<h3>Expandable</h3>
<p>Xojo includes <a href="http://developer.xojo.com/userguide/web-ui-overview">many built-in web controls</a>, but it is also expandable. You can add your own JavaScript controls (and frameworks) to your Xojo web apps using the Xojo Web Software Development Kit (SDK).</p>
<p>For example, you can add the Yahoo Rich Text Editor to a Xojo web app as shown below.</p>
<p align="center"><img decoding="async" src="https://www.xojo.com/resources/images/webapps/Figure03-Camping.JPG" alt="camping image" /></p>
<h3>Easy to Deploy</h3>
<p>Xojo makes it easy to deploy your web apps. If you have experience configuring and maintaining web servers, you can <a href="http://developer.xojo.com/userguide/web-app-deployment-overview">deploy your Xojo web apps to your own server</a>. If you’re not an expert server administrator, <a href="http://www.xojo.com/cloud">Xojo Cloud</a> provides one-click web app deployment to our secure servers in one easy step!</p>
<h3>Learn Quickly</h3>
<p>Check out a live demo of our <a href="http://demos.xojo.com/" target="_blank" rel="noopener noreferrer">Eddie’s Electronic sample app</a> and take a look at the full source code included in the Xojo download.  Or check out this growing <a href="https://www.youtube.com/playlist?list=PLPoq910Q9jXgP6gife4hDz69IdEHLb_bE">playlist of videos</a> to help you get started building web apps with Xojo.</p>
<p>Learn more about <a href="http://www.xojo.com/products/web.php">Xojo Web</a> or just go ahead and <a href="http://www.xojo.com/download/">download</a> Xojo for free. Read the <a href="http://developer.xojo.com/web-quickstart">QuickStart</a>, <a href="http://developer.xojo.com/web-tutorial">Tutorial</a>, <a href="http://developer.xojo.com/userguide">User Guide</a>, and start developing your own web apps. You can develop, run and debug your app all before purchasing a license.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>All The Ways: Deploying Your iOS Apps</title>
		<link>https://blog.xojo.com/2015/02/27/deploying-your-ios-apps/</link>
		
		<dc:creator><![CDATA[Paul Lefebvre]]></dc:creator>
		<pubDate>Fri, 27 Feb 2015 00:00:00 +0000</pubDate>
				<category><![CDATA[iOS]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[App Store]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[Deployment]]></category>
		<category><![CDATA[Mobile]]></category>
		<guid isPermaLink="false">http://blogtemp.xojo.com/2015/02/27/deploying-your-ios-apps/</guid>

					<description><![CDATA[We've been getting a lot of questions about available options for deploying iOS apps. Geoff recently wrote about how to deploy iOS apps inside a company, but I'd like to collect all the various ways to deploy your iOS here for quick, easy reference.]]></description>
										<content:encoded><![CDATA[<p>We&#8217;ve been getting a lot of questions about available options for deploying iOS apps.</p>
<p>Geoff recently wrote about how to <a href="http://blog.xojo.com/2015/02/19/deploying-ios-apps-inside-your-company/">deploy iOS apps inside a company</a>, but I&#8217;d like to collect all the various ways to deploy your iOS here for quick, easy reference.</p>
<p><span id="more-189"></span></p>
<h3>Ad-Hoc Deployment to Devices</h3>
<p>With Ad-Hoc Deployment, you build your iOS apps using an iOS Development Profile and manually copy the built app to the device. To create this profile you need to be a member of the <a href="http://developer.apple.com/">Apple Developer Program</a> (currently $99/year from Apple). You can deploy apps built in this manner on up to 100 devices.</p>
<p>There are step-by-step instructions on how to do this, which you can read about in the Xojo User Guide here: <a href="https://documentation.xojo.com/topics/application_deployment/mobile/device_deployment.html">iOS Device Deployment</a>.</p>
<h3>TestFlight</h3>
<p><span style="line-height: 1.62;">For beta testing purposes, you can also use Apple&#8217;s TestFlight server to allow up to 1000 users to install a beta version of your app. Use of TestFlight also requires that you are a member of the iOS Developer Program.</span></p>
<p><span style="line-height: 1.62;">Check out the Xojo Docs for instructions on how to use TestFlight: <a href="https://documentation.xojo.com/topics/application_deployment/mobile/submitting_to_testflight.html">Submitting to TestFlight</a></span></p>
<h3>App Store</h3>
<p>To get your app in the hands of end users, you will typically want to use the App Store. To do so, you will build your app using an iOS Distribution Profile. You will have to be a member of the iOS Developer Program.</p>
<p>Check out the Xojo Docs for step-by-step instructions on how to build and submit an app to the App Store: <a href="https://documentation.xojo.com/topics/application_deployment/mobile/submitting_to_the_ios_app_store.html">Submitting to the iOS App Store</a>.</p>
<h3>Volume Purchase Program</h3>
<p>As <a href="http://www.xojo.com/blog/en/2015/02/deploying-ios-apps-inside-your-company.php">mentioned by Geoff in a previous post</a>, the Volume Purchase Program provides a way for you to distribute apps to businesses or educational institutions without having to publish your app to the App Store. Apple has more information on this program:</p>
<ul>
<li><a href="https://www.apple.com/business/it/">Volume Purchase Program for Business</a></li>
<li><a href="https://www.apple.com/education/k12/it/">Volume Purchase Program for Education IT</a></li>
</ul>
<h3>Enterprise Deployment</h3>
<p>Businesses can use the iOS Developer Enterprise Program to get tools and resources for developing proprietary, in-house iOS apps that you can distribute to your employees. These apps are distributed outside of the App Store.</p>
<p>For more information, visit the <a href="https://developer.apple.com/programs/ios/enterprise/">iOS Developer Enterprise Program</a>.</p>
<h3>Other Options</h3>
<p>Other than jailbreaking your device, we are not aware of other options for deploying apps to iOS devices at this time.<span id="hs-cta-wrapper-effd89b6-76da-4f82-a83a-cd6bd0e73903" class="hs-cta-wrapper"><span id="hs-cta-effd89b6-76da-4f82-a83a-cd6bd0e73903" class="hs-cta-node hs-cta-effd89b6-76da-4f82-a83a-cd6bd0e73903"><br />
</span></span> <!-- end HubSpot Call-to-Action Code --></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Creating Installers for Windows Apps</title>
		<link>https://blog.xojo.com/2014/06/12/creating-installers-for-windows-apps/</link>
					<comments>https://blog.xojo.com/2014/06/12/creating-installers-for-windows-apps/#comments</comments>
		
		<dc:creator><![CDATA[Paul Lefebvre]]></dc:creator>
		<pubDate>Thu, 12 Jun 2014 00:00:00 +0000</pubDate>
				<category><![CDATA[Desktop]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Deployment]]></category>
		<category><![CDATA[Installer]]></category>
		<category><![CDATA[Microsoft]]></category>
		<guid isPermaLink="false">http://blogtemp.xojo.com/2014/06/12/creating-installers-for-windows-apps/</guid>

					<description><![CDATA[Creating Installers for Windows Apps]]></description>
										<content:encoded><![CDATA[<p>Now that you&#8217;ve finished creating your Windows app, how do you distribute it to Windows users? <span style="line-height: 1.62;">Microsoft Windows users expect an installer, so you can&#8217;t really get away with just using a ZIP file to distribute your apps. What are your options?</span></p>
<p><span id="more-129"></span></p>
<p>Depending on the project, I&#8217;ve used two installers on Windows: <a href="http://www.jrsoftware.org/isinfo.php" target="_blank" rel="noopener">Inno Setup</a> and <a href="http://www.advancedinstaller.com/" target="_blank" rel="noopener">Advanced Installer</a>. Both will create an installer that can place your app in Program Files, optionally create desktop and Start menu shortcuts, display a license agreement and much more.</p>
<p>Inno Setup creates setup.exe installers and is pretty easy to use once you get your script set up. The &#8220;QuickStart Pack&#8221; includes a Script editor that can help with that. Or you can grab one of the example scripts from the Xojo docs to get you started. There are examples for <a href="https://documentation.xojo.com/topics/windows/creating_an_installer_with_the_inno_setup_script_(32-bit_apps).html">32-bit</a> and <a href="https://documentation.xojo.com/topics/windows/creating_an_installer_with_the_inno_setup_script_(64-bit_apps).html">64-bit</a> Windows apps. Just replace the app names in the example with your app name, generate a new AppID (using Tool-&gt;Generate GUID in the menu) and you can build your installer.</p>
<p><a href="http://www.xojo.com/blog/en/assets_c/2014/06/InnoSetup-411.php"><img loading="lazy" decoding="async" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" src="https://blog.xojo.com/wp-content/uploads/2014/06/innosetup-thumb-400x415-411.pngt1466486449161ampwidth400ampheight415" sizes="auto, (max-width: 400px) 100vw, 400px" alt="InnoSetup.png" width="400" height="415" /></a></p>
<p>Advanced Installer has a user interface that is quite easy to use, allowing you to create an installer just by selecting files and specifying settings. The free version can use the &#8220;Simple&#8221; template which will likely suffice for most Xojo developers, but they also have a more powerful paid versions ($400 to $3000). In addition to the nice UI, Advanced Installer can create MSI (Microsoft Installer) files, which are often preferred by IT departments. From what I understand, an MSI makes it easier to do <a href="http://stackoverflow.com/questions/4304425/whats-the-prime-advantage-to-having-an-msi-installation-package" target="_blank" rel="noopener">remote and bulk deployments</a></p>
<p><a href="http://www.xojo.com/blog/en/assets_c/2014/06/AdvancedInstaller-414.php"><img loading="lazy" decoding="async" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;" src="https://blog.xojo.com/wp-content/uploads/2014/06/advancedinstaller-thumb-400x347-414.pngt1466486449161ampwidth400ampheight347" sizes="auto, (max-width: 400px) 100vw, 400px" alt="AdvancedInstaller.png" width="400" height="347" /></a></p>
<p>There are plenty of other installers for Windows, including the popular and expensive <a href="http://www.flexerasoftware.com/products/installshield.htm" target="_blank" rel="noopener">InstallShield</a> tools. I think that Xojo packages up your application so nicely that you are not likely to need all the capabilities that the more sophisticated tools provide.</p>
<p>For more information about deploying to Microsoft Windows, refer to these documentation topics:</p>
<ul>
<li><a href="https://documentation.xojo.com/topics/application_deployment/desktop/desktop_app_deployment.html">Desktop Deployment</a></li>
<li><a href="http://documentation.xojo.com/topics/windows/creating_an_installer_with_the_inno_setup_script_(32-bit_apps).html">Inno Setup Script for 32-bit apps</a></li>
<li><a href="http://documentation.xojo.com/topics/windows/creating_an_installer_with_the_inno_setup_script_(64-bit_apps).html">Inno Setup Script for 64-bit apps</a></li>
<li><a href="https://youtu.be/OWpFc_PepgQ">Video: Windows Installers</a></li>
</ul>
<p>The Xojo Examples include sample Inno Setup scripts and some sample XojoScript you can use to kick it all off. These are located here:</p>
<ul>
<li>Examples/Platform-Specific/Windows/Making Installers</li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.xojo.com/2014/06/12/creating-installers-for-windows-apps/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
	</channel>
</rss>
