<?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/"
	 xmlns:media="http://search.yahoo.com/mrss/" >

<channel>
	<title>Orion Engineering &#8211; Orion</title>
	<atom:link href="https://www.orionlabs.io/author/engineering-author/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.orionlabs.io</link>
	<description>Voice Platform for the Deskless Workforce</description>
	<lastBuildDate>Fri, 05 Aug 2022 18:44:05 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.8.3</generator>

<image>
	<url>https://www.orionlabs.io/wp-content/uploads/2016/02/favicon.png</url>
	<title>Orion Engineering &#8211; Orion</title>
	<link>https://www.orionlabs.io</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>How Orion Uses Edge Caching to Reduce Latency &#038; Empower Users to Move Faster</title>
		<link>https://www.orionlabs.io/how-orion-uses-edge-caching/</link>
		
		<dc:creator><![CDATA[Orion Engineering]]></dc:creator>
		<pubDate>Wed, 21 Nov 2018 16:11:47 +0000</pubDate>
				<category><![CDATA[Orion Product Updates]]></category>
		<category><![CDATA[caching]]></category>
		<category><![CDATA[edge caching]]></category>
		<category><![CDATA[fastly]]></category>
		<category><![CDATA[latency]]></category>
		<category><![CDATA[scale]]></category>
		<guid isPermaLink="false">https://www.orionlabs.io/?p=5963</guid>

					<description><![CDATA[<img width="300" height="168" src="https://www.orionlabs.io/wp-content/uploads/2018/11/Location-connections-300x168.jpg" class="attachment-medium size-medium wp-post-image" alt="Location connections" decoding="async" srcset="https://www.orionlabs.io/wp-content/uploads/2018/11/Location-connections-300x168.jpg 300w, https://www.orionlabs.io/wp-content/uploads/2018/11/Location-connections-1024x575.jpg 1024w, https://www.orionlabs.io/wp-content/uploads/2018/11/Location-connections-768x431.jpg 768w, https://www.orionlabs.io/wp-content/uploads/2018/11/Location-connections-1536x862.jpg 1536w, https://www.orionlabs.io/wp-content/uploads/2018/11/Location-connections.jpg 1918w" sizes="(max-width: 300px) 100vw, 300px" /><br><p style="text-align:left;">By Eric Eisberg, Web Services Engineer at Orion Labs At Orion, we’re always looking to help teams work faster and better. The Orion voice platform keeps teams connected across the globe, and we build our technology with that goal in mind. One way we’re trying to get our customers moving faster is through edge caching. [&#8230;]</p>]]></description>
										<content:encoded><![CDATA[<img width="300" height="168" src="https://www.orionlabs.io/wp-content/uploads/2018/11/Location-connections-300x168.jpg" class="attachment-medium size-medium wp-post-image" alt="Location connections" decoding="async" srcset="https://www.orionlabs.io/wp-content/uploads/2018/11/Location-connections-300x168.jpg 300w, https://www.orionlabs.io/wp-content/uploads/2018/11/Location-connections-1024x575.jpg 1024w, https://www.orionlabs.io/wp-content/uploads/2018/11/Location-connections-768x431.jpg 768w, https://www.orionlabs.io/wp-content/uploads/2018/11/Location-connections-1536x862.jpg 1536w, https://www.orionlabs.io/wp-content/uploads/2018/11/Location-connections.jpg 1918w" sizes="(max-width: 300px) 100vw, 300px" /><br><p style="text-align:left;"><p><em><img fetchpriority="high" decoding="async" class="aligncenter size-large wp-image-5964" src="https://www.orionlabs.io/wp-content/uploads/2018/11/Location-connections-1024x575-1.jpg" alt="" width="640" height="359" />By Eric Eisberg, Web Services Engineer at Orion Labs</em></p>
<p>At Orion, we’re always looking to help teams work faster and better. The <a href="https://www.orionlabs.io/product/">Orion voice platform</a> keeps teams connected across the globe, and we build our technology with that goal in mind.</p>
<p>One way we’re trying to get our customers moving faster is through edge caching. Edge caching is the process by which our caching service, Fastly, stores Orion API results and serves them quickly. It allows us to store data at the “edge” of our network. There, it’s closer to an end user, which reduces latency.</p>
<h3>Edge Caching and Edge Computing</h3>
<p>In the bigger picture, edge caching is a form of <a href="https://en.wikipedia.org/wiki/Edge_computing" target="_blank" rel="noopener">edge computing</a>, a distributed computing paradigm that allows computation to happen geographically closer to its end users or clients. Edge computing offers massive performance advantages to a variety of technologies, such as artificial intelligence, connected cars, and video. And optimizing for peak performance is a constant challenge. For example, during this year’s FIFA World Cup, Akamai delivered streaming video of the event at a staggering <a href="https://www.digitaltveurope.com/2018/07/19/world-cup-most-streamed-event-for-akamai/" target="_blank" rel="noopener">22.52Tbps,</a> making it their most-streamed event to date.</p>
<h3>Why Orion Uses Edge Caching</h3>
<p>With edge caching, users don’t actually need their app to contact Orion directly for every piece of information. This means that we can fulfill user requests up to 40x faster than with calls to servers alone. Furthermore, our average time to the first byte on a cache hit takes less than 10 milliseconds.</p>
<p>Not only does this mean faster load times for users, but edge caching also reduces the load on the Orion API. That way, we can pass on much of our load to Fastly, making it easier to scale our service.</p>
<p>In this post, we’ll share some of the technical details about how we’re using edge caching here at Orion. If you’ve worked on dev ops or cloud infrastructure projects or done front- or back-end engineering, you might be familiar with some of the concepts involved. Read on to learn more!</p>
<h3>How Orion Caches API Resources</h3>
<p>To configure the cache time-to-live (TTL), or the number of seconds until the cache is automatically purged, we use response headers.</p>
<p><a href="https://docs.fastly.com/guides/tutorials/cache-control-tutorial.html" target="_blank" rel="noopener">Fastly allows you to set the cache TTL</a> using two headers: <code>Surrogate-Control</code> and <code>Cache-Control</code>. Fastly respects the <code>Surrogate-Control: max-age=$seconds</code> header but strips it before the response continues on to other downstream caches or the client.</p>
<p><code>Cache-Control</code> is a bit more complex. Fastly respects <code>Cache-Control</code> too, but it also gets passed along, potentially setting downstream caches, all the way to the clients. We can’t force a revalidation for all possible downstream caches, so we decided to forego this header in favor of another solution.</p>
<p>Because client-side caching can dramatically improve user experience, especially in cases where the user’s location is far away from the caching provider&#8217;s PoP. In order to facilitate client-side caching while ensuring that browsers don&#8217;t serve stale data to our users, we&#8217;ve settled on ETags. (For more on ETags, <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag" target="_blank" rel="noopener">check out Mozilla&#8217;s excellent guide</a>.)</p>
<p>Each client can then use its own caching policy for ETags, but each should check with the edge cache to see if the data has changed before serving its locally cached value.</p>
<p>With these principles in mind, we&#8217;ve chosen the following set of headers for cache control:</p>
<pre>Surrogate-Control: max-age=$TTL

ETag: W/"$etag_value"</pre>
<h3>Handling Per-Session Variation in API Return Values</h3>
<p>There are some potential wrinkles with this approach. One is that the objects returned by the API can &#8212; and do &#8212; differ based on the permissions level of the user making the request. If we simply cache the result of the URL, we could end up exposing data to the wrong users or limiting what more highly permissioned users are able to view.</p>
<p>In order to solve this problem, we make use of the <code>Vary header</code>. Fastly has written an <a href="https://www.fastly.com/blog/best-practices-using-vary-header" target="_blank" rel="noopener">excellent blog post on the subject</a>, but in a nutshell, the <code>Vary</code> header allows us to cache different responses based on a specified set of request headers.</p>
<h3>Dynamically Setting Cache TTLs</h3>
<p>The Vary header allows us to cache <a href="https://www.fastly.com/blog/getting-most-out-vary-fastly" target="_blank" rel="noopener">up to 200 distinct variations</a>. If we&#8217;re varying by session, we&#8217;ll reach this number quickly. Moreover, how quickly different resources reach this limit will differ greatly.</p>
<p>The other part of the solution we hit upon is using <a href="https://launchdarkly.com/" target="_blank" rel="noopener">LaunchDarkly</a> to set the cache TTL dynamically. This gives us tremendous flexibility to tune our caching instantly to provide the best possible user experience.</p>
<p>An example to illustrate this: Suppose we&#8217;ve decided that 14 days (or 1,209,600 seconds), in general, is a good cache TTL. However, we also have a few very large organizations that end up hitting the 200 variation limit quickly.</p>
<p>In LaunchDarkly, we can set the TTL to be lower for these very large organizations. Furthermore, we can do this almost instantly, without having to go through the process of deploying new code to our API server or tinkering with our VCL settings.</p>
<h3>Looking Ahead</h3>
<p>We’re always looking for ways to improve our service, and we’re considering further improvements to our edge caching. We’ll keep you updated.</p>
<p>In the meantime, if you want to learn more about what we’re working on at Orion, <a href="https://www.orionlabs.io/careers/">explore our open roles</a>.</p>
</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>How We Keep Your Onyx Connected Using CoreBluetooth State Restoration on Our iOS App</title>
		<link>https://www.orionlabs.io/ios-onyx-corebluetooth-state-restoration/</link>
		
		<dc:creator><![CDATA[Orion Engineering]]></dc:creator>
		<pubDate>Wed, 29 Aug 2018 16:45:56 +0000</pubDate>
				<category><![CDATA[Orion Product Updates]]></category>
		<category><![CDATA[bluetooth]]></category>
		<category><![CDATA[bluetooth le]]></category>
		<category><![CDATA[corebluetooth]]></category>
		<category><![CDATA[ios]]></category>
		<category><![CDATA[mobile development]]></category>
		<category><![CDATA[push to talk]]></category>
		<guid isPermaLink="false">https://www.orionlabs.io/?p=5801</guid>

					<description><![CDATA[<img width="300" height="157" src="https://www.orionlabs.io/wp-content/uploads/2018/08/FbBanner-3-300x157.jpg" class="attachment-medium size-medium wp-post-image" alt="Keeping connected using your Onxy core bluetooth state restoration on our IOS app" decoding="async" srcset="https://www.orionlabs.io/wp-content/uploads/2018/08/FbBanner-3-300x157.jpg 300w, https://www.orionlabs.io/wp-content/uploads/2018/08/FbBanner-3-1024x537.jpg 1024w, https://www.orionlabs.io/wp-content/uploads/2018/08/FbBanner-3-768x402.jpg 768w, https://www.orionlabs.io/wp-content/uploads/2018/08/FbBanner-3-1536x805.jpg 1536w, https://www.orionlabs.io/wp-content/uploads/2018/08/FbBanner-3.jpg 2048w" sizes="(max-width: 300px) 100vw, 300px" /><br><p style="text-align:left;">When you’re using your Onyx to communicate, you expect it to work &#8212; no matter what. For your device to function, the first step is making sure it stays connected to your phone and the Orion app over Bluetooth Low Energy. While your phone manages the Bluetooth connection, our app communicates with your Onyx device. [&#8230;]</p>]]></description>
										<content:encoded><![CDATA[<img width="300" height="157" src="https://www.orionlabs.io/wp-content/uploads/2018/08/FbBanner-3-300x157.jpg" class="attachment-medium size-medium wp-post-image" alt="Keeping connected using your Onxy core bluetooth state restoration on our IOS app" decoding="async" srcset="https://www.orionlabs.io/wp-content/uploads/2018/08/FbBanner-3-300x157.jpg 300w, https://www.orionlabs.io/wp-content/uploads/2018/08/FbBanner-3-1024x537.jpg 1024w, https://www.orionlabs.io/wp-content/uploads/2018/08/FbBanner-3-768x402.jpg 768w, https://www.orionlabs.io/wp-content/uploads/2018/08/FbBanner-3-1536x805.jpg 1536w, https://www.orionlabs.io/wp-content/uploads/2018/08/FbBanner-3.jpg 2048w" sizes="(max-width: 300px) 100vw, 300px" /><br><p style="text-align:left;"><p><em><img decoding="async" class="aligncenter size-full wp-image-5803" src="https://www.orionlabs.io/wp-content/uploads/2018/08/FbBanner-3.jpg" alt="" width="5008" height="2625" srcset="https://www.orionlabs.io/wp-content/uploads/2018/08/FbBanner-3.jpg 2048w, https://www.orionlabs.io/wp-content/uploads/2018/08/FbBanner-3-300x157.jpg 300w, https://www.orionlabs.io/wp-content/uploads/2018/08/FbBanner-3-1024x537.jpg 1024w, https://www.orionlabs.io/wp-content/uploads/2018/08/FbBanner-3-768x402.jpg 768w, https://www.orionlabs.io/wp-content/uploads/2018/08/FbBanner-3-1536x805.jpg 1536w" sizes="(max-width: 5008px) 100vw, 5008px" /></em></p>
<p>When you’re using your <a href="https://orionlabs.io/onyx" target="_blank" rel="noopener">Onyx</a> to communicate, you expect it to work &#8212; no matter what.</p>
<p>For your device to function, the first step is making sure it stays connected to your phone and the Orion app over Bluetooth Low Energy. While your phone manages the Bluetooth connection, our app communicates with your Onyx device. This connection between our app and your device is essential for your Onyx to function properly.</p>
<p>At the same time, the iOS operating system must work to maintain your phone’s battery life. So if you haven’t used our app in a while (especially if you’ve been using other applications that require lots of resources), the app session will be terminated by iOS, which would then sever the connection to your Onyx.</p>
<p>Fortunately, we’ve put work into making everything work seamlessly when this happens &#8212; which is where CoreBluetooth State Restoration comes in.</p>
<p>With CoreBluetooth State Restoration, we hand off the connection to iOS when it terminates our application and let the operating system manage the connection for us while the app is in the “Not Running” state. By transferring the connection instead of breaking it, you won’t feel the shakes, hear the beeps, or see the lights that typically indicate that your Onyx has disconnected.</p>
<p>Next, when you push your Onyx to send a message, our app immediately launches in the background and iOS hands the connection back to us, at which point we send the message in its entirety. This handoff feature gives us a seamless behind-the-scenes link to your Onyx, without dropping the connection or interfering with your work.</p>
<p>CoreBluetooth State Restoration also takes over our reconnection scan, so even if you turn off your Onyx or walk away from your phone, the app relaunches as soon as you turn on your device or walk back into range.</p>
<p>In addition to lots of other work from our iOS and Onyx firmware teams, CoreBluetooth State Restoration is just one part of the bigger picture when it comes to keeping your Onyx connected and functional at all times.</p>
<p>Want to see how it works? <a href="https://itunes.apple.com/us/app/orion-push-to-talk/id984202314?mt=8" target="_blank" rel="noopener">Download the Orion Push to Talk app</a> from the iOS App Store and connect your Onyx. If you don’t have Onyx and want your own, pick up a pair on <a href="https://www.amazon.com/Orion-Labs-Walkie-Talkies-Unlimited/dp/B01G239N06" target="_blank" rel="noopener">Amazon</a>.</p>
</p>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>What Gets Me Up in the Morning?</title>
		<link>https://www.orionlabs.io/what-gets-me-up-in-the-morning/</link>
		
		<dc:creator><![CDATA[Orion Engineering]]></dc:creator>
		<pubDate>Wed, 31 May 2017 20:48:32 +0000</pubDate>
				<category><![CDATA[Orion Product Updates]]></category>
		<guid isPermaLink="false">https://www.orionlabs.io/?p=6005</guid>

					<description><![CDATA[<img width="300" height="209" src="https://www.orionlabs.io/wp-content/uploads/2016/08/help-image-300x209.jpg" class="attachment-medium size-medium wp-post-image" alt="A phone and the Onxy" decoding="async" srcset="https://www.orionlabs.io/wp-content/uploads/2016/08/help-image-300x209.jpg 300w, https://www.orionlabs.io/wp-content/uploads/2016/08/help-image.jpg 538w" sizes="(max-width: 300px) 100vw, 300px" /><br><p style="text-align:left;">Jamirsen Ezell, Firmware Engineer It’s important to me that I work on interesting, challenging projects as an engineer. So, it was great news that when I first joined the Orion Labs team in August of 2016 we were working on an interesting problem: battery life. The amount of time a device can be used before [&#8230;]</p>]]></description>
										<content:encoded><![CDATA[<img width="300" height="209" src="https://www.orionlabs.io/wp-content/uploads/2016/08/help-image-300x209.jpg" class="attachment-medium size-medium wp-post-image" alt="A phone and the Onxy" decoding="async" srcset="https://www.orionlabs.io/wp-content/uploads/2016/08/help-image-300x209.jpg 300w, https://www.orionlabs.io/wp-content/uploads/2016/08/help-image.jpg 538w" sizes="(max-width: 300px) 100vw, 300px" /><br><p style="text-align:left;"><section class="section section--body section--first">
<div class="section-content">
<div class="section-inner sectionLayout--insetColumn">
<h2 id="4585" class="graf graf--p graf-after--figure"><img decoding="async" class="alignleft size-medium wp-image-6006" src="https://www.orionlabs.io/wp-content/uploads/2018/11/Ezell-Jamirsen-200x300.jpeg" alt="" width="200" height="300" srcset="https://www.orionlabs.io/wp-content/uploads/2018/11/Ezell-Jamirsen-200x300.jpeg 200w, https://www.orionlabs.io/wp-content/uploads/2018/11/Ezell-Jamirsen.jpeg 600w" sizes="(max-width: 200px) 100vw, 200px" />Jamirsen Ezell, Firmware Engineer</h2>
<p class="graf graf--p graf-after--figure">It’s important to me that I work on interesting, challenging projects as an engineer. So, it was great news that when I first joined the Orion Labs team in August of 2016 we were working on an interesting problem: battery life.</p>
<p id="393d" class="graf graf--p graf-after--p">The amount of time a device can be used before the battery dies is one of the most important factors in consumer electronics. When I joined Orion, battery life for the <a class="markup--anchor markup--p-anchor" href="/onyx/" target="_blank" rel="nofollow noopener noreferrer">Onyx</a> — a wearable smart walkie-talkie that allows instant voice conversations with other Onyx users — was 6 to 8 hours. However many of our customers, like contractors, are on their feet and away from outlets for 12 hours at a time. To make Onyx work for them, we needed to increase the battery life to at least 12 hours. It took us four months, but we finally cracked it. Let me walk you through our thought process.</p>
<h3 id="8002" class="graf graf--h3 graf-after--p">Estimated Use Model</h3>
<p id="7a09" class="graf graf--p graf-after--h3">At Orion, our estimated use model is 5/5/90. This means the user will be transmitting 5% of the time, receiving 5% of the time, and idle 90% of the time. This was the criteria we used for battery life, based on data from actual Onyx users. Since we estimated the user will be idle 90% of the time, the team focused on reducing power when the device is in that idle state.</p>
<p id="dfef" class="graf graf--p graf-after--p">Originally, we speculated that the Bluetooth system was responsible for draining most of the Onyx’s battery. We talked about changing the connection interval and all kinds of other stuff but quickly realized that we should verify our assumption first.</p>
<h3 id="ad36" class="graf graf--h3 graf-after--p">The Approach</h3>
<p id="31cd" class="graf graf--p graf-after--h3">Our general approach was to first understand which parts of Onyx’s system were drawing the most power, and then determine how to reduce their power consumption. To measure power in the system we used current consumption because power consumption is proportional to the current drawn (P=IV). Total idle current consumption came in at around 42mA. This was rather high and gave us confidence there was some headroom to reduce the draw. After a quick estimate, we realized that to reach our goal we needed to be drawing about 20mA.</p>
<p id="783b" class="graf graf--p graf-after--p">After this first test, we had the total current consumption, but we still needed to isolate subsystems to find where the power was being drawn. The problem then became how do we measure the power each of these subsystems is using? We could just look at datasheets and get an estimate. However, we wanted to be sure before we put any work in.</p>
<p id="d174" class="graf graf--p graf-after--p">The next step was to power on each system one at a time and measure. Right off the bat, however, this technique had a flaw. Some subsystems depend on one another in order to run. Our best option was to use the slice removal, or SR method (yes, I just made that up). We would remove one subsystem, then measure the whole system again. From that exercise, we could infer the power drawn by that subsystem.</p>
<p id="ef4a" class="graf graf--p graf-after--p">We wrote code to shut off each subsystem and used a series of console commands to allow us to toggle these subsystems on and off in real time, giving us the most accurate picture of how current was flowing. As expected, the MCU was the most power hungry, drawing ~20mA of the total 42mA. As mentioned earlier, our hypothesis was that the wireless connection would draw much of the current. It was a good thing that we tested that assumption; we discovered that due to our use of Bluetooth Low Energy (BLE), the connection only drew about 3mA.</p>
<p id="f9f1" class="graf graf--p graf-after--p">We continued to measure and found:</p>
<ul class="postList">
<li id="a4b2" class="graf graf--li graf-after--p">The CPLD drew about 9.3mA</li>
<li id="5aa5" class="graf graf--li graf-after--li">The DSP drew ~8mA</li>
<li id="7b36" class="graf graf--li graf-after--li">The battery monitor and LED controller systems &lt;1mA</li>
</ul>
<p id="7a46" class="graf graf--p graf-after--li">With the battery monitor and LED controller and BLE systems ruled out, we now knew what systems to target.</p>
<h3 id="dba9" class="graf graf--h3 graf-after--p">Tackling the Problem</h3>
<p id="664a" class="graf graf--p graf-after--h3">To start saving power, we looked at the lowest hanging fruit. For us, that was the DSP.</p>
<p id="7416" class="graf graf--p graf-after--p">Knowing the DSP subsystem and looking at the scripts that configure the DSP chip, we knew that the amplifiers driving the speaker, mics, and headset were left on, even while no audio was being recorded or played. A quick test to verify our hunch showed that turning off the amplifiers saved us ~6mA — exactly what we were looking for.</p>
<p id="1aa9" class="graf graf--p graf-after--p">Now, the hard part. The team had to find the timing that would turn the amplifiers back on quickly enough to not disrupt audio actions or headset detection. After a bit of trial and error, we found a good balance of power savings and performance. With the DSP optimized, Onyx had a total current draw of ~36mA, still well above our goal.</p>
<p id="3892" class="graf graf--p graf-after--p">The MCU was next since it drew most of the power. We quickly stumbled onto what seemed like the holy grail. The MCU had a feature to shut down and restart peripherals automatically when the MCU sleeps. We had utilized the sleep ability but were not shutting off the peripherals. After shutting off everything we could — and testing to make sure we didn’t break anything — we saved ~5mA. Still not good enough.</p>
<p id="509f" class="graf graf--p graf-after--p">The next bit looked similar to the exercise we went through earlier: shutting down each peripheral in the MCU individually to figure out what was sucking up all the current. The culprits were the 2 data transfer modules, DMA1 and DMA2. Shutting these modules down, however, basically renders the MCU useless. All the data from the DSP, battery monitor, Bluetooth, and other internal MCU peripherals are transferred over the DMAs. And, in addition to that, the DMAs are meant to be run while the MCU is sleeping, to save time and power.</p>
<p id="3bd4" class="graf graf--p graf-after--p">So we found a clever way to interface with the DMA modules and make sure they were idle before shutting them down, while still starting them up as soon as there was any possibility they will be needed. Now, the final current draw while idle in the MCU is a measly 4.5mA. If you remember, it started around 20mA.</p>
<blockquote id="356b" class="graf graf--pullquote graf-after--p"><p>In the end, Onyx’s total current consumption is between 18–20mA while the device is idle. This gives us about 12.5+ hours of battery life using the 90/10 split model from above.</p></blockquote>
<p id="dd56" class="graf graf--p graf-after--pullquote graf--trailing">This whole process took about four months of work. Despite all of the hard work, it was well worth the learning experience and the results that came from it. But, the Orion Labs team isn’t done yet. Our next goal is 18+ hours of battery life, and we’re moving towards it fast!</p>
<h3>What do you think?</h3>
</div>
</div>
</section>
<section class="section section--body section--last">
<div class="section-content">
<div class="section-inner sectionLayout--insetColumn">
<p id="016d" class="graf graf--p graf--leading">How would you have solved the problem? Let us know on Twitter at <a class="markup--anchor markup--p-anchor" href="https://twitter.com/orionlabs" target="_blank" rel="nofollow noopener noreferrer" data-href="https://twitter.com/orionlabs" data->@OrionLabs</a>.</p>
<p id="5a17" class="graf graf--p graf-after--p graf--trailing">Are you looking for new challenges to tackle? We’re looking for curious problem solvers to join us. Check out our <a class="markup--anchor markup--p-anchor" href="/careers/" target="_blank" rel="nofollow noopener noreferrer" data-href="/careers/">careers page</a> for more information.</p>
</div>
</div>
</section>
</p>]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
