<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: LiveG Technologies</title>
    <description>The latest articles on DEV Community by LiveG Technologies (@liveg).</description>
    <link>https://dev.to/liveg</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F1887%2F6f72d0cf-813b-4e7a-8020-d793464fa5ec.png</url>
      <title>DEV Community: LiveG Technologies</title>
      <link>https://dev.to/liveg</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/liveg"/>
    <language>en</language>
    <item>
      <title>What's new in LiveG OS V0.2.0: multiplatform support and plenty more</title>
      <dc:creator>James Livesey</dc:creator>
      <pubDate>Tue, 29 Aug 2023 10:06:45 +0000</pubDate>
      <link>https://dev.to/liveg/whats-new-in-liveg-os-v020-multiplatform-support-and-plenty-more-14e0</link>
      <guid>https://dev.to/liveg/whats-new-in-liveg-os-v020-multiplatform-support-and-plenty-more-14e0</guid>
      <description>&lt;p&gt;After almost a full year of working on developing new features for LiveG OS, we're excited to announce the latest Alpha release of LiveG OS that is now available for a range of devices, including for the Raspberry Pi, the PinePhone, and both x86-64 and ARM64 computers. This new release realises our goal of making LiveG OS a truly multiplatform operating system, and one of only a few operating systems that can run on both desktop and mobile device form factors.&lt;/p&gt;

&lt;p&gt;Our latest episode of LiveG Showcase demonstrates all the new features included in this new release, which is now available on YouTube. In this post, we'll be giving you a summary of these new features.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/wa5K0FJ_rKk"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Multiplatform support
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JV9DrR27--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ndcikncg0jea17xcwaf1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JV9DrR27--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ndcikncg0jea17xcwaf1.png" alt="A graphic that lists the various devices that are now supported." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This release of LiveG OS is the first to run on the Raspberry Pi. LiveG OS runs particularly well on the Raspberry Pi 4 and the Compute Module 4, but it also runs on the Raspberry Pi 3. The system runs smoothly on the Pi 4 and is more-or-less as fast as it is on conventional x86-64 computers, but you may experience slowness and higher power consumption when running it on older models such as the Pi 3.&lt;/p&gt;

&lt;p&gt;In addition to the Raspberry Pi, LiveG OS now also runs on the PinePhone smartphone by PINE64. This makes LiveG OS officially available for mobile devices alongside the current option for running it on the desktop. LiveG OS won't run on the PinePhone Pro just yet — anyone who wishes to volunteer to bring LiveG OS to the PinePhone Pro should check out our &lt;a href="https://github.com/LiveGTech/OS-Bootstrap"&gt;LiveG OS Bootstrap Toolchain repository on GitHub&lt;/a&gt; and also &lt;a href="https://discord.gg/pTYsJME9xH"&gt;join our Discord community&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can try out this release of LiveG OS now for the Raspberry Pi and PinePhone — and even x86-64 and ARM64 computers — by &lt;a href="https://liveg.tech/os/get"&gt;downloading an OS image for your platform from our website&lt;/a&gt;. It's simple: after downloading the image, use a tool such as &lt;a href="https://etcher.balena.io"&gt;balenaEtcher&lt;/a&gt; or the &lt;a href="https://www.raspberrypi.com/software"&gt;Raspberry Pi Imager&lt;/a&gt; to flash the image onto an SD card, then boot it on your device and follow the setup instructions presented inside LiveG OS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installable web apps
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aSeROaR4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/voo8b6homlundkif7mlh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aSeROaR4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/voo8b6homlundkif7mlh.png" alt="A screenshot of Sphere with the 'install app' menu option open. To the left side, a LiveG Prism is shown with an app being added to the home screen." width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Progressive web apps — or PWAs — can now be installed in LiveG OS thanks to the new option to install websites as web apps in our Sphere web browser. Any website can become an app in LiveG OS, and website can take advantage of extra features such as maskable app icons through the use of a &lt;a href="https://developer.mozilla.org/en-US/docs/Web/Manifest"&gt;web app manifest&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Web apps open up large opportunities that can allow LiveG OS to compete with today's major operating systems, as PWA technologies enable a large range of existing apps to be installed to LiveG OS, such as Mastodon, Twitter, YouTube — and even our own apps, like &lt;a href="https://docs.liveg.tech"&gt;LiveG Docs&lt;/a&gt;. The OS-independent compatibility that web apps have make PWA technologies an ideal platform for LiveG OS, and LiveG OS's own system apps — and even its desktop environment, &lt;a href="https://github.com/LiveGTech/gShell"&gt;gShell&lt;/a&gt; — are themselves made using web technologies.&lt;/p&gt;

&lt;h2&gt;
  
  
  App menu search, power and app sorting options
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5GH14C0s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/027by35hcjqqkag0iqji.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5GH14C0s--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/027by35hcjqqkag0iqji.png" alt="A screenshot of the app menu on the desktop version of LiveG OS. The term 'network' is being searched in the search bar, with suggestions for apps being shown below." width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Apps that are installed now show up in the app menu in LiveG OS. The app menu now also includes a number of useful features that make searching for apps easier. You can now sort apps alphabetically by choosing the &lt;strong&gt;alphabetical view&lt;/strong&gt; option, or you can search for apps by using the search bar.&lt;/p&gt;

&lt;p&gt;App shortcuts also appear when using the search bar, making it easy to access certain features of apps. For example, you can search for network options in Settings by typing 'network' into the search bar.&lt;/p&gt;

&lt;p&gt;Finally, there are options to lock, shut down or restart LiveG OS in the power menu. This removes the need for the LiveG OS Debug Environment to shut down the system, which has now itself been removed in this release.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tab-based interface in Sphere
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uyOCe5DB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x49fgsqs9co0zv94wfwm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uyOCe5DB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/x49fgsqs9co0zv94wfwm.png" alt="A screenshot of Sphere's tab-based interface on both desktop and mobile." width="800" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Browsing the web has become much easier in the Sphere web browser now thanks to the new, tab-based interface in Sphere. The tab-based interface work similarly to what is seen in other modern browsers, allowing users to have multiple webpages open at once without needing to open multiple windows.&lt;/p&gt;

&lt;p&gt;The tab-based interface is also available on mobile by pressing the tab list button. We hope to release an API for the tab-based interface in the future for web apps to allow them to take advantage of this paradigm: for example, the file manager app we hope to release soon would benefit from a tab-based interface to make file management across multiple folders much easier to perform.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gesture-based app switcher navigation on mobile
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ch13ECEX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zqanigjuei61x1wvxgle.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ch13ECEX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zqanigjuei61x1wvxgle.png" alt="A demonstrative screenshot of the app switcher on the mobile version of LiveG OS. Users can swipe up to view the app list, and swipe horizontally to quickly switch between apps." width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On mobile, the app switching experience has been improved through the addition of swipe gestures to quickly jump between apps. Swiping up from the LiveG logo at the bottom now reveals the app list — just like what happens when you double-tap the logo. Swiping left and right on the logo will switch between apps listed adjacently to the current-viewed app without needing to show the app list, reducing the time it takes to switch between apps.&lt;/p&gt;

&lt;p&gt;The addition of this new gesture-based navigation method brings LiveG OS closer to the experiences seen on other major mobile operating systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Update system
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tzDB-gZX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p2rvswqqcblwaau6abxm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tzDB-gZX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p2rvswqqcblwaau6abxm.png" alt="A screenshot of the system updates page in Settings, showing an example update." width="800" height="565"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;LiveG OS now has an update system, making it easier for users to download and install new system updates in the future when they are made available. Users can now update the system through the Settings app, where they can also configure the update circuit under &lt;strong&gt;advanced options&lt;/strong&gt;, allowing them to take advantage of cutting-edge features not yet present in stable releases.&lt;/p&gt;

&lt;p&gt;The update system is designed to not be distracting or disruptive to its users — users can be assured that their system will not restart unless they tell it to, and updates are not forced on users (though users are strongly recommended to update when possible to benefit from security patches). The system is also designed to be robust against unexpected system shutdowns such as power outages with a number of rollback mechanisms implemented to recover the system in these scenarios back to the previous update.&lt;/p&gt;

&lt;h2&gt;
  
  
  New options added to Settings
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1VMGzRph--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hqegvra8o76snwcjyh5p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1VMGzRph--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hqegvra8o76snwcjyh5p.png" alt="A screenshot of the keyboard layout configuration options in Settings on desktop. To the right, a LiveG Prism is shown with the virtual keyboard open." width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Alongside the new update system, we've also added a few additional options to the Settings app to make LiveG OS more useful.&lt;/p&gt;

&lt;p&gt;Users can now configure their Wi-Fi networks and supply authentication options for them, such as Wi-Fi passwords. LiveG OS allows authentication for a range of security standards, including WEP, WPA, WPA2, and the enterprise standards, otherwise known as 802.1x.&lt;/p&gt;

&lt;p&gt;There are also new options to configure the keyboard layout for LiveG OS. This is particularly useful as LiveG OS can already be used in the French language, and so we've needed a way for users to switch to the French AZERTY layout and not just British QWERTY. We've also included support for the US QWERTY layout, as well as Chinese pinyin text entry, which uses the Input Method Editor to provide text suggestions.&lt;/p&gt;

&lt;p&gt;Keyboard layouts also work on mobile, and we hope to soon have a way of quickly switching between layouts without having to go into Settings.&lt;/p&gt;

&lt;p&gt;Another new addition to Settings is our interaction and privacy options. These options make it easier to choose how LiveG OS will interact with our online services, such as when the update system will check for updates. You can choose to enable all the options, which integrates LiveG OS nicely with our online offerings, or if you don't feel you need our online services, then you can switch the options off.&lt;/p&gt;

&lt;h2&gt;
  
  
  LiveG OS Setup improvements
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uFrI8Bwq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yci1mh4lpn28f77vl79v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uFrI8Bwq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yci1mh4lpn28f77vl79v.png" alt="A screenshot of LiveG OS Setup, showing the disk partition options." width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And finally, there have been a few improvements to the out-of-box setup system — or OOBS, as we call it — including another power menu and an accessibility menu for enabling accessibility options such as Switch Navigation while users are setting up their device, in addition to a new setup step for configuring interaction and privacy options so that you can easily turn on or off these options before you use the system.&lt;/p&gt;

&lt;p&gt;Additionally, there are now animated graphics included in the OOBS steps that make setting up LiveG OS just a bit more interesting and visually appealing.&lt;/p&gt;




&lt;h2&gt;
  
  
  Future plans
&lt;/h2&gt;

&lt;p&gt;So that's a run-down of the new features that have been included in LiveG OS — no wonder it's been a while since our last release. However, we recognise that there is still a lot to be done to LiveG OS before it becomes daily-drivable.&lt;/p&gt;

&lt;p&gt;Our main focus for developing the next update will be to build some new system apps, such as a calculator; a file manager; apps with cellular features such as SMS texting and phone calling; and a few other useful tools that will bring LiveG OS in-line with other systems functionality-wise.&lt;/p&gt;

&lt;p&gt;It's also worth noting some of our 'side projects' that we've been working on for LiveG OS, and we're excited to be integrating them fully into the system soon: these are the &lt;a href="https://github.com/LiveGTech/Typeset-Engine"&gt;Typeset Engine&lt;/a&gt; code editor that we hope to integrate into an IDE; &lt;a href="https://search.liveg.tech"&gt;LiveG Search&lt;/a&gt; that will soon be getting a new crawling and indexing system; and &lt;a href="https://github.com/LiveGTech/Formulaic"&gt;Formulaic&lt;/a&gt;, our expression evaluation engine that we hope to implement into a system calculator app.&lt;/p&gt;

&lt;p&gt;It's a bit early to say this just now, but we're thinking about also integrating Linux apps into LiveG OS, so you can easily use your favourite Linux applications right in gShell, much like you can do on ChromeOS. I know that once this feature has been implemented, I'd definitely install LiveG OS onto my next laptop and use it for everything! We might not see this for version 0.3.0, but it's certainly on our radar.&lt;/p&gt;




&lt;p&gt;So, that's a look at some of the new features in the latest Alpha release of LiveG OS. You can &lt;a href="https://liveg.tech/os/get"&gt;download LiveG OS&lt;/a&gt; now, which is available in English and French for a variety of platforms.&lt;/p&gt;

&lt;p&gt;You can support us financially by &lt;a href="https://opencollective.com/liveg"&gt;donating to our Open Collective&lt;/a&gt;, where we use the donations we get to advance our projects. You can also support us by joining our &lt;a href="https://discord.gg/pTYsJME9xH"&gt;Discord community&lt;/a&gt; where you can help us with the development of our projects.&lt;/p&gt;

&lt;p&gt;Follow us on &lt;a href="https://mastodon.social/@liveg"&gt;Mastodon&lt;/a&gt; and &lt;a href="https://twitter.com/LiveGTech"&gt;Twitter&lt;/a&gt; to keep in the loop with the latest updates to all our projects, and subscribe to &lt;a href="https://youtube.com/@liveg"&gt;our YouTube channel&lt;/a&gt; where you can find videos on various aspects of LiveG, including release announcements and development guides.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was originally posted on &lt;a href="https://liveg.tech/blog/en/new-in-os-0-2-0"&gt;The LiveG Blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>os</category>
      <category>mobile</category>
      <category>webdev</category>
      <category>linux</category>
    </item>
    <item>
      <title>LiveG OS: how we built our own multiplatform operating system</title>
      <dc:creator>James Livesey</dc:creator>
      <pubDate>Fri, 04 Nov 2022 13:20:00 +0000</pubDate>
      <link>https://dev.to/liveg/liveg-os-how-we-built-our-own-multiplatform-operating-system-afa</link>
      <guid>https://dev.to/liveg/liveg-os-how-we-built-our-own-multiplatform-operating-system-afa</guid>
      <description>&lt;p&gt;Some time ago, we released our first edition of &lt;a href="https://liveg.tech/os" rel="noopener noreferrer"&gt;LiveG OS&lt;/a&gt;, an open-source operating system that is designed to run on both desktop and mobile devices.&lt;/p&gt;

&lt;p&gt;It's based on a modified version of Debian Linux with our own web-based desktop environment on top, and is designed to run Progressive Web Apps in a more integrated experience than what other operating systems provide.&lt;/p&gt;

&lt;p&gt;You can learn more about the OS on mobile devices on our last post, &lt;a href="https://dev.to/liveg/project-prism-on-the-road-to-building-an-open-smartphone-50lg"&gt;&lt;em&gt;Project Prism: on the road to building an open smartphone&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In this post, we're going to show you how we built our OS, from downloading the initial Debian base image to producing a full ISO file that can be distributed and loaded onto installation media such as USB drives to run on real hardware. We also have a LiveG Developer Guide on YouTube that gives a more in-depth explanation of how we do this:&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/7W0Q7ZuoAUI"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Right now, our OS only supports modern PCs running x86-64 processors (so your typical Intel or AMD processor of today). You can &lt;a href="https://liveg.tech/os/get" rel="noopener noreferrer"&gt;download a copy of LiveG OS&lt;/a&gt; right now to try out on modern PC platforms — or in a virtual machine on QEMU or VirtualBox, but it's still in an early Alpha stage, so don't expect it to do too much yet (there's still a lot of missing features).&lt;/p&gt;

&lt;p&gt;For platforms such as the PinePhone or Raspberry Pi, we're planning to bring support to these devices over the next few weeks. Exciting stuff indeed!&lt;/p&gt;




&lt;p&gt;With all that talk about LiveG OS out of the way, let's dive into how we actually &lt;em&gt;build&lt;/em&gt; LiveG OS!&lt;/p&gt;

&lt;h2&gt;
  
  
  Building our desktop environment
&lt;/h2&gt;

&lt;p&gt;Our desktop environment, &lt;a href="https://github.com/LiveGTech/gShell" rel="noopener noreferrer"&gt;gShell&lt;/a&gt;, is what provides a user interface that the user can interact with. Being written as an Electron app itself, it's the part that also runs the Progressive Web Apps inside &lt;code&gt;webview&lt;/code&gt; elements.&lt;/p&gt;

&lt;p&gt;I won't go too much into gShell's architecture, but for the purposes of this post, all you need to know is that we build an AppImage file using &lt;a href="https://electron.build" rel="noopener noreferrer"&gt;&lt;code&gt;electron-builder&lt;/code&gt;&lt;/a&gt; to supply that file to our OS bootstrapping process (which is what we'll be moving onto next).&lt;/p&gt;

&lt;h2&gt;
  
  
  Building the OS itself
&lt;/h2&gt;

&lt;p&gt;The OS build process is all automated, and relies on a bunch of bash scripts so that we can make a reproducible and robust copy of LiveG OS everytime we run them. This also lets us make different builds for different platforms while still producing a similar end result.&lt;/p&gt;

&lt;p&gt;We keep all of those bash scripts in a &lt;a href="https://github.com/LiveGTech/OS-Bootstrap" rel="noopener noreferrer"&gt;GitHub repository&lt;/a&gt;, alongside all the other useful files (mainly for configuring parts of Debian) needed to build a complete operating system. There's a bunch of information on how to build LiveG OS yourself in its readme.&lt;/p&gt;

&lt;p&gt;In short, we essentially run this command in bash to start building everything:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./bootstrap.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it — we can then sit back, and relax! Let's take a look at what this script exactly does by breaking it up into  a series of simple steps:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Determine what platform to build for
&lt;/h3&gt;

&lt;p&gt;Like I said earlier, we're hoping to support various platforms very soon, like the PinePhone and Raspberry Pi — in addition to our currently-supported x86-64 version.&lt;/p&gt;

&lt;p&gt;Our &lt;a href="https://github.com/LiveGTech/OS-Bootstrap/blob/multiplatform-support/bootstrap.sh" rel="noopener noreferrer"&gt;&lt;code&gt;bootstrap.sh&lt;/code&gt; file&lt;/a&gt; handles this by storing what platform we want to build for (as well as the architecture and QEMU emulation info) in a bunch of global variables. We can choose what platform to build for by passing it as the first argument to the script's command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PLATFORM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"x86_64"&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;QEMU_ARGS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s2"&gt;""&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PLATFORM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;
&lt;span class="k"&gt;fi

case&lt;/span&gt; &lt;span class="nv"&gt;$PLATFORM&lt;/span&gt; &lt;span class="k"&gt;in
    &lt;/span&gt;x86_64&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ARCH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"x86_64"&lt;/span&gt;
        &lt;span class="p"&gt;;;&lt;/span&gt;

    &lt;span class="k"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Invalid platform specified"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&amp;amp;2
        &lt;span class="nb"&gt;exit &lt;/span&gt;1
        &lt;span class="p"&gt;;;&lt;/span&gt;
&lt;span class="k"&gt;esac&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$2&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;"--env-only"&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
    &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Applied environment variables for execution of other scripts only"&lt;/span&gt;
    &lt;span class="k"&gt;return
fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Start a web server so that QEMU can access files
&lt;/h3&gt;

&lt;p&gt;We use QEMU to virtualise the system so that we can test it out and also configure it and set it up during the build process. One thing that we need to be able to do is let our virtual machine access our host's files. The way to do that is to start a web server that can be accessed over the local network by the virtual machine.&lt;/p&gt;

&lt;p&gt;This web server is started when &lt;code&gt;bootstrap.sh&lt;/code&gt; calls &lt;a href="https://github.com/LiveGTech/OS-Bootstrap/blob/multiplatform-support/server.sh" rel="noopener noreferrer"&gt;&lt;code&gt;server.sh&lt;/code&gt;&lt;/a&gt;, which starts the server in the background:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;pushd &lt;/span&gt;host/&lt;span class="nv"&gt;$PLATFORM&lt;/span&gt;
    pkill &lt;span class="nt"&gt;-f&lt;/span&gt; &lt;span class="s2"&gt;"python3 -m http.server"&lt;/span&gt;
    python3 &lt;span class="nt"&gt;-m&lt;/span&gt; http.server 8000 &amp;amp;
&lt;span class="nb"&gt;popd&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We then continue through &lt;code&gt;bootstrap.sh&lt;/code&gt; as soon as the server has started.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Download a minimal base copy of Debian
&lt;/h3&gt;

&lt;p&gt;Since LiveG OS is based off of Debian, we need to grab a copy of it so that we can make our own customisations off of it. We just simply use &lt;code&gt;wget&lt;/code&gt; to download the Debian installer ISO file into a repo folder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; cache/&lt;span class="nv"&gt;$PLATFORM&lt;/span&gt;
wget &lt;span class="nt"&gt;-nc&lt;/span&gt; https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-11.5.0-amd64-netinst.iso &lt;span class="nt"&gt;-O&lt;/span&gt; cache/&lt;span class="nv"&gt;$PLATFORM&lt;/span&gt;/base.iso
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Boot the base copy of Debian and install it onto a new virtual disk
&lt;/h3&gt;

&lt;p&gt;Once we've got our copy of the Debian installer downloaded, we need to run it in a QEMU virtual machine and install it onto a new virtual disk. This is done in &lt;a href="https://github.com/LiveGTech/OS-Bootstrap/blob/multiplatform-support/boot.sh" rel="noopener noreferrer"&gt;&lt;code&gt;boot.sh&lt;/code&gt;&lt;/a&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;    &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Creating new base installed image (this might take about 30 minutes or longer)..."&lt;/span&gt;

    qemu-img create build/&lt;span class="nv"&gt;$PLATFORM&lt;/span&gt;/system.img 4G

    ./bootkeys.sh &amp;amp;

    qemu-system-&lt;span class="nv"&gt;$ARCH&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;-enable-kvm&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;-m&lt;/span&gt; 1G &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;-cdrom&lt;/span&gt; cache/&lt;span class="nv"&gt;$PLATFORM&lt;/span&gt;/base.iso &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;-hda&lt;/span&gt; build/&lt;span class="nv"&gt;$PLATFORM&lt;/span&gt;/system.img &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;-netdev&lt;/span&gt; user,id&lt;span class="o"&gt;=&lt;/span&gt;net0,hostfwd&lt;span class="o"&gt;=&lt;/span&gt;tcp::8002-:8000 &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;-device&lt;/span&gt; virtio-net-pci,netdev&lt;span class="o"&gt;=&lt;/span&gt;net0 &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nt"&gt;-monitor&lt;/span&gt; tcp:127.0.0.1:8001,server,nowait &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nv"&gt;$QEMU_ARGS&lt;/span&gt;

    &lt;span class="nb"&gt;cp &lt;/span&gt;build/&lt;span class="nv"&gt;$PLATFORM&lt;/span&gt;/system.img cache/&lt;span class="nv"&gt;$PLATFORM&lt;/span&gt;/baseinstall.img
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This takes about 30 minutes to go through installation without KVM, but if you've got KVM enabled, then it only takes about 4 minutes. It's worth enabling KVM for!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2FJmvjXHn%2FScreenshot-from-2022-11-04-12-39-57.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2FJmvjXHn%2FScreenshot-from-2022-11-04-12-39-57.png" alt="Running the Debian installer"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;center&gt;&lt;small&gt;Running the Debian installer&lt;/small&gt;&lt;/center&gt;
&lt;br&gt;

&lt;p&gt;Don't forget that this is all automated — we as the developer don't need to touch a single thing. The way we do this is provide a preseed file, &lt;a href="https://github.com/LiveGTech/OS-Bootstrap/blob/multiplatform-support/host/x86_64/preseed.cfg" rel="noopener noreferrer"&gt;&lt;code&gt;preseed.cfg&lt;/code&gt;&lt;/a&gt; to the virtual machine that the Debian installer uses to automatically provision the system. Without this, we'd have to manually enter what username and password we want to use, what timezone we are in, what network interfaces to enable, and so on — we don't want to have to do that every time...&lt;/p&gt;
&lt;h3&gt;
  
  
  5. Mount the virtual disk and add some files to it
&lt;/h3&gt;

&lt;p&gt;We next need to mount the disk so that we can change some of its files and add a script that runs at startup. This is done in the &lt;code&gt;boot.sh&lt;/code&gt; script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Mounting disk image to &lt;/span&gt;&lt;span class="se"&gt;\`&lt;/span&gt;&lt;span class="s2"&gt;build/&lt;/span&gt;&lt;span class="nv"&gt;$PLATFORM&lt;/span&gt;&lt;span class="s2"&gt;/rootfs&lt;/span&gt;&lt;span class="se"&gt;\`&lt;/span&gt;&lt;span class="s2"&gt;..."&lt;/span&gt;

&lt;span class="nb"&gt;sudo &lt;/span&gt;umount build/&lt;span class="nv"&gt;$PLATFORM&lt;/span&gt;/rootfs &lt;span class="o"&gt;||&lt;/span&gt; /bin/true
&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; build/&lt;span class="nv"&gt;$PLATFORM&lt;/span&gt;/rootfs
&lt;span class="nb"&gt;sudo &lt;/span&gt;mount &lt;span class="nt"&gt;-o&lt;/span&gt; loop,offset&lt;span class="o"&gt;=&lt;/span&gt;1048576 build/&lt;span class="nv"&gt;$PLATFORM&lt;/span&gt;/system.img build/&lt;span class="nv"&gt;$PLATFORM&lt;/span&gt;/rootfs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can then write files to the mount point and they'll be saved to the virtual disk image file upon unmounting.&lt;/p&gt;

&lt;p&gt;After mounting the disk, we write some files to it, including ones to automatically log in the default user account (so that we can then start up our desktop environment), to change the hostname, as well as to change some branding details:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo tee &lt;/span&gt;build/&lt;span class="nv"&gt;$PLATFORM&lt;/span&gt;/rootfs/etc/issue &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
LiveG OS &lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt; &lt;/span&gt;&lt;span class="se"&gt;\l&lt;/span&gt;&lt;span class="sh"&gt;
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="nb"&gt;sudo tee &lt;/span&gt;build/&lt;span class="nv"&gt;$PLATFORM&lt;/span&gt;/rootfs/etc/os-release &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
NAME="LiveG OS"
VERSION="0.2.0"
ID="livegos"
ID_LIKE="debian"
PRETTY_NAME="LiveG OS V0.2.0"
VERSION_ID="0"
HOME_URL="https://liveg.tech/os"
SUPPORT_URL="https://docs.liveg.tech/?product=os"
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We also copy &lt;a href="https://github.com/LiveGTech/OS-Bootstrap/blob/multiplatform-support/firstboot.sh" rel="noopener noreferrer"&gt;&lt;code&gt;firstboot.sh&lt;/code&gt;&lt;/a&gt; to the mount point and configure the system so that the next time we boot it up, the &lt;code&gt;firstboot.sh&lt;/code&gt; script is run (this lets us perform further customisations that are only possible when the system is booted):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo cp &lt;/span&gt;firstboot.sh build/&lt;span class="nv"&gt;$PLATFORM&lt;/span&gt;/rootfs/root/firstboot.sh

&lt;span class="nb"&gt;sudo tee&lt;/span&gt; &lt;span class="nt"&gt;-a&lt;/span&gt; build/&lt;span class="nv"&gt;$PLATFORM&lt;/span&gt;/rootfs/root/.bashrc &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
./firstboot.sh
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, we unmount the virtual disk image so that we can boot it.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Start up the system and execute the &lt;code&gt;firstboot.sh&lt;/code&gt; script
&lt;/h3&gt;

&lt;p&gt;We start up the system, again in &lt;code&gt;boot.sh&lt;/code&gt;, by executing this QEMU command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;qemu-system-&lt;span class="nv"&gt;$ARCH&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-enable-kvm&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-m&lt;/span&gt; 1G &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-hda&lt;/span&gt; build/&lt;span class="nv"&gt;$PLATFORM&lt;/span&gt;/system.img &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-netdev&lt;/span&gt; user,id&lt;span class="o"&gt;=&lt;/span&gt;net0,hostfwd&lt;span class="o"&gt;=&lt;/span&gt;tcp::8002-:8000 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-device&lt;/span&gt; virtio-net-pci,netdev&lt;span class="o"&gt;=&lt;/span&gt;net0 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nv"&gt;$QEMU_ARGS&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This script installs some necessary dependencies via APT for our desktop environment to work. It also adds our very own &lt;a href="https://opensource.liveg.tech/liveg-apt" rel="noopener noreferrer"&gt;LiveG APT Repository&lt;/a&gt; that we maintain to install packages not present in the Debian APT repo, including custom Linux kernel builds for devices such as PinePhones.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2Fn77RCgV%2FScreenshot-from-2022-11-03-18-12-28.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2Fn77RCgV%2FScreenshot-from-2022-11-03-18-12-28.png" alt="Booting up in QEMU with the  raw `firstboot.sh` endraw  script running"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;center&gt;&lt;small&gt;Booting up in QEMU with the &lt;code&gt;firstboot.sh&lt;/code&gt; script running&lt;/small&gt;&lt;/center&gt;
&lt;br&gt;

&lt;p&gt;The script also copies in the AppImage binary for our desktop environment itself, as well as some &lt;a href="https://github.com/LiveGTech/OS-Bootstrap/blob/multiplatform-support/host/x86_64/grub.cfg" rel="noopener noreferrer"&gt;config files for GRUB&lt;/a&gt; and &lt;a href="https://github.com/LiveGTech/OS-Bootstrap/blob/multiplatform-support/host/x86_64/fstab" rel="noopener noreferrer"&gt;fstab&lt;/a&gt; that are copied during the LiveG OS Out-of-Box Setup process when you want to install LiveG OS to an internal storage device.&lt;/p&gt;

&lt;p&gt;The script finally cleans up some parts of the system, which essentially consists of changing config files to prevent itself from running at startup at the next boot, and instead starting the desktop environment at boot. The system then shuts down so that &lt;code&gt;bootstrap.sh&lt;/code&gt; can continue.&lt;/p&gt;
&lt;h3&gt;
  
  
  7. Mount the virtual disk again to copy more config files
&lt;/h3&gt;

&lt;p&gt;This stage copies config files to the virtual disk, which includes &lt;a href="https://github.com/LiveGTech/OS-Bootstrap/blob/multiplatform-support/host/x86_64/isogrub.cfg" rel="noopener noreferrer"&gt;&lt;code&gt;isogrub.cfg&lt;/code&gt;&lt;/a&gt;, which configures GRUB to boot correctly in a Live CD/ISO environment, as well as &lt;a href="https://github.com/LiveGTech/OS-Bootstrap/blob/multiplatform-support/host/x86_64/isofstab" rel="noopener noreferrer"&gt;&lt;code&gt;isofstab&lt;/code&gt;&lt;/a&gt; and the &lt;a href="https://github.com/LiveGTech/OS-Bootstrap/blob/multiplatform-support/host/x86_64/initoverlay.sh" rel="noopener noreferrer"&gt;&lt;code&gt;initoverlay.sh&lt;/code&gt;&lt;/a&gt; script. This is all done inside the &lt;a href="https://github.com/LiveGTech/OS-Bootstrap/blob/multiplatform-support/makeiso.sh" rel="noopener noreferrer"&gt;&lt;code&gt;makeiso.sh&lt;/code&gt;&lt;/a&gt; script run by the host machine.&lt;/p&gt;

&lt;p&gt;This process of making an ISO file is not required for some platforms — for the PinePhone and Raspberry Pi, we won't need to build an ISO file, since the virtual disk image will be copied directly onto an SD card or eMMC storage and is bootable from there.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;initoverlay.sh&lt;/code&gt; is very important for the ISO file to be able to run — the ISO image's filesystem is read-only, which makes starting our desktop environment (to perform installation by the user onto a target disk) difficult. This script adds a filesystem overlay mapped to &lt;code&gt;/tmp&lt;/code&gt; to make the whole root filesystem temporarily writeable. All changes are discarded in the ISO environment when the system shuts down, but being temporarily writeable to RAM is useful for running certain programs.&lt;/p&gt;
&lt;h3&gt;
  
  
  8. Produce an ISO image with GRUB on it
&lt;/h3&gt;

&lt;p&gt;We finally need to package the mounted root filesystem from the host into one distributable ISO file. This is done by running &lt;code&gt;grub-mkrescue&lt;/code&gt; in &lt;code&gt;makeiso.sh&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;grub-mkrescue &lt;span class="nt"&gt;-o&lt;/span&gt; build/&lt;span class="nv"&gt;$PLATFORM&lt;/span&gt;/system.iso build/&lt;span class="nv"&gt;$PLATFORM&lt;/span&gt;/rootfs &lt;span class="nt"&gt;--directory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;build/&lt;span class="nv"&gt;$PLATFORM&lt;/span&gt;/rootfs/usr/lib/grub/i386-pc &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-volid&lt;/span&gt; LiveG-OS-IM &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-chmod&lt;/span&gt; a+rwx,g-w,o-w,ug+s,+t,g-s,-t /usr/bin/sudo &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-chmod&lt;/span&gt; a+rwx /usr/sbin/initoverlay &lt;span class="nt"&gt;--&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It also gives the ISO a volume name of &lt;code&gt;LiveG-OS-IM&lt;/code&gt; so that it can be identified by GRUB later on, and it also changes permissions for the &lt;code&gt;sudo&lt;/code&gt; and &lt;code&gt;initoverlay&lt;/code&gt; commands so that they can be executed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2FYjrWdmB%2FScreenshot-from-2022-11-04-13-09-51.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ibb.co%2FYjrWdmB%2FScreenshot-from-2022-11-04-13-09-51.png" alt="The final ISO image running in QEMU"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;center&gt;&lt;small&gt;The final ISO image running in QEMU&lt;/small&gt;&lt;/center&gt;
&lt;br&gt;



&lt;p&gt;That's it! If you wish to use any of this code (you're welcome to use it for your own projects), then be sure to make it available under the &lt;a href="https://github.com/LiveGTech/OS-Bootstrap/blob/main/LICENCE.md" rel="noopener noreferrer"&gt;LiveG Open-Source Licence&lt;/a&gt; — AKA attribute us and also provide a copy of the licence alongside your own code.&lt;/p&gt;

&lt;p&gt;I hope you've enjoyed reading up on how we build LiveG OS, and I'll be looking forward to releasing downloads for the OS for PinePhones and Raspberry Pis soon!&lt;/p&gt;

&lt;p&gt;In the meantime, you can visit our &lt;a href="https://github.com/LiveGTech" rel="noopener noreferrer"&gt;GitHub organisation&lt;/a&gt; to see our various ongoing projects. You can also find us on &lt;a href="https://twitter.com/LiveGTech" rel="noopener noreferrer"&gt;Twitter&lt;/a&gt; or &lt;a href="https://mastodon.social/@liveg" rel="noopener noreferrer"&gt;Mastodon&lt;/a&gt;, and you can join us on &lt;a href="https://discord.gg/pTYsJME9xH" rel="noopener noreferrer"&gt;Discord&lt;/a&gt; where we have a weekly meeting on Tuesdays on what we're planning to do next with LiveG. We've got plenty of videos on LiveG OS on &lt;a href="https://youtube.com/@liveg" rel="noopener noreferrer"&gt;YouTube&lt;/a&gt; to watch, and if you're wanting to support us, the best way to do that is to donate to our &lt;a href="https://opencollective.com/liveg" rel="noopener noreferrer"&gt;Open Collective&lt;/a&gt;. All of this info is available on our website, &lt;a href="https://liveg.tech" rel="noopener noreferrer"&gt;liveg.tech&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Thanks for reading, and we'll see you soon!&lt;/p&gt;

</description>
      <category>os</category>
      <category>desktop</category>
      <category>webdev</category>
      <category>linux</category>
    </item>
    <item>
      <title>Project Prism: architecture overview</title>
      <dc:creator>tramcrazy</dc:creator>
      <pubDate>Fri, 08 Apr 2022 15:42:08 +0000</pubDate>
      <link>https://dev.to/liveg/project-prism-architecture-overview-278g</link>
      <guid>https://dev.to/liveg/project-prism-architecture-overview-278g</guid>
      <description>&lt;p&gt;Earlier this week, our CEO James wrote about our ambitious plans to build a truly open smartphone - based on web technologies. This is the first in a series of posts about the project, where we'll be covering our progress on different sections of this complex project. If you haven't read that first post, you should do so now - then you'll have a better understanding of our project.&lt;br&gt;
&lt;a href="https://dev.to/liveg/project-prism-on-the-road-to-building-an-open-smartphone-50lg"&gt;Read the post here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Before we get started...&lt;br&gt;
Hi! My name is tramcrazy, and I am CISO at LiveG. That means that I oversee all our cybersecurity systems and check code for issues. I also work on documentation.&lt;/p&gt;

&lt;p&gt;At the foundation of gShell (the software running on the Prism) is Linux. We love Linux's open-source nature and the huge community that has grown around it in the last 30 years. It was the sensible choice for Prism. The specific version of Linux running on Prism is Mobian (&lt;a href="https://mobian-project.org/"&gt;mobian-project.org&lt;/a&gt;), which is a version of Debian designed for mobile phones. The underlying OS of Mobian could change in the future, because gShell runs in Electron which works on all operating systems.&lt;/p&gt;

&lt;p&gt;Above Mobian is the X11 window system. This is the graphical user interface (GUI) of choice on Prism, and provides the desktop environment needed for gShell to function.&lt;/p&gt;

&lt;p&gt;Above Mobian and X11, we have gShell itself. This runs in an Electron runtime which uses HTML, CSS and JS to provide a full mobile experience, along with NodeJS for the backend.&lt;/p&gt;

&lt;p&gt;This is the full hierarchy of the Prism phone's OS, with extra explanation where needed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Linux Kernel
 L X11 Xsession
   L gShell (Electron runtime)
     L OOBS (Out-of-box setup) - a first-time setup menu like the ones you might be familiar with on iOS or Android.
       L Basic power menu - a simple power menu providing options to shutdown or reboot.
     L Lock screen - a screen showing the current time, the user's background, and notifications. It also checks the password and switches to the user environment.
       L Notifications - a standard notifications drawer with various messages, some with actions to be performed inside the user environment.
       L Incoming call screen - this pops up when somebody is calling you, and handles the UI during the call.
       L Basic power menu
     L User environment - the environment used by the user once they have unlocked their phone. This lets the user open apps and perform other functions.
       L User-specific power menu - this is based on the basic power menu, but it includes time-critical functions like showing a bus pass or paying for an item.
       L Home screen - this screen lets the user launch apps, and its appearance can be customised.
       L Notifications
       L Incoming call screen
       L App switcher - this lets the user switch between running apps, and it contains the running apps inside webview tags.
         L Running privileged system apps - these are special apps which do not run inside webviews and have full access to the system, including managing system settings and displaying child webpages with no restrictions.
           L (example) Settings
           L (example) Sphere browser
         L Running unprivileged apps - these are standard apps, running inside webview tags, and they use an API to request permissions from the user. Often, these are third-party apps.
           L (example) Calculator
           L (example) Notes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As you can see, the architecture of gShell is complex and uses multiple layers. If you have any questions, leave them in the comments. You could also check out our gShell repository &lt;a href="https://github.com/LiveGTech/gShell"&gt;on GitHub&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>pwa</category>
      <category>webdev</category>
      <category>a11y</category>
    </item>
    <item>
      <title>Project Prism: on the road to building an open smartphone</title>
      <dc:creator>James Livesey</dc:creator>
      <pubDate>Wed, 06 Apr 2022 10:35:44 +0000</pubDate>
      <link>https://dev.to/liveg/project-prism-on-the-road-to-building-an-open-smartphone-50lg</link>
      <guid>https://dev.to/liveg/project-prism-on-the-road-to-building-an-open-smartphone-50lg</guid>
      <description>&lt;p&gt;That's right ⁠— we're on an ambitious plan to build an open smartphone that puts Progressive Web Apps (PWAs) at the core of our ecosystem. Check out our video for an in-depth review of our project so far:&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/pmOR2J9fDZM"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  How are you making this?
&lt;/h2&gt;

&lt;p&gt;Currently, the Prism is based on the PinePhone, with a few modifications to the hardware (the back shell is one of the main customisations to the phone, allowing you to see inside), in addition to the software (using our own Linux-based mobile operating system).&lt;/p&gt;

&lt;p&gt;We 3D-printed the back case, which admittedly took quite a few attempts; but the end result is awesome!&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1492914671569063949-597" src="https://platform.twitter.com/embed/Tweet.html?id=1492914671569063949"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1492914671569063949-597');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1492914671569063949&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;The main interface uses our own user environment, called &lt;a href="https://github.com/LiveGTech/gShell" rel="noopener noreferrer"&gt;gShell&lt;/a&gt;. It uses &lt;a href="https://github.com/LiveGTech/Adapt-UI" rel="noopener noreferrer"&gt;Adapt UI&lt;/a&gt; (&lt;a href="https://livegtech.github.io/Adapt-UI/demos/all/" rel="noopener noreferrer"&gt;web demo&lt;/a&gt;), which is the user interface design language and framework which we developed in-house over the course of a few months.&lt;/p&gt;

&lt;p&gt;gShell itself is essentially just a really complex single-page website, all running locally inside an Electron process. This not only simplifies development and allows us to quickly prototype designs, but it also provides good support for animations and all of the polish that you'd expect on the modern smartphones of today.&lt;/p&gt;

&lt;p&gt;I took a few photos and posted them on Twitter to show you what gShell looks like in real life:&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1492916198442422276-474" src="https://platform.twitter.com/embed/Tweet.html?id=1492916198442422276"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1492916198442422276-474');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1492916198442422276&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;Of course, being Electron, it is possible to run gShell in its simulator mode on a desktop. This makes prototyping iterations of gShell and its associated apps much easier, and as a result, much faster; simply because it's more convenient to launch gShell on a development machine than it is to update the actual Prism itself to perform a very short test.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc9eykj5lb42xmhr6s8o3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc9eykj5lb42xmhr6s8o3.png" alt="A screenshot of the gShell simulator in a desktop environment"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Accessibility
&lt;/h2&gt;

&lt;p&gt;As with the physical world, accessibility is also extremely important in the digital world, too. Ensuring that both software and hardware is usable by everyone is a key aspect of developing successful products, and failing to do so can cause users to be excluded from being able to effectively operate your platform.&lt;/p&gt;

&lt;p&gt;It's no wonder that we have baked accessibility support right into the Prism from the very start of our project: we've been ensuring that our product will be accessible for future assistive technologies that we will later build into gShell. However, it's not just ensuring compatibility that's important: we've also added some accessibility features into the phone from early on in order to ensure that the whole user interface is usable in its current state.&lt;/p&gt;

&lt;p&gt;We've built in an often-overlooked assistive technology that often gets neglected in upcoming operating systems: Switch Navigation. It essentially allows the user to control their whole device using just at least one button, known as a switch. A demonstration of it is available at &lt;a href="https://youtu.be/pmOR2J9fDZM?t=909" rel="noopener noreferrer"&gt;15:09&lt;/a&gt; in our video.&lt;/p&gt;

&lt;p&gt;Here's a photo of what one of the features of Switch Navigation looks like:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0airr4192xi14sedkegd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0airr4192xi14sedkegd.png" alt="Switch Navigation in use on the Prism"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The implementation of Switch Navigation in gShell has been inspired by quadriplegic YouTuber &lt;a href="https://www.youtube.com/user/icdhills" rel="noopener noreferrer"&gt;Christopher Hills&lt;/a&gt;, who makes extensive use of iOS's &lt;a href="https://support.apple.com/en-gb/HT201370" rel="noopener noreferrer"&gt;Switch Control&lt;/a&gt; feature daily. Switch Control in iOS provides very similar functionality to our Switch Navigation. Christopher's videos have been monumental at raising awareness of this versatile assistive technology, which has enabled him to pilot drones, edit and produce production-quality videos, and more. His videos have given us a great insight into the daily uses of Switch Control, which we hope to integrate into Switch Navigation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Localisation
&lt;/h2&gt;

&lt;p&gt;Localisation is also an important part of platform development, since it allows users who speak languages other than English to use our products, and truly make our products globally usable. Our main methods of localisation are through the Adapt UI framework, which provides the localisation infrastructure needed to translate our apps and make them available in different locales.&lt;/p&gt;

&lt;p&gt;Adapt UI also ensures that apps and systems are laid out according to the rules of selected languages — in Arabic, for example, text is written from right to left, and so we need to factor this into our layout when Arabic is selected:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu9kd0ydx4yz31l71ezv7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu9kd0ydx4yz31l71ezv7.png" alt="A screenshot of the Adapt UI localisation demo in Arabic"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feel free to &lt;a href="https://livegtech.github.io/Adapt-UI/demos/l10n/" rel="noopener noreferrer"&gt;play around with our localisation demo&lt;/a&gt; and see how the layout changes depending on the language chosen!&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This is a brief overview of Project Prism so far. I go much more in-depth in the video at the start of this post, so be sure to check it out!&lt;/p&gt;

&lt;p&gt;If you'd like, come and visit our &lt;a href="https://github.com/LiveGTech" rel="noopener noreferrer"&gt;GitHub organisation&lt;/a&gt; to see our various ongoing projects with regards to the Prism. Why not star a few of our repos you find interesting — or, if you're keen — contribute to our projects? Your contributions are welcome; even if they are simple bug reports or documentation enhancements!&lt;/p&gt;

&lt;p&gt;That's about it — thanks for reading about LiveG Project Prism!&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>pwa</category>
      <category>webdev</category>
      <category>a11y</category>
    </item>
  </channel>
</rss>
