<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.asteroidos.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Beroset</id>
	<title>AsteroidOS - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.asteroidos.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Beroset"/>
	<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php/Special:Contributions/Beroset"/>
	<updated>2026-10-05T04:29:37Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Installing_the_SDK&amp;diff=1045</id>
		<title>Installing the SDK</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Installing_the_SDK&amp;diff=1045"/>
		<updated>2026-09-11T20:58:39Z</updated>

		<summary type="html">&lt;p&gt;Beroset: changed qt5 references to qt6&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Developers]]&lt;br /&gt;
The Software Development Kit (SDK) for AsteroidOS is a set of tools and libraries for developing software to run on AsteroidOS.  Since AsteroidOS is a Linux distribution, you can use just about any programming language to develop software, but most of the core applications use a combination of C++ and Qt, with CMake to build. This page describes how to install and configure the SDK.&lt;br /&gt;
&lt;br /&gt;
==== Which SDK? ====&lt;br /&gt;
One thing to note is that while this describes &amp;quot;the SDK&amp;quot;, there are actually two versions -- the main one is used to develop software that runs on ARM-based watches running AsteroidOS.  The other one is the SDK for developing applications that run on the emulator, which uses qemux86.  See the [[Emulator]] page for details on the qemux86 version.  &lt;br /&gt;
&lt;br /&gt;
You can install both SDKs on the same machine -- they do not interfere.&lt;br /&gt;
&lt;br /&gt;
= Build or Download =&lt;br /&gt;
You can either build the SDK from sources or download a prebuilt version.  Using a prebuilt version is much faster and easier, and is recommended for developers who want to get started quickly.  &lt;br /&gt;
&lt;br /&gt;
The prebuilt SDK is available [https://release.asteroidos.org/nightlies/sdk/oecore-meta-toolchain-qt6-x86_64-armv7vehf-neon-sturgeon-toolchain-nodistro.0.sh here].  If you wish to build it yourself, see [[Building the SDK]].&lt;br /&gt;
&lt;br /&gt;
== Installing the SDK ==&lt;br /&gt;
If you downloaded a prebuilt SDK, run the downloaded script. If you built your own, the generated installation script should be in &amp;lt;code&amp;gt;tmp/deploy/sdk/&amp;lt;/code&amp;gt; (relative to the &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; directory).  In either case, navigate to the directory which contains the &amp;lt;code&amp;gt;oecore-meta-toolchain-qt6-x86_64-armv7vehf-neon-sturgeon-toolchain-nodistro.0.sh&amp;lt;/code&amp;gt; script and run it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./oecore-meta-toolchain-qt6-x86_64-armv7vehf-neon-sturgeon-toolchain-nodistro.0.sh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This script will install the cross-compiler and ARM libraries in &amp;lt;code&amp;gt;/usr/local/oecore-x86_64&amp;lt;/code&amp;gt; by default, along with a script that needs to be sourced before every build. If you want to compile software for AsteroidOS on a watch, the command-line steps generally look like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
source /usr/local/oecore-x86_64/environment-setup-armv7vehf-neon-oe-linux-gnueabi&lt;br /&gt;
cmake -B build&lt;br /&gt;
cmake --build build&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Installing the emulator version of the SDK ===&lt;br /&gt;
Installing the emulator version of the SDK is almost exactly the same.  The only difference is that the file name for the installer is &amp;lt;code&amp;gt;oecore-meta-toolchain-qt6-x86_64-core2-32-qemux86-toolchain-nodistro.0.sh&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
As noted above, you can install either or both versions on the same computer with no problem.  They are completely independent.&lt;br /&gt;
&lt;br /&gt;
See [[Creating an Asteroid app]] for next steps.&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Build_from_the_command_line&amp;diff=1044</id>
		<title>Build from the command line</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Build_from_the_command_line&amp;diff=1044"/>
		<updated>2026-09-11T20:57:30Z</updated>

		<summary type="html">&lt;p&gt;Beroset: moved linguist description from Qt5 to Qt6&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This page describes how to build an app from the command line other than by using &amp;lt;code&amp;gt;bitbake&amp;lt;/code&amp;gt;.  As described in [[Creating an Asteroid app]], the preferred method for building an app is to set up and use &amp;lt;code&amp;gt;bitbake&amp;lt;/code&amp;gt;.  However, if you are a beginner and want to try a lower resource method for building, this page documents how to do so from the command line.  The other relatively low resource method is to [[Build with QtCreator]].&lt;br /&gt;
&lt;br /&gt;
== Prerequisites ==&lt;br /&gt;
To build an app from the command line using this method you should:&lt;br /&gt;
# Have the [[Installing the SDK|SDK installed]]&lt;br /&gt;
# Be familiar with CMake and C++&lt;br /&gt;
&lt;br /&gt;
It is technically possible, but not generally recommended to create new AsteroidOS applications in languages other than C++ and with build tools other than CMake.&lt;br /&gt;
&lt;br /&gt;
= Building from the command line =&lt;br /&gt;
Generally, to build a CMake project from the command line, use this: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export CMAKE_PROGRAM_PATH=/usr/local/oecore-x86_64/sysroots/armv7vehf-neon-oe-linux-gnueabi/usr/bin/&lt;br /&gt;
source /usr/local/oecore-x86_64/environment-setup-armv7vehf-neon-oe-linux-gnueabi&lt;br /&gt;
cmake -B build&lt;br /&gt;
cmake --build build&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you&#039;re building for the [[Emulator]], use this instead:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
export CMAKE_PROGRAM_PATH=/usr/local/oecore-x86_64/sysroots/core2-32-oe-linux/usr/bin&lt;br /&gt;
source /usr/local/oecore-x86_64/environment-setup-core2-32-oe-linux&lt;br /&gt;
cmake -B build&lt;br /&gt;
cmake --build build&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Example project ==&lt;br /&gt;
A example project, asteroid-helloworld is available as both an example and a template for new software.  To fetch it from &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; and build it, use the following:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/AsteroidOS/asteroid-helloworld.git&lt;br /&gt;
cd asteroid-helloworld&lt;br /&gt;
export CMAKE_PROGRAM_PATH=/usr/local/oecore-x86_64/sysroots/armv7vehf-neon-oe-linux-gnueabi/usr/bin/&lt;br /&gt;
source /usr/local/oecore-x86_64/environment-setup-armv7vehf-neon-oe-linux-gnueabi&lt;br /&gt;
cmake -B build -DCMAKE_INSTALL_PREFIX:PATH=/usr&lt;br /&gt;
cmake --build build --target package&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If everything was successful, you should now have a new library named &amp;lt;code&amp;gt;asteroid-helloworld.so&amp;lt;/code&amp;gt; in the &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; directory.  You should also have an &amp;lt;code&amp;gt;.ipk&amp;lt;/code&amp;gt; file in the build directory.  If the watch is connected via USB to the host computer, you can copy this to the watch and then install it with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
scp build/asteroid-helloworld*.ipk root@192.168.2.15:.&lt;br /&gt;
ssh root@192.168.2.15 &amp;quot;opkg install asteroid-helloworld*.ipk&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that we specify the &amp;lt;code&amp;gt;CMAKE_INSTALL_PREFIX&amp;lt;/code&amp;gt; in the commands above.  This is to assure that the package is built to install the software in &amp;lt;code&amp;gt;/usr/lib/&amp;lt;/code&amp;gt; rather than &amp;lt;code&amp;gt;/usr/local/lib/&amp;lt;/code&amp;gt; which would otherwise be the default.  The &amp;lt;code&amp;gt;--target package&amp;lt;/code&amp;gt; instructs CMake to build a package the &amp;lt;code&amp;gt;.ipk&amp;lt;/code&amp;gt; file in our case.&lt;br /&gt;
 &lt;br /&gt;
Once the software is installed, it should show up as the last item on the launcher page.  Pressing the icon should show an orange background with the words &amp;quot;Hello World!&amp;quot; in white.  You should make sure all of this works before going further with development.&lt;br /&gt;
&lt;br /&gt;
You can start by modifying occurrences of &amp;quot;asteroid-helloworld&amp;quot; to your app&#039;s name. Then you can change the *.desktop file which describes the icon on the apps launcher. Then modify main.qml to describe your UI. To get started with QML development you can read the [http://doc.qt.io/qt-5/qml-tutorial.html official tutorial].&lt;br /&gt;
&lt;br /&gt;
==== Translations ====&lt;br /&gt;
Within the AsteroidOS project, we use Qt Linguist and Weblate to enable [[Translating AsteroidOS]] and applications within it.  If you&#039;re starting on &amp;quot;my-cool-project&amp;quot;, you may want to add some language translations to it.  This is done using the &amp;lt;code&amp;gt;lupdate&amp;lt;/code&amp;gt; tool.  Because Qt5 is nearing the end of support and Qt6 has been out for a while, the tool is named &amp;lt;code&amp;gt;lupdate-qt6&amp;lt;/code&amp;gt; to differentiate between the two tools on most Linux distributions.  Many will also allow &amp;lt;code&amp;gt;lupdate&amp;lt;/code&amp;gt; as a synonym for the Qt6 version.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Example&#039;&#039;&#039;:  Let&#039;s say that you want to start with English, French, Spanish, German and Italian translations.  You will have to create them before they can be translated. To do this, within your top level &amp;lt;code&amp;gt;my-cool-project&amp;lt;/code&amp;gt; directory, execute the following command line code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
for lang in en fr es de it&lt;br /&gt;
do&lt;br /&gt;
  lupdate-qt6 -no-obsolete src/* i18n/*.h -ts i18n/my-cool-project.${lang}.ts&lt;br /&gt;
done&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This creates a &amp;lt;code&amp;gt;.ts&amp;lt;/code&amp;gt; file for each of those language within the &amp;lt;code&amp;gt;i18n&amp;lt;/code&amp;gt; directory.  &lt;br /&gt;
&lt;br /&gt;
Once they are created, you or others who know the languages may use [https://doc.qt.io/qt-5/qtlinguist-index.html Qt Linguist] to actually translate the strings.  Note that AsteroidOS uses the [https://doc.qt.io/qt-5/linguist-id-based-i18n.html id based] translation mechanism which uses &amp;lt;code&amp;gt;qsTrId&amp;lt;/code&amp;gt; rather than &amp;lt;code&amp;gt;qsTr&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Qt and therefore AsteroidOS also supports national language variants, so if you want to create the Argentinian Spanish version or the Great Britain English version those would be named &amp;lt;code&amp;gt;es_AR&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;en_GB&amp;lt;/code&amp;gt; respectively.&lt;br /&gt;
&lt;br /&gt;
==== Updating language translation files ====&lt;br /&gt;
Once they are created, to update language translation files, and assuming you have all source files in &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt; and translation files in &amp;lt;code&amp;gt;i18n&amp;lt;/code&amp;gt; (which is short for &amp;quot;internationalization&amp;quot;), you can use this command to update the files.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lupdate-qt6 -no-obsolete src/* i18n/*.h -ts i18n/*.ts&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=Tips and tricks=&lt;br /&gt;
==Running your app==&lt;br /&gt;
If you want to start your app from the command line, open a shell with [[SSH]], connect to ceres and use the shell script which, in turn, calls invoker:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
QT_QPA_PLATFORM=wayland asteroid-stopwatch&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Or more generally, call invoker directly:&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
QT_QPA_PLATFORM=wayland invoker --single-instance --type=qtcomponents-qt6 /usr/lib/asteroid-stopwatch.so&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you want to disable screen locking for easier development you can enable the demo mode of mce as root with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
mcetool -D on&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Don&#039;t forget to turn it back off when you are done to avoid draining the battery.&lt;br /&gt;
&lt;br /&gt;
==Examining an .ipk file==&lt;br /&gt;
On systems that have it, one can use &amp;lt;code&amp;gt;opkg-cl&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;ipkg-deb&amp;lt;/code&amp;gt; to examine, extract or modify .ipk files.  Without those, one can simply use &amp;lt;code&amp;gt;ar&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;tar&amp;lt;/code&amp;gt;.  &lt;br /&gt;
Examples:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ar t path/to/package.ipk            # show members&lt;br /&gt;
ar x path/to/package.ipk control.tar.gz data.tar.gz&lt;br /&gt;
tar --zstd -tf data.tar.zst                # list files from package payload&lt;br /&gt;
tar --zstd -xf data.tar.zst -C /tmp/pkg-extract   # extract payload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We can also use one-liners to manipulate just the part of the .ipk file that contains data files (the package payload):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ar p path/to/package.ipk data.tar.zst | tar -tv --zstd    # show data files&lt;br /&gt;
ar p path/to/package.ipk data.tar.zst | tar -xv --zstd    # extract data files&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
Debugging is described in detail in [[Debugging Applications]]&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Building_the_SDK&amp;diff=1043</id>
		<title>Building the SDK</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Building_the_SDK&amp;diff=1043"/>
		<updated>2026-09-11T20:54:32Z</updated>

		<summary type="html">&lt;p&gt;Beroset: updated to use meta-toolchain-qt6&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Developers]]&lt;br /&gt;
&lt;br /&gt;
==Summary==&lt;br /&gt;
This page describes how to build the Software Development Kit (SDK) for AsteroidOS &#039;&#039;&#039;without&#039;&#039;&#039; using &#039;&#039;software containers&#039;&#039;.  If you want to build the SDK using containers, see [[Building the SDK in a container]] instead.    &lt;br /&gt;
&lt;br /&gt;
If you&#039;re not sure which you want, skip to [[Building_the_SDK#With_or_without_software_containers?|With or without software containers?]] &lt;br /&gt;
&lt;br /&gt;
If you&#039;re not sure why you would want an SDK, continue reading. &lt;br /&gt;
&lt;br /&gt;
===What is an SDK?===&lt;br /&gt;
&lt;br /&gt;
The Software Development Kit (SDK) for AsteroidOS is a set of tools and libraries for developing software to run on AsteroidOS. Since AsteroidOS is a Linux distribution, you can use just about any programming language to develop software, but most of the core applications use a combination of C++ and Qt, with CMake to build. To get things running quickly, it&#039;s recommended to download and install the prebuilt version as described in [[Installing the SDK]]. This page describes how to build the SDK from source.  Be aware that this can take several hours, even on a fast computer. &lt;br /&gt;
&lt;br /&gt;
==== Which SDK? ====&lt;br /&gt;
One thing to note is that while this describes &amp;quot;the SDK&amp;quot;, there are actually two versions -- the main one is used to develop software that runs on ARM-based watches running AsteroidOS.  The other one is the SDK for developing applications that run on the emulator, which uses qemux86.  See the [[Emulator]] page for details on the qemux86 version.  This page describes only the main ARM-based SDK but building the emulator version is almost the same.  The only difference is that instead of this: &lt;br /&gt;
 source ./prepare-build.sh sturgeon&lt;br /&gt;
 bitbake meta-toolchain-qt6&lt;br /&gt;
you would do this instead:&lt;br /&gt;
 source ./prepare-build.sh qemux86&lt;br /&gt;
 bitbake meta-toolchain-qt6&lt;br /&gt;
&lt;br /&gt;
You can install both SDKs on the same machine -- they do not interfere.&lt;br /&gt;
&lt;br /&gt;
== With or without software containers? ==&lt;br /&gt;
There are two choices to build the SDK: build natively without software containers or build within a software container (such as docker or podman).&lt;br /&gt;
&lt;br /&gt;
Building natively requires somewhat fewer resources (memory and disk space) than building with containers but requires software, such a compilers and other tools, to be installed on the host system.  Since these software packages are different for each Linux distribution, this method requires more knowledge and patience to install required software that might not already be installed on your host computer.&lt;br /&gt;
&lt;br /&gt;
The alternative, building with software containers, is somewhat more simpler in that the required software is only installed within the container and not on your host computer, but it requires much more time to compile everything.  Still, this may be preferable for people who wish to keep the build environment isolated from the host computer.&lt;br /&gt;
&lt;br /&gt;
== Building the Cross Compilation Toolchain ==&lt;br /&gt;
&lt;br /&gt;
If you’ve already got an OpenEmbedded build directory via the [[Building AsteroidOS]] page, &amp;lt;code&amp;gt;cd&amp;lt;/code&amp;gt; to that directory. Else, create one with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/AsteroidOS/asteroid&lt;br /&gt;
cd asteroid/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, build the cross compilation toolchain with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
source ./prepare-build.sh dory&lt;br /&gt;
bitbake meta-toolchain-qt6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Install the SDK==&lt;br /&gt;
Whether you have built with or without containers, if the process was successful, you should have an SDK installation script &amp;lt;code&amp;gt;tmp/deploy/sdk/oecore-meta-toolchain-qt6-x86_64-armv7vehf-neon-sturgeon-toolchain-nodistro.0.sh&amp;lt;/code&amp;gt; (relative to the &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; directory) -- or a &amp;lt;code&amp;gt;oecore-meta-toolchain-qt6-x86_64-core2-32-qemux86-toolchain-nodistro.0.sh&amp;lt;/code&amp;gt; script if you are building the version of the SDK for the emulator.  Follow [[installing the SDK#Installing the SDK|these steps]] to install the SDK.&lt;br /&gt;
&lt;br /&gt;
==Related pages==&lt;br /&gt;
&lt;br /&gt;
[[Building the SDK in a container]] &lt;br /&gt;
&lt;br /&gt;
[[installing the SDK]]&lt;br /&gt;
&lt;br /&gt;
[[Building AsteroidOS]]&lt;br /&gt;
&lt;br /&gt;
[[Creating an Asteroid app]]&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Building_the_SDK_in_a_container&amp;diff=1042</id>
		<title>Building the SDK in a container</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Building_the_SDK_in_a_container&amp;diff=1042"/>
		<updated>2026-09-11T20:53:20Z</updated>

		<summary type="html">&lt;p&gt;Beroset: /* Which SDK? */ updated to use meta-toolchain-qt6&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Developers]]&lt;br /&gt;
&lt;br /&gt;
==Summary==&lt;br /&gt;
This page describes how to build the Software Development Kit (SDK) for AsteroidOS using &#039;&#039;software containers&#039;&#039;.  If you want to build the SDK without using containers, see [[Building the SDK]] instead.    &lt;br /&gt;
&lt;br /&gt;
If you&#039;re not sure which you want, skip to [[Building_the_SDK#With_or_without_software_containers?|With or without software containers?]]&lt;br /&gt;
&lt;br /&gt;
If you&#039;re not sure why you would want an SDK, continue reading. &lt;br /&gt;
&lt;br /&gt;
===What is an SDK?===&lt;br /&gt;
&lt;br /&gt;
The Software Development Kit (SDK) for AsteroidOS is a set of tools and libraries for developing software to run on AsteroidOS. Since AsteroidOS is a Linux distribution, you can use just about any programming language to develop software, but most of the core applications use a combination of C++ and Qt, with CMake to build. To get things running quickly, it&#039;s recommended to download and install the prebuilt version as described in [[Installing the SDK]]. This page describes how to build the SDK from source.  Be aware that this can take several hours, even on a fast computer. &lt;br /&gt;
&lt;br /&gt;
====Which SDK?====&lt;br /&gt;
One thing to note is that while this describes &amp;quot;the SDK&amp;quot;, there are actually two versions -- the main one is used to develop software that runs on ARM-based watches running AsteroidOS.  The other one is the SDK for developing applications that run on the emulator, which uses qemux86.  See the [[Emulator]] page for details on the qemux86 version.  This page describes only the main ARM-based SDK but building the emulator version is almost the same.  The only difference is that instead of this: &lt;br /&gt;
 source ./prepare-build.sh dory&lt;br /&gt;
 bitbake meta-toolchain-qt6&lt;br /&gt;
you would do this instead:&lt;br /&gt;
 source ./prepare-build.sh qemux86&lt;br /&gt;
 bitbake meta-toolchain-qt6&lt;br /&gt;
&lt;br /&gt;
You can install both SDKs on the same machine -- they do not interfere.&lt;br /&gt;
&lt;br /&gt;
==With or without software containers?==&lt;br /&gt;
There are two choices to build the SDK: build natively without software containers or build within a software container (such as docker or podman).  &lt;br /&gt;
&lt;br /&gt;
Building natively requires somewhat fewer resources (memory and disk space) than building with containers but requires software, such a compilers and other tools, to be installed on the host system.  Since these software packages are different for each Linux distribution, this method requires more knowledge and patience to install required software that might not already be installed on your host computer.&lt;br /&gt;
&lt;br /&gt;
The alternative, building with software containers, is somewhat more simpler in that the required software is only installed within the container and not on your host computer, but it requires much more time to compile everything.  Still, this may be preferable for people who wish to keep the build environment isolated from the host computer.&lt;br /&gt;
&lt;br /&gt;
The rest of this page describes how to build &#039;&#039;&#039;with&#039;&#039;&#039; containers.  If you have decided to build natively instead, go to [[Building the SDK]]  &lt;br /&gt;
&lt;br /&gt;
===Build with containers===&lt;br /&gt;
&lt;br /&gt;
Assuming you already prepared a docker or podman build environment as described in [[Building AsteroidOS]], build the SDK like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo docker rm -f asteroidos-toolchain&lt;br /&gt;
sudo docker run -it \&lt;br /&gt;
  --name asteroidos-toolchain \&lt;br /&gt;
  -v /etc/passwd:/etc/passwd:ro \&lt;br /&gt;
  -u &amp;quot;$(id -u):$(id -g)&amp;quot; \&lt;br /&gt;
  -v &amp;quot;$HOME/.gitconfig:/$HOME/.gitconfig:ro&amp;quot; \&lt;br /&gt;
  -v &amp;quot;$(pwd):/asteroid&amp;quot; asteroidos-toolchain \&lt;br /&gt;
  bash -c &amp;quot;source ./prepare-build.sh dory &amp;amp;&amp;amp; bitbake meta-toolchain-qt6&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
podman run --rm -it \&lt;br /&gt;
  -v &amp;quot;$(pwd)&amp;quot;:/asteroid:z \&lt;br /&gt;
  --userns keep-id asteroidos-toolchain \&lt;br /&gt;
  bash -c &amp;quot;source ./prepare-build.sh dory &amp;amp;&amp;amp; bitbake meta-toolchain-qt6&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Install the SDK==&lt;br /&gt;
Whether you have built with or without containers, if the process was successful, you should have an SDK installation script &amp;lt;code&amp;gt;tmp/deploy/sdk/oecore-x86_64-armv7vehf-neon-toolchain-nodistro.0.sh&amp;lt;/code&amp;gt; (relative to the &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; directory) -- or a &amp;lt;code&amp;gt;oecore-x86_64-core2-32-toolchain-nodistro.0.sh&amp;lt;/code&amp;gt; script if you are building the version of the SDK for the emulator.  Follow [[installing the SDK#Installing the SDK|these steps]] to install the SDK.&lt;br /&gt;
&lt;br /&gt;
==Related pages==&lt;br /&gt;
&lt;br /&gt;
[[Building the SDK]]&lt;br /&gt;
&lt;br /&gt;
[[installing the SDK]]&lt;br /&gt;
&lt;br /&gt;
[[Building AsteroidOS]]&lt;br /&gt;
&lt;br /&gt;
[[Creating an Asteroid app]]&lt;br /&gt;
&lt;br /&gt;
[[OpenEmbedded]]&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Building_the_SDK_in_a_container&amp;diff=1041</id>
		<title>Building the SDK in a container</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Building_the_SDK_in_a_container&amp;diff=1041"/>
		<updated>2026-09-11T20:52:39Z</updated>

		<summary type="html">&lt;p&gt;Beroset: /* Which SDK? */ updated to use meta-toolchain-qt6&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Developers]]&lt;br /&gt;
&lt;br /&gt;
==Summary==&lt;br /&gt;
This page describes how to build the Software Development Kit (SDK) for AsteroidOS using &#039;&#039;software containers&#039;&#039;.  If you want to build the SDK without using containers, see [[Building the SDK]] instead.    &lt;br /&gt;
&lt;br /&gt;
If you&#039;re not sure which you want, skip to [[Building_the_SDK#With_or_without_software_containers?|With or without software containers?]]&lt;br /&gt;
&lt;br /&gt;
If you&#039;re not sure why you would want an SDK, continue reading. &lt;br /&gt;
&lt;br /&gt;
===What is an SDK?===&lt;br /&gt;
&lt;br /&gt;
The Software Development Kit (SDK) for AsteroidOS is a set of tools and libraries for developing software to run on AsteroidOS. Since AsteroidOS is a Linux distribution, you can use just about any programming language to develop software, but most of the core applications use a combination of C++ and Qt, with CMake to build. To get things running quickly, it&#039;s recommended to download and install the prebuilt version as described in [[Installing the SDK]]. This page describes how to build the SDK from source.  Be aware that this can take several hours, even on a fast computer. &lt;br /&gt;
&lt;br /&gt;
====Which SDK?====&lt;br /&gt;
One thing to note is that while this describes &amp;quot;the SDK&amp;quot;, there are actually two versions -- the main one is used to develop software that runs on ARM-based watches running AsteroidOS.  The other one is the SDK for developing applications that run on the emulator, which uses qemux86.  See the [[Emulator]] page for details on the qemux86 version.  This page describes only the main ARM-based SDK but building the emulator version is almost the same.  The only difference is that instead of this: &lt;br /&gt;
 source ./prepare-build.sh dory&lt;br /&gt;
 bitbake meta-toolchain-qt6&lt;br /&gt;
you would do this instead:&lt;br /&gt;
 source ./prepare-build.sh qemux86&lt;br /&gt;
 bitbake meta-toolchain-qt6&lt;br /&gt;
&lt;br /&gt;
You can install both SDKs on the same machine -- they do not interfere.&lt;br /&gt;
&lt;br /&gt;
==With or without software containers?==&lt;br /&gt;
There are two choices to build the SDK: build natively without software containers or build within a software container (such as docker or podman).  &lt;br /&gt;
&lt;br /&gt;
Building natively requires somewhat fewer resources (memory and disk space) than building with containers but requires software, such a compilers and other tools, to be installed on the host system.  Since these software packages are different for each Linux distribution, this method requires more knowledge and patience to install required software that might not already be installed on your host computer.&lt;br /&gt;
&lt;br /&gt;
The alternative, building with software containers, is somewhat more simpler in that the required software is only installed within the container and not on your host computer, but it requires much more time to compile everything.  Still, this may be preferable for people who wish to keep the build environment isolated from the host computer.&lt;br /&gt;
&lt;br /&gt;
The rest of this page describes how to build &#039;&#039;&#039;with&#039;&#039;&#039; containers.  If you have decided to build natively instead, go to [[Building the SDK]]  &lt;br /&gt;
&lt;br /&gt;
===Build with containers===&lt;br /&gt;
&lt;br /&gt;
Assuming you already prepared a docker or podman build environment as described in [[Building AsteroidOS]], build the SDK like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo docker rm -f asteroidos-toolchain&lt;br /&gt;
sudo docker run -it \&lt;br /&gt;
  --name asteroidos-toolchain \&lt;br /&gt;
  -v /etc/passwd:/etc/passwd:ro \&lt;br /&gt;
  -u &amp;quot;$(id -u):$(id -g)&amp;quot; \&lt;br /&gt;
  -v &amp;quot;$HOME/.gitconfig:/$HOME/.gitconfig:ro&amp;quot; \&lt;br /&gt;
  -v &amp;quot;$(pwd):/asteroid&amp;quot; asteroidos-toolchain \&lt;br /&gt;
  bash -c &amp;quot;source ./prepare-build.sh dory &amp;amp;&amp;amp; bitbake meta-toolchain-qt5&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
podman run --rm -it \&lt;br /&gt;
  -v &amp;quot;$(pwd)&amp;quot;:/asteroid:z \&lt;br /&gt;
  --userns keep-id asteroidos-toolchain \&lt;br /&gt;
  bash -c &amp;quot;source ./prepare-build.sh dory &amp;amp;&amp;amp; bitbake meta-toolchain-qt5&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Install the SDK==&lt;br /&gt;
Whether you have built with or without containers, if the process was successful, you should have an SDK installation script &amp;lt;code&amp;gt;tmp/deploy/sdk/oecore-x86_64-armv7vehf-neon-toolchain-nodistro.0.sh&amp;lt;/code&amp;gt; (relative to the &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; directory) -- or a &amp;lt;code&amp;gt;oecore-x86_64-core2-32-toolchain-nodistro.0.sh&amp;lt;/code&amp;gt; script if you are building the version of the SDK for the emulator.  Follow [[installing the SDK#Installing the SDK|these steps]] to install the SDK.&lt;br /&gt;
&lt;br /&gt;
==Related pages==&lt;br /&gt;
&lt;br /&gt;
[[Building the SDK]]&lt;br /&gt;
&lt;br /&gt;
[[installing the SDK]]&lt;br /&gt;
&lt;br /&gt;
[[Building AsteroidOS]]&lt;br /&gt;
&lt;br /&gt;
[[Creating an Asteroid app]]&lt;br /&gt;
&lt;br /&gt;
[[OpenEmbedded]]&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=IP_Connection&amp;diff=1040</id>
		<title>IP Connection</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=IP_Connection&amp;diff=1040"/>
		<updated>2026-09-07T20:56:42Z</updated>

		<summary type="html">&lt;p&gt;Beroset: /* AsteroidOS versions 2.2 and later */ added secure root access section&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Configuring an IP connection on your watch has to be done manually until a GUI settings option is available. On watches that support WLAN, you can enable Wi-Fi and configure the connection using &amp;lt;code&amp;gt;connmanctl&amp;lt;/code&amp;gt; like described below. Forwarding IP requests to a connected PC via USB is another option, explained in the second paragraph.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== AsteroidOS versions before 2.2 ==&lt;br /&gt;
By default, there is no &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;ceres&amp;lt;/code&amp;gt; password, and no firewall rules. (However, on some watches, the kernel has the &amp;lt;code&amp;gt;CONFIG_ANDROID_PARANOID_NETWORK&amp;lt;/code&amp;gt; kernel option enabled, see below.)  A password can be set using the passwd command.&lt;br /&gt;
&lt;br /&gt;
== AsteroidOS versions 2.2 and later ==&lt;br /&gt;
There is no &amp;lt;code&amp;gt;ceres&amp;lt;/code&amp;gt; password, and no firewall rules.  There is an invalid &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; password set, disallowing any password login. Root login is also disabled in &amp;lt;code&amp;gt;sshd_config&amp;lt;/code&amp;gt;.  However the &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; command is now included by default, so the &amp;lt;code&amp;gt;ceres&amp;lt;/code&amp;gt; user can use that for temporary privilege escalation when needed.&lt;br /&gt;
&lt;br /&gt;
===Secure root access===&lt;br /&gt;
If you need root access over ssh, the most secure way to accomplish that is to put your computer&#039;s public key on the watch.  The process for doing that is described [[OpenEmbedded#A_word_about_root_access|here]].&lt;br /&gt;
&lt;br /&gt;
===Legacy root access===&lt;br /&gt;
If it&#039;s needed, root empty password can be re-enabled by running:&lt;br /&gt;
&amp;lt;code&amp;gt;sudo passwd -d root&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also, ssh password login for &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; can be enabled with:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo sed -i &#039;s/^[#[:space:]]PermitRootLogin./PermitRootLogin yes/&#039; /etc/ssh/sshd_config&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By default, password and keyboard-interactive authentication is disabled for &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= IP over WLAN (WiFi) =&lt;br /&gt;
Connect to your watch using &amp;lt;code&amp;gt;ssh root@192.168.2.15&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;adb shell&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;connmanctl&amp;lt;/pre&amp;gt;&lt;br /&gt;
Starts the connmanctl interactive mode. The prompt indicator will change to &amp;lt;code&amp;gt;connmanctl&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;enable wifi&amp;lt;/pre&amp;gt;&lt;br /&gt;
Output: Enabled wifi&lt;br /&gt;
&amp;lt;pre&amp;gt;scan wifi&amp;lt;/pre&amp;gt;&lt;br /&gt;
Output: Scan completed for wifi&lt;br /&gt;
&amp;lt;pre&amp;gt;agent on&amp;lt;/pre&amp;gt;&lt;br /&gt;
Output: Agent registered&lt;br /&gt;
&lt;br /&gt;
The Agent will handle automatic reconnect to the network.&lt;br /&gt;
&amp;lt;pre&amp;gt;services&amp;lt;/pre&amp;gt;&lt;br /&gt;
Shows the discovered SSIDs and their service identifier.&lt;br /&gt;
&lt;br /&gt;
Output example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;YourNetwork  wifi_1234567890_1234567890_managed_psk&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;OtherLAN     wifi_0987654321_123456789_managed_psk&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;connect &amp;lt;ServiceIdentifierOfYourSSID&amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;connect wifi_1234567890_1234567890_managed_psk&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prompt changes to &amp;lt;code&amp;gt;Passphrase?&amp;lt;/code&amp;gt; and asks for the password to the SSID.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;TypeYourPassPhraseAndPressEnter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Output: Connected to wifi_1234567890_1234567890_managed_psk&lt;br /&gt;
&lt;br /&gt;
Note: If the connection fails with an error (e.g., &amp;quot;Invalid key&amp;quot; or no connection), try connecting to the other service identifier listed for the same SSID name, as it may correspond to the 2.4 GHz band that your watch supports more reliably (while the other is likely 5 GHz).&lt;br /&gt;
&amp;lt;pre&amp;gt;quit&amp;lt;/pre&amp;gt;&lt;br /&gt;
Leaves the connmanctl interactive mode.&lt;br /&gt;
&lt;br /&gt;
Check whether an IP address has been assigned to the watch using &amp;lt;code&amp;gt;ip a show dev wlan0&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;ifconfig wlan0&amp;lt;/code&amp;gt; or by trying to &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Note that activated WLAN consumes additional power. Currently, it is recommended to disable the function after use. &amp;lt;code&amp;gt;connmanctl disable wifi&amp;lt;/code&amp;gt; is used to disable Wi-Fi and power off WLAN temporarily. &amp;lt;code&amp;gt;connmanctl enable wifi&amp;lt;/code&amp;gt; activates WLAN again and connects to the last used Wi-Fi network.&lt;br /&gt;
&lt;br /&gt;
Some more documentation on connman can be found on [https://wiki.archlinux.org/index.php/ConnMan#Connecting_to_a_protected_access_point ArchWiki].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=IP over USB=&lt;br /&gt;
It is possible to allow your watch to be able to use your Linux computer&#039;s internet connection via a USB connection. You will need: &lt;br /&gt;
&lt;br /&gt;
#A Linux computer with RNDIS support loaded and enabled&lt;br /&gt;
#The ability to change network configurations on that computer&lt;br /&gt;
#A network connection&lt;br /&gt;
&lt;br /&gt;
This works by using the RNDIS driver to allow the USB device to appear to be a network interface. RNDIS stands for &amp;quot;Remote Network Driver Interface Specification&amp;quot; and was a proprietary protocol from Microsoft. It is supported in Linux by the &amp;lt;code&amp;gt;rndis_host&amp;lt;/code&amp;gt; driver. This driver may either be compiled into the kernel, or more typically provided as an optional module. If you&#039;re not sure, you can try this &amp;lt;code&amp;gt;lsmod&amp;lt;/code&amp;gt; to see if it&#039;s loaded on your computer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lsmod | grep ndis&lt;br /&gt;
rndis_host             24576  0&lt;br /&gt;
cdc_ether              24576  1 rndis_host&lt;br /&gt;
usbnet                 61440  2 rndis_host,cdc_ether&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If it isn&#039;t you might be able to use &amp;lt;code&amp;gt;modprobe rndis_host&amp;lt;/code&amp;gt; (with root privileges) to install the module.&lt;br /&gt;
&lt;br /&gt;
Once the &amp;lt;code&amp;gt;rndis_host&amp;lt;/code&amp;gt; is installed and running, you can enable Network Address Translation (NAT) to allow your Linux computer to share it&#039;s internet IP address with the watch. To configure a NAT &#039;&#039;&#039;on your computer&#039;&#039;&#039; (Note: Replace eth0 with the name of the interface that connects your computer to the Internet) with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here again, you might need root privileges for those commands, depending on how your computer is configured.&lt;br /&gt;
&lt;br /&gt;
Configure a default gateway and DNS &#039;&#039;&#039;on the watch&#039;&#039;&#039; with the following commands ran via [[SSH]] as the root user:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ip route add default via 192.168.2.1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;echo &amp;quot;nameserver 8.8.8.8&amp;quot; &amp;gt;&amp;gt; /etc/resolv.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that this assumes that your computer&#039;s IP address on RNDIS is 192.168.2.1, which is the default, but if you have multiple watches, or have plugged and unplugged the same watch a few times, it might be different. To make sure, on the watch, you can type &amp;lt;code&amp;gt;who&amp;lt;/code&amp;gt; and it will reply with something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
root            pts/0           00:01   Jun  9 08:06:24  192.168.2.2&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this particular case, the address shown is 192.168.2.2, so the first command listed above would be &amp;lt;code&amp;gt;route add default gw 192.168.2.2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Custom Address ==&lt;br /&gt;
The watch defaults to the address 192.168.2.15, but this can be changed.  If, for example, you want to change the address to 10.0.0.2, the recommended way to change it is to do this:&lt;br /&gt;
&lt;br /&gt;
# temporarily changing the USB mode on the watch to &amp;quot;ADB mode&amp;quot;&lt;br /&gt;
# issue the command &amp;lt;pre&amp;gt;adb dbus-send --system --type=method_call --print-reply --dest=com.meego.usb_moded /com/meego/usb_moded com.meego.usb_moded.net_config string:&#039;ip&#039; string:&#039;10.0.0.2&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
# change USB mode to &amp;quot;SSH mode&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note that if you have more than one ADB device attached to your computer, you might have to give it the transport ID in step 2. This change persists across boots.&lt;br /&gt;
&lt;br /&gt;
An alternative approach for developers building their own image using bitbake, is to edit the file https://github.com/AsteroidOS/meta-asteroid/blob/master/recipes-nemomobile/usb-moded/usb-moded/usb-moded/usb-moded.ini. And add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[network]&lt;br /&gt;
ip=10.0.0.2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Paranoid Kernels=&lt;br /&gt;
On some watch models (e.g., &amp;lt;code&amp;gt;lenok&amp;lt;/code&amp;gt;), the kernel shipped with AsteroidOS is compiled with the Android-specific &amp;lt;code&amp;gt;CONFIG_ANDROID_PARANOID_NETWORK&amp;lt;/code&amp;gt; kernel option enabled. That option enforces non-standard restrictions on networking, based on hardcoded group IDs (GIDs):&lt;br /&gt;
*GID 3003 is the &amp;lt;code&amp;gt;inet&amp;lt;/code&amp;gt; group, allowing to create &amp;lt;code&amp;gt;AF_INET&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;AF_INET6&amp;lt;/code&amp;gt; sockets,&lt;br /&gt;
* GID 3004 is the &amp;lt;code&amp;gt;net_raw&amp;lt;/code&amp;gt; group, allowing to create raw INET sockets.&lt;br /&gt;
&lt;br /&gt;
Only &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; and members of the groups with those magic GIDs are allowed to perform the described actions. In particular, by default, the &amp;lt;code&amp;gt;ceres&amp;lt;/code&amp;gt; user is &#039;&#039;&#039;not&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Therefore, in order to be able to access the network as &amp;lt;code&amp;gt;ceres&amp;lt;/code&amp;gt; (e.g., for &amp;lt;code&amp;gt;asteroid-weatherfetch&amp;lt;/code&amp;gt; to work), SSH into your watch as &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; (or use &amp;lt;code&amp;gt;adb shell&amp;lt;/code&amp;gt;) and run the following 2 commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
groupadd -g 3003 -U root,ceres inet&lt;br /&gt;
groupadd -g 3004 -U root,ceres net_raw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
These create the two magic groups with the same name and GID as on Android and add both &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ceres&amp;lt;/code&amp;gt; to them. Then reboot your watch, because only newly started sessions will pick up the new group memberships.&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Catfish_hardware&amp;diff=1039</id>
		<title>Catfish hardware</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Catfish_hardware&amp;diff=1039"/>
		<updated>2026-09-05T20:01:20Z</updated>

		<summary type="html">&lt;p&gt;Beroset: fixed chip number for NFC controller&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The [[Catfish|catfish]] hardware is based on the Qualcomm MSM8909w chipset.  In the picture of the front of the main board with the shield removed, this part is just above the horizontal center line of the board and slightly to the left of the vertical center line.  The large part under the bit of rubber or glue is a Kingston 04EPOP04-NL3DM627, which is a combo memory of 4GB MLC + 4Gb LPDDR3 in a 136-Ball BGA package.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE:&#039;&#039;&#039; The unit GB is giga&#039;&#039;bytes&#039;&#039; while the unit Gb is giga&#039;&#039;bits&#039;&#039;.  This terminology comes directly from the manufacturer (see: [https://web.archive.org/web/20211205022748/https://www.kingston.com/unitedkingdom/en/embedded/epop-embedded-flash an archived web page])[[File:Front of catfish main board with shield removed.jpg|thumb|alt=Front of catfish main board with shield removed|Front of catfish main board with shield removed]]&lt;br /&gt;
[[File:Back of catfish main board with shield removed.jpg|thumb|alt=Back of catfish main board|Back of catfish main board]]&lt;br /&gt;
[[File:F412REY6 chip.jpg|alt=Unknown chip #1 on front of catfish main board|thumb|STM32F412REY (package WLCSP) on front of catfish main board]]&lt;br /&gt;
&lt;br /&gt;
=== Hardware details - front ===&lt;br /&gt;
Outside the shield at the top left of the board is a STM32F412REY (package WLCSP). Markings on that chip are:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
F412REY6&lt;br /&gt;
A5 008 VQ&lt;br /&gt;
TW 8 16 C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
A picture of this chip is shown below.   Voltage detector XC6114 from Torex, providing 2.1V detection, is a much smaller chip to the right side of the board.  Markings on that chip are:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
848&lt;br /&gt;
2605&lt;br /&gt;
A7NZ&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
[[File:Unknown chip -2 on front of catfish main board.jpg|alt=Unknown chip #2 on front of catfish main board|thumb|Voltage detector XC6114 from Torex. 2.1V detection.]]&lt;br /&gt;
&lt;br /&gt;
=== Hardware details - back ===&lt;br /&gt;
[[File:Unknown chips 3 and 4 on back of catfish.jpg|alt=Unknown chips 3 and 4 on back of catfish|thumb|Unknown chips 3 and 4 on back of catfish]]&lt;br /&gt;
At the top of the board below the two connectors are two chips, shown in a picture below as &amp;quot;unknown chips 3 and 4 on back of catfish.&amp;quot;  Chip 3 is probably a Class‑K speaker amplifier (from Awinic AW87318CSR). The markings on the chip to the left say:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 2310208&lt;br /&gt;
 VGM41_1&lt;br /&gt;
 B8214&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The markings on the on the right say:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
K318&lt;br /&gt;
AFC3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Toward the bottom of the board are three additional chips.  To the left of the battery connector is a chip labeled:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SF&lt;br /&gt;
739&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With a barcode between &amp;quot;SF&amp;quot; and &amp;quot;739&amp;quot;.  A closeup photo is shown below as unknown chip #5.  This SF739 chip may be the secure element paired to the NFC chip (perhaps a ST33J2M0 family as they are designed to work together).&lt;br /&gt;
[[File:SF739 chip.jpg|alt=Unknown chip #5 labeled SF739|thumb|Unknown chip #5 labeled SF739. May be the secure element paired to the NFC chip (perhaps a ST33J2M0 family as they are designed to work together).]]&lt;br /&gt;
[[File:75CK371.jpg|alt=Unknown chip #6 labeled 75CK371|thumb|Chip labeled 75CK871, a single-cell Li-ion gauge from Texas Instruments BQ27421YZFR-G1D.]]&lt;br /&gt;
The chip labeled 75CK871 is a single-cell Li-ion gauge from Texas Instruments BQ27421YZFR-G1D and is to the right of the battery connector and bears these markings:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
75CK371&lt;br /&gt;
BQ27431&lt;br /&gt;
G1D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
In the photo below, it&#039;s the smaller chip to the left.&lt;br /&gt;
[[File:ST71NFCD.jpg|alt=ST21NFCD Near Field Communications (NFC) controller|thumb|ST21NFCD Near Field Communications (NFC) controller]]&lt;br /&gt;
The chip to the right of at the bottom, the largest chip on the back of the board, is a ST21NFCD which is a Near field communication (NFC) controller which includes its own ARM Cortex-M3 microcontroller.  A closeup photo of that chip is also shown below.&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Bluetooth&amp;diff=1038</id>
		<title>Bluetooth</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Bluetooth&amp;diff=1038"/>
		<updated>2026-09-04T12:43:20Z</updated>

		<summary type="html">&lt;p&gt;Beroset: clarified and updated&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Developers]]&lt;br /&gt;
An app named [https://github.com/AsteroidOS/AsteroidOSSync AsteroidOSSync] can be downloaded on Android to synchronize data from a phone to an AsteroidOS watch. Other platforms have [[Synchronization Clients|other synchronization clients]].  Several [[BLE profiles|profiles]] are already supported: Notifications, Weather, Music and Battery, more could come in the future.&lt;br /&gt;
&lt;br /&gt;
=Technical details=&lt;br /&gt;
== AsteroidOSSync ==&lt;br /&gt;
On the phone, AsteroidOSSync uses the [https://github.com/AsteroidOS/AsteroidOSSync/tree/master/app/src/main/lib/sweetblue SweetBlue] library to access the Bluetooth Low Energy capabilities of Bluedroid as a central device. It scans for watches and implements the client part of the aforementioned profiles.&lt;br /&gt;
== AsteroidOS Bluetooth implementation ==&lt;br /&gt;
On the watch, data are usually received by a BCM20715 BT chip from Broadcom, this chip needs a proprietary firmware which is uploaded by the [https://github.com/AsteroidOS/meta-dory-hybris/blob/master/recipes-android/brcm-patchram-plus/brcm-patchram-plus/patchram.service patchram] systemd service. Once the firmware is uploaded an hci0 interface is created and can be set up with hciconfig.&lt;br /&gt;
The Linux Kernel can then receive BLE payloads. A newer Bluetooth subsystem (4.1) has been [https://github.com/AsteroidOS/meta-smartwatch/blob/865d65514ee4e852bf2ed53add71ca3d18692608/meta-dory/recipes-kernel/linux/linux-dory/0003-Backport-mainline-4.1-Bluetooth-subsystem.patch backported] to provide newer MGMT API functionalities needed by the userspace (e.g: DBus advertisement). This MGMT API is only used by the BlueZ5’s bluetoothd daemon which exposes various DBus abstraction API. Bluetoothd also had to be [https://github.com/AsteroidOS/meta-asteroid/blob/master/recipes-connectivity/bluez5/bluez5/advertise-name.patch patched] to expose more complete advertisement payloads.&lt;br /&gt;
Simple and common interactions with the bluetoothd’s DBus API like checking for the powered/connected status are implemented in [https://github.com/AsteroidOS/qml-asteroid/blob/master/src/utils/src/bluetoothstatus.cpp org.asteroid.utils.BluetoothStatus] of qml-asteroid. This class is for example used in asteroid-launcher, asteroid-music and [https://github.com/AsteroidOS/asteroid-settings/blob/master/BluetoothPage.qml asteroid-settings].&lt;br /&gt;
More complex interactions with bluetoothd are implemented in [https://github.com/AsteroidOS/asteroid-btsyncd asteroid-btsyncd], a user-space daemon running as a standard user (ceres) and acting as a DBus multiplexer between BlueZ and the apps. On the BlueZ side it registers BLE Services, Characteristics and Advertisement payloads. On the user side, it exposes specific API for each and every usage needed. For example, it communicates with asteroid-music with to the [https://github.com/AsteroidOS/asteroid-music/blob/master/main.qml#L98 MPRIS API], with asteroid-launcher based on the FreeDesktop’s notification API or with asteroid-weather thanks to data saved in the dconf “register”.&lt;br /&gt;
&lt;br /&gt;
=Bluetooth Personal Area Network=&lt;br /&gt;
In order to use BT PAN on AsteroidOS, you first need to modify the default image. Start by adding the following packages to the &amp;lt;i&amp;gt;IMAGE_INSTALL&amp;lt;/i&amp;gt; variable of &amp;lt;code&amp;gt;asteroid/src/meta-asteroid/classes/asteroid-image.bbclass&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;bluez5-testtools bluez5-noinst-tools python-dbus connman-client&amp;lt;/pre&amp;gt;&lt;br /&gt;
You also need to modify the bluez5’s main configuration in &amp;lt;code&amp;gt;asteroid/src/meta-asteroid/recipes-connectivity/bluez5/bluez5/main.conf&amp;lt;/code&amp;gt; to&lt;br /&gt;
&amp;lt;pre&amp;gt;[General]&lt;br /&gt;
#ControllerMode = le&lt;br /&gt;
DiscoverableTimeout = 180&amp;lt;/pre&amp;gt;&lt;br /&gt;
Finally, modify &amp;lt;code&amp;gt;build/conf/bblayers.conf&amp;lt;/code&amp;gt; to add the following line to &amp;lt;code&amp;gt;BBLAYERS&amp;lt;/code&amp;gt;:&lt;br /&gt;
&amp;lt;pre&amp;gt;/path/to/src/meta-openembedded/meta-networking \&amp;lt;/pre&amp;gt;&lt;br /&gt;
After above changes, you can rebuild a new asteroid rootfs and install it to the watch as described in [[Building AsteroidOS]].&lt;br /&gt;
In order to watch logs and check on progress, open up first a first terminal on the watch via [[SSH]] and run:&lt;br /&gt;
&amp;lt;pre&amp;gt;tail -F /var/log/messages&amp;lt;/pre&amp;gt;&lt;br /&gt;
In a new terminal, download and push the bt-pan helper script: ([http://blog.fraggod.net/2015/03/28/bluetooth-pan-network-setup-with-bluez-5x.html more info])&lt;br /&gt;
&amp;lt;pre&amp;gt;wget https://raw.githubusercontent.com/mk-fg/fgtk/master/bt-pan&lt;br /&gt;
chmod +x ./bt-pan&lt;br /&gt;
scp bt-pan ceres@192.168.2.15:/tmp/bluetooth/bt-pan&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now, fix up DNS and make sure localhost is a known thing by modifying (if needed) &amp;lt;code&amp;gt;resolv.conf&amp;lt;/code&amp;gt; and hosts&lt;br /&gt;
&amp;lt;pre&amp;gt;sh-4.3# cat /etc/resolv.conf&lt;br /&gt;
nameserver 8.8.8.8&lt;br /&gt;
nameserver ::1&lt;br /&gt;
sh-4.3# cat /etc/hosts&lt;br /&gt;
127.0.0.1 localhost&amp;lt;/pre&amp;gt;&lt;br /&gt;
Make sure you can see bluetooth in connman:&lt;br /&gt;
&amp;lt;pre&amp;gt;sh-4.3# connmanctl technologies&lt;br /&gt;
...&lt;br /&gt;
/net/connman/technology/bluetooth&lt;br /&gt;
Name = Bluetooth&lt;br /&gt;
Type = bluetooth&lt;br /&gt;
Powered = True&lt;br /&gt;
Connected = False&lt;br /&gt;
Tethering = False&amp;lt;/pre&amp;gt;&lt;br /&gt;
You can now use bluetoothctl to establish a connection to your computer ([http://trac.gateworks.com/wiki/wireless/bluetooth#PersonalAreaNetworkDeviceProfilePAN more info])&lt;br /&gt;
&amp;lt;pre&amp;gt;sh-4.3# bluetoothctl&lt;br /&gt;
[NEW] Controller 20:70:02:A0:1F:AC dory [default]&lt;br /&gt;
[NEW] Device 3C:15:C2:C7:DA:95 my-rmbp2&lt;br /&gt;
agent on&lt;br /&gt;
default-agent&lt;br /&gt;
discoverable on&lt;br /&gt;
pairable on&lt;br /&gt;
scan on&lt;br /&gt;
pair 3C:15:C2:C7:DA:95&lt;br /&gt;
trust 3C:15:C2:C7:DA:95&amp;lt;/pre&amp;gt;&lt;br /&gt;
Launch bt-pan client which triggers bnep0 creation from connman (you will see it in &amp;lt;code&amp;gt;/var/log/messages&amp;lt;/code&amp;gt;)&lt;br /&gt;
&amp;lt;pre&amp;gt;sh-4.3# /tmp/bluetooth/bt-pan --debug client 3C:15:C2:C7:DA:95&lt;br /&gt;
DEBUG:root:Using local device (addr: 20:70:02:A0:1F:AC): /org/bluez/hci0&lt;br /&gt;
DEBUG:root:Using remote device (addr: 3C:15:C2:C7:DA:95): /org/bluez/hci0/dev_3C_15_C2_C7_DA_95&lt;br /&gt;
DEBUG:root:Connected to network (dev_remote: /org/bluez/hci0/dev_3C_15_C2_C7_DA_95, addr: 3C:15:C2:C7:DA:95) uuid &#039;nap&#039; with iface: bnep0&lt;br /&gt;
DEBUG:root:Finished&amp;lt;/pre&amp;gt;&lt;br /&gt;
At this point your default route should still be rndis0 (USB OTG) instead of bnep0:&lt;br /&gt;
&amp;lt;pre&amp;gt;sh-4.3# ip route&lt;br /&gt;
default via 192.168.2.1 dev rndis0&lt;br /&gt;
192.168.2.0/24 dev rndis0 proto kernel scope link src 192.168.2.15&amp;lt;/pre&amp;gt;&lt;br /&gt;
If the ip/bcast/netmask fields are missing on bnep0:&lt;br /&gt;
&amp;lt;pre&amp;gt;sh-4.3# ifconfig bnep0&lt;br /&gt;
bnep0 Link encap:Ethernet HWaddr 20:70:02:A0:1F:AC&lt;br /&gt;
inet6 addr: fe80::2270:2ff:fea0:1fac%1202001524/64 Scope:Link&lt;br /&gt;
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1&lt;br /&gt;
RX packets:39 errors:0 dropped:0 overruns:0 frame:0&lt;br /&gt;
TX packets:4 errors:0 dropped:0 overruns:0 carrier:0&lt;br /&gt;
collisions:0 txqueuelen:1000&lt;br /&gt;
RX bytes:10504 (10.2 KiB) TX bytes:148 (148.0 B)&amp;lt;/pre&amp;gt;&lt;br /&gt;
Fix it with ifconfig and verify it worked:&lt;br /&gt;
&amp;lt;pre&amp;gt;sh-4.3# ifconfig bnep0 192.168.2.2 netmask 255.255.255.0 broadcast 192.168.2.255&lt;br /&gt;
sh-4.3# ifconfig bnep0&lt;br /&gt;
bnep0 Link encap:Ethernet HWaddr 20:70:02:A0:1F:AC&lt;br /&gt;
inet addr:192.168.2.2 Bcast:192.168.2.255 Mask:255.255.255.0&lt;br /&gt;
inet6 addr: fe80::2270:2ff:fea0:1fac%1201331708/64 Scope:Link&lt;br /&gt;
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1&lt;br /&gt;
RX packets:134 errors:0 dropped:0 overruns:0 frame:0&lt;br /&gt;
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0&lt;br /&gt;
collisions:0 txqueuelen:1000&lt;br /&gt;
RX bytes:40369 (39.4 KiB) TX bytes:252 (252.0 B)&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now that both routes are available, data are still going over rndis0 instead of bnep0:&lt;br /&gt;
&amp;lt;pre&amp;gt;sh-4.3# ip route&lt;br /&gt;
default via 192.168.2.1 dev rndis0&lt;br /&gt;
192.168.2.0/24 dev rndis0 proto kernel scope link src 192.168.2.15&lt;br /&gt;
192.168.2.0/24 dev bnep0 proto kernel scope link src 192.168.2.2&amp;lt;/pre&amp;gt;&lt;br /&gt;
Delete default route and aad a new default one over bnep0&lt;br /&gt;
&amp;lt;pre&amp;gt;sh-4.3# ip route delete default&lt;br /&gt;
sh-4.3# ip route change default via 192.168.2.1 dev bnep0&amp;lt;/pre&amp;gt;&lt;br /&gt;
Verify default is now over bnep0:&lt;br /&gt;
&amp;lt;pre&amp;gt;sh-4.3# ip route&lt;br /&gt;
default via 192.168.2.1 dev bnep0&lt;br /&gt;
192.168.2.0/24 dev rndis0 proto kernel scope link src 192.168.2.15&lt;br /&gt;
192.168.2.0/24 dev bnep0 proto kernel scope link src 192.168.2.2&amp;lt;/pre&amp;gt;&lt;br /&gt;
You can now test your connection via ping and nslookup&lt;br /&gt;
&amp;lt;pre&amp;gt;sh-4.3# ping -c 1 8.8.8.8&lt;br /&gt;
PING 8.8.8.8 (8.8.8.8): 56 data bytes&lt;br /&gt;
64 bytes from 8.8.8.8: seq=0 ttl=42 time=80.094 ms&lt;br /&gt;
sh-4.3# nslookup www.google.com&lt;br /&gt;
Server: 8.8.8.8&lt;br /&gt;
Address 1: 8.8.8.8 google-public-dns-a.google.com&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Bluetooth Audio and HID=&lt;br /&gt;
You will need to enable legacy mode in order to connect to legacy (BR/EDR) mode Bluetooth devices. To enable legacy mode you will need to edit the configuration file &#039;&#039;&#039;on the watch&#039;&#039;&#039; via [[SSH]] use the following command:&lt;br /&gt;
&amp;lt;pre&amp;gt;sh-4.4# vi /etc/bluetooth/main.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now edit the contents to the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;[General]&lt;br /&gt;
#ControllerMode = le&lt;br /&gt;
DiscoverableTimeout = 180&amp;lt;/pre&amp;gt;&lt;br /&gt;
Next you will need to restart Bluetooth. To avoid weird behaviour its best to restart the entire system, use the following command:&lt;br /&gt;
&amp;lt;pre&amp;gt;sh-4.4# reboot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Now you are ready to connect a Bluetooth device to AsteroidOS use bluetoothctl to connect to a Bluetooth device:&lt;br /&gt;
&amp;lt;pre&amp;gt;sh-4.4# bluetoothctl&lt;br /&gt;
Agent registered&lt;br /&gt;
[bluetooth]# agent on&lt;br /&gt;
Agent is already registered&lt;br /&gt;
[bluetooth]# default-agent&lt;br /&gt;
[bluetooth]# discoverable on&lt;br /&gt;
[bluetooth]# pairable on&lt;br /&gt;
[bluetooth]# scan on&lt;br /&gt;
Default agent request successful&lt;br /&gt;
Changing pairable on succeeded&lt;br /&gt;
Changing discoverable on succeeded&lt;br /&gt;
[CHG] Controller 43:43:A0:12:1F:AC Discoverable: yes&lt;br /&gt;
Discovery started&lt;br /&gt;
[CHG] Controller 43:43:A0:12:1F:AC Discovering: yes&lt;br /&gt;
[NEW] Device 27:EC:10:01:00:1A Gamepad.&lt;br /&gt;
[bluetooth]# pair 27:EC:10:01:00:1A&lt;br /&gt;
Attempting to pair with 27:EC:10:01:00:1A&lt;br /&gt;
[CHG] Device 27:EC:10:01:00:1A Paired: yes&lt;br /&gt;
Pairing successful&lt;br /&gt;
[Gamepad.]# connect 27:EC:10:01:00:1A&lt;br /&gt;
Attempting to connect to 27:EC:10:01:00:1A&lt;br /&gt;
Connection successful&lt;br /&gt;
[Gamepad.]#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== A2DP audio playback ===&lt;br /&gt;
&lt;br /&gt;
Tested on the Huawei Watch 2 (`sawfish`) with a Bose NC 700 headset.&lt;br /&gt;
&lt;br /&gt;
AsteroidOS configures BlueZ for BLE-only operation by default. To use ordinary&lt;br /&gt;
Bluetooth audio headsets, enable both BLE and BR/EDR:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot;&amp;gt;&lt;br /&gt;
sudo cp -a /etc/bluetooth/main.conf /etc/bluetooth/main.conf.before-a2dp&lt;br /&gt;
sudo sed -i \&lt;br /&gt;
  &#039;s/^[[:space:]]*ControllerMode[[:space:]]*=[[:space:]]*.*/ControllerMode = dual/&#039; \&lt;br /&gt;
  /etc/bluetooth/main.conf&lt;br /&gt;
sudo systemctl restart bluetooth.service&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pair, trust and connect the headset using `bluetoothctl`. A successful A2DP&lt;br /&gt;
connection lists `Audio Sink` in `bluetoothctl info HEADSET_ADDRESS`, and&lt;br /&gt;
PulseAudio creates a sink named like&lt;br /&gt;
`bluez_sink.HEADSET_ADDRESS_WITH_UNDERSCORES.a2dp_sink`.&lt;br /&gt;
&lt;br /&gt;
On current images, `module-stream-restore-nemo` can restore the `x-maemo`&lt;br /&gt;
media role at `-20000` volume (silence). Fix its fallback rule:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot;&amp;gt;&lt;br /&gt;
sudo cp -a /etc/pulse/x-maemo-stream-restore.table \&lt;br /&gt;
  /etc/pulse/x-maemo-stream-restore.table.before-a2dp&lt;br /&gt;
sudo sed -i \&lt;br /&gt;
  &#039;s/^sink-input-by-media-role:x-maemo[[:space:]]\+-20000$/sink-input-by-media-role:x-maemo 0/&#039; \&lt;br /&gt;
  /etc/pulse/x-maemo-stream-restore.table&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Reload the module as user `ceres`:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot;&amp;gt;&lt;br /&gt;
pactl list short modules | grep stream-restore-nemo&lt;br /&gt;
pactl unload-module MODULE_ID&lt;br /&gt;
pactl load-module module-stream-restore-nemo \&lt;br /&gt;
  restore_device=no restore_volume=yes restore_muted=no \&lt;br /&gt;
  route_table=/etc/pulse/x-maemo-route.table \&lt;br /&gt;
  fallback_table=/etc/pulse/x-maemo-stream-restore.table use_voice=false&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A previously stored stream setting can still set a new playback stream to 0%.&lt;br /&gt;
While playback is active, inspect and fix it:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot;&amp;gt;&lt;br /&gt;
pactl list sink-inputs&lt;br /&gt;
pactl set-sink-input-mute SINK_INPUT_ID 0&lt;br /&gt;
pactl set-sink-input-volume SINK_INPUT_ID 100%&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Set the headset as the default output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot;&amp;gt;&lt;br /&gt;
pactl set-default-sink bluez_sink.HEADSET_ADDRESS_WITH_UNDERSCORES.a2dp_sink&lt;br /&gt;
pactl set-sink-mute bluez_sink.HEADSET_ADDRESS_WITH_UNDERSCORES.a2dp_sink 0&lt;br /&gt;
pactl set-sink-volume bluez_sink.HEADSET_ADDRESS_WITH_UNDERSCORES.a2dp_sink 100%&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Test playback with a tone:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot;&amp;gt;&lt;br /&gt;
gst-launch-1.0 -q \&lt;br /&gt;
  audiotestsrc wave=sine freq=880 num-buffers=430 ! \&lt;br /&gt;
  audioconvert ! audioresample ! \&lt;br /&gt;
  pulsesink device=bluez_sink.HEADSET_ADDRESS_WITH_UNDERSCORES.a2dp_sink&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=SSH&amp;diff=1035</id>
		<title>SSH</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=SSH&amp;diff=1035"/>
		<updated>2026-09-02T21:36:37Z</updated>

		<summary type="html">&lt;p&gt;Beroset: /* Root access via SSH */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;By default, you can get a remote shell on you smartwatch with SSH over RNDIS. On some smartwatches, it is also possible to use SSH with Wi-Fi.&lt;br /&gt;
&lt;br /&gt;
== SSH over USB ==&lt;br /&gt;
USB Moded already set up udhcpd so that your watch gets the 192.168.2.15 IP address on its rndis interface. You can then connect to your watch from your computer with the following command:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh ceres@192.168.2.15&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If your computer does not automatically get an IP address for its rndis interface, you might need to run this first:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo dhclient -v enp0s20f0u8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH over WiFi ==&lt;br /&gt;
&lt;br /&gt;
Dropbear is already running on the watch so we just need to configure an IP address to connect to.&lt;br /&gt;
The [[IP Connection]] page describes how to set up Wi-Fi.&lt;br /&gt;
Once the setup is done, you can look for the IP address your Router assigned via DHCP, with &lt;br /&gt;
&amp;lt;pre&amp;gt;# ip a show dev wlan0&amp;lt;/pre&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Root access via SSH ==&lt;br /&gt;
If you need to access root via ssh, there are two choices on the most recent builds.  First is to use &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; after having logged in as the &amp;lt;code&amp;gt;ceres&amp;lt;/code&amp;gt; user.  The other option is to copy ssh keys as described in [[OpenEmbedded#A_word_about_root_access]]&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting SSH ==&lt;br /&gt;
&lt;br /&gt;
* Using SCP/SSH results in a &amp;lt;code&amp;gt;REMOTE HOST IDENTIFICATION HAS CHANGED!&amp;lt;/code&amp;gt; warning&lt;br /&gt;
** This means that there is already a different device known with the same IP adress. This happens if you reinstall AsteroidOS or you use multiple watches. The warning can be resolved by removing the record of the IP adress from the list of known hosts as follows: &lt;br /&gt;
&amp;lt;pre&amp;gt;ssh-keygen -R 192.168.2.15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
= ADB =&lt;br /&gt;
&lt;br /&gt;
Some watches have a known issue with the SSH implementation that prevents a working SSH connection. On these devices, ADB (Android Debug Bridge) is the only available shell access method.&lt;br /&gt;
&lt;br /&gt;
ADB can also be used as a straightforward alternative to SSH on any supported watch, and provides equivalent root shell access.&lt;br /&gt;
&lt;br /&gt;
== Enabling ADB ==&lt;br /&gt;
&lt;br /&gt;
ADB and SSH are both enabled and disabled individually in &#039;&#039;&#039;Settings &amp;gt; USB&#039;&#039;&#039;. Selecting &#039;&#039;&#039;Charging only&#039;&#039;&#039; disables both. The toggle takes effect immediately without a restart.&lt;br /&gt;
&lt;br /&gt;
== Connecting ==&lt;br /&gt;
&lt;br /&gt;
With ADB enabled and the watch connected over USB, open a shell with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;adb shell&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This gives you a root shell equivalent to &amp;lt;code&amp;gt;ssh root@192.168.2.15&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Multiple watches ==&lt;br /&gt;
&lt;br /&gt;
When more than one watch is connected, ADB assigns each device a port. List all connected devices and their ports with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;adb devices&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Connect to a specific watch by passing its port with the &amp;lt;code&amp;gt;-s&amp;lt;/code&amp;gt; flag:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;adb -s &amp;lt;port&amp;gt; shell&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=SSH&amp;diff=1034</id>
		<title>SSH</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=SSH&amp;diff=1034"/>
		<updated>2026-09-02T21:34:32Z</updated>

		<summary type="html">&lt;p&gt;Beroset: Added notes about root access&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;By default, you can get a remote shell on you smartwatch with SSH over RNDIS. On some smartwatches, it is also possible to use SSH with Wi-Fi.&lt;br /&gt;
&lt;br /&gt;
== SSH over USB ==&lt;br /&gt;
USB Moded already set up udhcpd so that your watch gets the 192.168.2.15 IP address on its rndis interface. You can then connect to your watch from your computer with the following command:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh ceres@192.168.2.15&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
If your computer does not automatically get an IP address for its rndis interface, you might need to run this first:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo dhclient -v enp0s20f0u8&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSH over WiFi ==&lt;br /&gt;
&lt;br /&gt;
Dropbear is already running on the watch so we just need to configure an IP address to connect to.&lt;br /&gt;
The [[IP Connection]] page describes how to set up Wi-Fi.&lt;br /&gt;
Once the setup is done, you can look for the IP address your Router assigned via DHCP, with &lt;br /&gt;
&amp;lt;pre&amp;gt;# ip a show dev wlan0&amp;lt;/pre&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Root access via SSH ==&lt;br /&gt;
If you need to access root via ssh, there are two choices on the most recent builds.  First is to use &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; after having logged in as the &amp;lt;code&amp;gt;ceres&amp;lt;/code&amp;gt; user.  The other option is to copy ssh keys as described here:  https://wiki.asteroidos.org/index.php/OpenEmbedded#A_word_about_root_access&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting SSH ==&lt;br /&gt;
&lt;br /&gt;
* Using SCP/SSH results in a &amp;lt;code&amp;gt;REMOTE HOST IDENTIFICATION HAS CHANGED!&amp;lt;/code&amp;gt; warning&lt;br /&gt;
** This means that there is already a different device known with the same IP adress. This happens if you reinstall AsteroidOS or you use multiple watches. The warning can be resolved by removing the record of the IP adress from the list of known hosts as follows: &lt;br /&gt;
&amp;lt;pre&amp;gt;ssh-keygen -R 192.168.2.15&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
= ADB =&lt;br /&gt;
&lt;br /&gt;
Some watches have a known issue with the SSH implementation that prevents a working SSH connection. On these devices, ADB (Android Debug Bridge) is the only available shell access method.&lt;br /&gt;
&lt;br /&gt;
ADB can also be used as a straightforward alternative to SSH on any supported watch, and provides equivalent root shell access.&lt;br /&gt;
&lt;br /&gt;
== Enabling ADB ==&lt;br /&gt;
&lt;br /&gt;
ADB and SSH are both enabled and disabled individually in &#039;&#039;&#039;Settings &amp;gt; USB&#039;&#039;&#039;. Selecting &#039;&#039;&#039;Charging only&#039;&#039;&#039; disables both. The toggle takes effect immediately without a restart.&lt;br /&gt;
&lt;br /&gt;
== Connecting ==&lt;br /&gt;
&lt;br /&gt;
With ADB enabled and the watch connected over USB, open a shell with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;adb shell&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This gives you a root shell equivalent to &amp;lt;code&amp;gt;ssh root@192.168.2.15&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Multiple watches ==&lt;br /&gt;
&lt;br /&gt;
When more than one watch is connected, ADB assigns each device a port. List all connected devices and their ports with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;adb devices&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Connect to a specific watch by passing its port with the &amp;lt;code&amp;gt;-s&amp;lt;/code&amp;gt; flag:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;adb -s &amp;lt;port&amp;gt; shell&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=User_talk:Monperrus&amp;diff=1033</id>
		<title>User talk:Monperrus</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=User_talk:Monperrus&amp;diff=1033"/>
		<updated>2026-09-01T12:56:32Z</updated>

		<summary type="html">&lt;p&gt;Beroset: Created page with &amp;quot;Hi!  I rejected the edit to add asteroid-local-music but wanted to let you know why.  The app looks interesting and useful, but it&amp;#039;s not added to meta-asteroid-community yet.  Also, there should probably be a way to have both the existing music app and the local one coexisting on the same watch.&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Hi!  I rejected the edit to add asteroid-local-music but wanted to let you know why.  The app looks interesting and useful, but it&#039;s not added to meta-asteroid-community yet.  Also, there should probably be a way to have both the existing music app and the local one coexisting on the same watch.&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Seluna/solios&amp;diff=1031</id>
		<title>Seluna/solios</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Seluna/solios&amp;diff=1031"/>
		<updated>2026-08-29T10:16:11Z</updated>

		<summary type="html">&lt;p&gt;Beroset: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Watches&lt;br /&gt;
|Name=seluna&lt;br /&gt;
|OtherNames=solios,helios,sol,selene,luna&lt;br /&gt;
|Model=Google Pixel Watch 3&lt;br /&gt;
|ReleaseDate=2024-09-10&lt;br /&gt;
|Chipset=sw5100&lt;br /&gt;
|KernelVersion=5.15&lt;br /&gt;
|AndroidVersion=16&lt;br /&gt;
|Picture=&lt;br /&gt;
|Status=port in progress&lt;br /&gt;
|Stars=0&lt;br /&gt;
|StatusDisplay=good&lt;br /&gt;
|StatusTouch=good&lt;br /&gt;
|StatusBluetooth=bad&lt;br /&gt;
|StatusHaptics=good&lt;br /&gt;
|StatusTiltToWake=good&lt;br /&gt;
|StatusLightSensor=good&lt;br /&gt;
|StatusAlwaysOnDisplay=good&lt;br /&gt;
|StatusDualDisplay=missing&lt;br /&gt;
|StatusMicrophone=partial&lt;br /&gt;
|StatusSpeaker=partial&lt;br /&gt;
|StatusCompass=partial&lt;br /&gt;
|StatusSteps=partial&lt;br /&gt;
|StatusHeartRate=partial&lt;br /&gt;
|StatusUSB=partial&lt;br /&gt;
|StatusWLAN=bad&lt;br /&gt;
|StatusGPS=bad&lt;br /&gt;
|StatusNFC=bad&lt;br /&gt;
|StatusCellular=bad&lt;br /&gt;
|StatusCamera=missing&lt;br /&gt;
|StatusCrown=missing&lt;br /&gt;
|StatusHands=missing&lt;br /&gt;
}}&lt;br /&gt;
[[Category:Watches]]&lt;br /&gt;
seluna (Pixel Watch 3 LTE) and solios (Pixel Watch 3 Wi-Fi/Bluetooth) are Android 16 smartwatches featuring the Qualcomm Snapdragon W5 Gen 1 chipset (monaco).&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
This watch is sold in 4 variations. LTE and Wi-Fi versions in both 41 mm and 45 mm:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Codename !! Model Name&lt;br /&gt;
!Note&lt;br /&gt;
|-&lt;br /&gt;
| seluna || Pixel Watch 3 LTE&lt;br /&gt;
|selene+luna=seluna=common LTE platform&lt;br /&gt;
|-&lt;br /&gt;
|selene&lt;br /&gt;
|Pixel Watch 3 LTE (41 mm)&lt;br /&gt;
|Resolution: 408x408&lt;br /&gt;
|-&lt;br /&gt;
|luna&lt;br /&gt;
|Pixel Watch 3 LTE (45 mm)&lt;br /&gt;
|Resolution: 456x456&lt;br /&gt;
|-&lt;br /&gt;
| solios || Pixel Watch 3 Wi-Fi&lt;br /&gt;
|sol+helios=solios=common Wi-Fi platform&lt;br /&gt;
|-&lt;br /&gt;
|helios&lt;br /&gt;
|Pixel Watch 3 Wi-Fi (41 mm)&lt;br /&gt;
|Resolution: 408x408&lt;br /&gt;
|-&lt;br /&gt;
|sol&lt;br /&gt;
|Pixel Watch 3 Wi-Fi (41 mm)&lt;br /&gt;
|Resolution: 456x456&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Bootloader Unlock ===&lt;br /&gt;
The bootloader of the Pixel Watch 3 can be unlocked by enabling “OEM unlock” within the Android developer options, rebooting into bootloader mode via ADB and unlocking afterward via fastboot.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# reboot to bootloader&lt;br /&gt;
adb reboot bootloader&lt;br /&gt;
&lt;br /&gt;
# check if the watch is unlockable. If yes it returns &amp;quot;1&amp;quot;&lt;br /&gt;
fastboot flashing get_unlock_ability&lt;br /&gt;
&lt;br /&gt;
# ask the device to prompt for bootloader unlock&lt;br /&gt;
fastboot flashing unlock&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;After issuing the unlock command, the action must be confirmed on the watch.&lt;br /&gt;
&lt;br /&gt;
=== Fastboot ===&lt;br /&gt;
You can reach Fastboot Mode without pairing the device by tapping the upper left and lower right of the display right after booting (the first Google Logo). See also [https://support.google.com/googlepixelwatch/answer/13575675?hl=en-GB here].&lt;br /&gt;
&lt;br /&gt;
=== Repair ===&lt;br /&gt;
The Pixel Watch 3 has replaceable straps, but the device is glued shut, making repair attempts harder.&lt;br /&gt;
&lt;br /&gt;
=== Firmware ===&lt;br /&gt;
OTA firmware images are available on [https://developers.google.com/android/ota-watch?hl=de#seluna developers.google.com]. The zip files contain a file called payload.bin that can be extracted with [https://github.com/ssut/payload-dumper-go payload-dumper-go].&lt;br /&gt;
&lt;br /&gt;
Once extracted, the partitions are contained in named image files. e.g. &amp;lt;code&amp;gt;boot.img&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Seluna/solios&amp;diff=1030</id>
		<title>Seluna/solios</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Seluna/solios&amp;diff=1030"/>
		<updated>2026-08-29T10:13:21Z</updated>

		<summary type="html">&lt;p&gt;Beroset: Updated features list&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Watches&lt;br /&gt;
|Name=seluna&lt;br /&gt;
|OtherNames=solios&lt;br /&gt;
|Model=Google Pixel Watch 3&lt;br /&gt;
|ReleaseDate=2024-09-10&lt;br /&gt;
|Chipset=sw5100&lt;br /&gt;
|KernelVersion=5.15&lt;br /&gt;
|AndroidVersion=16&lt;br /&gt;
|Picture=catfish.png&lt;br /&gt;
|Status=port in progress&lt;br /&gt;
|Stars=0&lt;br /&gt;
|StatusDisplay=good&lt;br /&gt;
|StatusTouch=good&lt;br /&gt;
|StatusBluetooth=bad&lt;br /&gt;
|StatusHaptics=good&lt;br /&gt;
|StatusTiltToWake=good&lt;br /&gt;
|StatusLightSensor=good&lt;br /&gt;
|StatusAlwaysOnDisplay=good&lt;br /&gt;
|StatusDualDisplay=missing&lt;br /&gt;
|StatusMicrophone=partial&lt;br /&gt;
|StatusSpeaker=partial&lt;br /&gt;
|StatusCompass=partial&lt;br /&gt;
|StatusSteps=partial&lt;br /&gt;
|StatusHeartRate=partial&lt;br /&gt;
|StatusUSB=partial&lt;br /&gt;
|StatusWLAN=bad&lt;br /&gt;
|StatusGPS=bad&lt;br /&gt;
|StatusNFC=bad&lt;br /&gt;
|StatusCellular=bad&lt;br /&gt;
|StatusCamera=missing&lt;br /&gt;
|StatusCrown=missing&lt;br /&gt;
|StatusHands=missing&lt;br /&gt;
}}&lt;br /&gt;
[[Category:Watches]]&lt;br /&gt;
seluna (Pixel Watch 3 LTE) and solios (Pixel Watch 3 Wi-Fi/Bluetooth) are Android 16 smartwatches featuring the Qualcomm Snapdragon W5 Gen 1 chipset (monaco).&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
This watch is sold in 4 variations. LTE and Wi-Fi versions in both 41 mm and 45 mm:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Codename !! Model Name&lt;br /&gt;
!Note&lt;br /&gt;
|-&lt;br /&gt;
| seluna || Pixel Watch 3 LTE&lt;br /&gt;
|selene+luna=seluna=common LTE platform&lt;br /&gt;
|-&lt;br /&gt;
|selene&lt;br /&gt;
|Pixel Watch 3 LTE (41 mm)&lt;br /&gt;
|Resolution: 408x408&lt;br /&gt;
|-&lt;br /&gt;
|luna&lt;br /&gt;
|Pixel Watch 3 LTE (45 mm)&lt;br /&gt;
|Resolution: 456x456&lt;br /&gt;
|-&lt;br /&gt;
| solios || Pixel Watch 3 Wi-Fi&lt;br /&gt;
|sol+helios=solios=common Wi-Fi platform&lt;br /&gt;
|-&lt;br /&gt;
|helios&lt;br /&gt;
|Pixel Watch 3 Wi-Fi (41 mm)&lt;br /&gt;
|Resolution: 408x408&lt;br /&gt;
|-&lt;br /&gt;
|sol&lt;br /&gt;
|Pixel Watch 3 Wi-Fi (41 mm)&lt;br /&gt;
|Resolution: 456x456&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Bootloader Unlock ===&lt;br /&gt;
The bootloader of the Pixel Watch 3 can be unlocked by enabling “OEM unlock” within the Android developer options, rebooting into bootloader mode via ADB and unlocking afterward via fastboot.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# reboot to bootloader&lt;br /&gt;
adb reboot bootloader&lt;br /&gt;
&lt;br /&gt;
# check if the watch is unlockable. If yes it returns &amp;quot;1&amp;quot;&lt;br /&gt;
fastboot flashing get_unlock_ability&lt;br /&gt;
&lt;br /&gt;
# ask the device to prompt for bootloader unlock&lt;br /&gt;
fastboot flashing unlock&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;After issuing the unlock command, the action must be confirmed on the watch.&lt;br /&gt;
&lt;br /&gt;
=== Fastboot ===&lt;br /&gt;
You can reach Fastboot Mode without pairing the device by tapping the upper left and lower right of the display right after booting (the first Google Logo). See also [https://support.google.com/googlepixelwatch/answer/13575675?hl=en-GB here].&lt;br /&gt;
&lt;br /&gt;
=== Repair ===&lt;br /&gt;
The Pixel Watch 3 has replaceable straps, but the device is glued shut, making repair attempts harder.&lt;br /&gt;
&lt;br /&gt;
=== Firmware ===&lt;br /&gt;
OTA firmware images are available on [https://developers.google.com/android/ota-watch?hl=de#seluna developers.google.com]. The zip files contain a file called payload.bin that can be extracted with [https://github.com/ssut/payload-dumper-go payload-dumper-go].&lt;br /&gt;
&lt;br /&gt;
Once extracted, the partitions are contained in named image files. e.g. &amp;lt;code&amp;gt;boot.img&amp;lt;/code&amp;gt;.&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=OpenEmbedded&amp;diff=1028</id>
		<title>OpenEmbedded</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=OpenEmbedded&amp;diff=1028"/>
		<updated>2026-08-12T16:24:44Z</updated>

		<summary type="html">&lt;p&gt;Beroset: /* A word about root access */ clarified language&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://www.openembedded.org/wiki/Main_Page OpenEmbedded] (OE) is the build system used by AsteroidOS. It provides a way to easily maintain embedded Linux distributions. OE is also used by projects such as WebOS-Ports, SHR or Ångström. OpenEmbedded is supported by the [https://www.yoctoproject.org/ Yocto project] from the Linux Foundation and provides a rock-solid basis for AsteroidOS.&lt;br /&gt;
&lt;br /&gt;
OpenEmbedded uses the [https://docs.yoctoproject.org/bitbake/ &amp;lt;code&amp;gt;bitbake&amp;lt;/code&amp;gt;] tool which is developed in Python to generate images (like &amp;lt;code&amp;gt;asteroid-image&amp;lt;/code&amp;gt;) from packages (like &amp;lt;code&amp;gt;asteroid-launcher-dev&amp;lt;/code&amp;gt;) built from recipes (ex: &amp;lt;code&amp;gt;asteroid-launcher_git.bb&amp;lt;/code&amp;gt;) provided in layers (ex: &amp;lt;code&amp;gt;meta-asteroid&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Layers are git repositories containing a bunch of related recipes, example of layers include board support packages (BSPs) like [https://github.com/AsteroidOS/meta-smartwatch/tree/master/meta-dory meta-dory-hybris] or &amp;lt;code&amp;gt;meta-rockchip&amp;lt;/code&amp;gt; which describe a way to support a new machine, but also UI layers like &amp;lt;code&amp;gt;meta-xfce&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;meta-gnome&amp;lt;/code&amp;gt; which describe the building process of graphic components.&lt;br /&gt;
&lt;br /&gt;
A recipe describes how to fetch, patch, configure, compile, install, package (in &amp;lt;code&amp;gt;.rpm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.deb&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;.ipk&amp;lt;/code&amp;gt;) and test a piece of software. Bitbake handles all those operations and the dependencies between them and between recipes. In the end it can generate images or an SDK for multiple targets.&lt;br /&gt;
&lt;br /&gt;
Contributing to the AsteroidOS’s OE architecture mostly consists in maintaining the [https://github.com/AsteroidOS/meta-asteroid meta-asteroid] and [https://github.com/AsteroidOS/meta-smartwatch meta-smartwatch] repositories which contain the recipes related to AsteroidOS and the watches&#039; BSPs.&lt;br /&gt;
&lt;br /&gt;
In depth info can be found in the [https://docs.yoctoproject.org/index.html Yocto Project&#039;s manual]&lt;br /&gt;
&lt;br /&gt;
[[File:Openembedded.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=A Quick Tutorial=&lt;br /&gt;
&lt;br /&gt;
The rest of this description assumes that you have already read and followed the [[Building AsteroidOS]] instructions, and that you have built AsteroidOS for at least one platform (a particular watch or the emulator), and that you are familiar with [https://www.atlassian.com/git/tutorials &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt;] and the [https://www.linux.org/forums/linux-beginner-tutorials.123/ Linux] command line.&lt;br /&gt;
&lt;br /&gt;
This tutorial will introduce you to the following topics:&lt;br /&gt;
&lt;br /&gt;
*[[OpenEmbedded#Changing an Existing Application|Changing an Existing Application]] You don&#039;t like how something behaves or want to fix an issue in an existing application? This will introduce you to the tooling used to allow you to make these changes.&lt;br /&gt;
* [[OpenEmbedded#Adding a New Application|Adding a New Application]] Use the tooling to create a new application recipe and test it on a watch.&lt;br /&gt;
*[[OpenEmbedded#Sharing your changes|Sharing your changes]] You&#039;ve made changes on your local build of AsteroidOS. How do you share these changes? This will be explained in this part of the tutorial.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Changing an Existing Application==&lt;br /&gt;
&lt;br /&gt;
This will guide you step-by-step from the process of wanting to make a change to actually making that change and getting it running on your watch.&lt;br /&gt;
&lt;br /&gt;
Let&#039;s say that you want to make a simple change to the flashlight app on the watch. Your favorite color is blue, so you want to change the flashlight screen&#039;s color to a blue color.&lt;br /&gt;
&lt;br /&gt;
Since you have already run &amp;lt;code&amp;gt;bitbake asteroid-image&amp;lt;/code&amp;gt; you know that there are over 5000 tasks to create the image file that can be flashed to a watch. How do you figure out which of those 5000 tasks builds the flashlight application?&lt;br /&gt;
&lt;br /&gt;
Two fundamental concepts within Yocto and bitbake are the &#039;&#039;layer&#039;&#039; and the &#039;&#039;recipe&#039;&#039; as mentioned above. Examine the layers in the AsteroidOS project:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bitbake-layers show-layers&lt;br /&gt;
NOTE: Starting bitbake server...&lt;br /&gt;
layer                 path                                      priority&lt;br /&gt;
==========================================================================&lt;br /&gt;
meta-qt5              /home/developer/asteroid/src/meta-qt5  7&lt;br /&gt;
meta                  /home/developer/asteroid/src/oe-core/meta  5&lt;br /&gt;
meta-asteroid         /home/developer/asteroid/src/meta-asteroid  7&lt;br /&gt;
meta-asteroid-community  /home/developer/asteroid/src/meta-asteroid-community  7&lt;br /&gt;
meta-oe               /home/developer/asteroid/src/meta-openembedded/meta-oe  5&lt;br /&gt;
meta-multimedia       /home/developer/asteroid/src/meta-openembedded/meta-multimedia  5&lt;br /&gt;
meta-gnome            /home/developer/asteroid/src/meta-openembedded/meta-gnome  5&lt;br /&gt;
meta-networking       /home/developer/asteroid/src/meta-openembedded/meta-networking  5&lt;br /&gt;
meta-android          /home/developer/asteroid/src/meta-smartphone/meta-android  7&lt;br /&gt;
meta-python           /home/developer/asteroid/src/meta-openembedded/meta-python  5&lt;br /&gt;
meta-filesystems      /home/developer/asteroid/src/meta-openembedded/meta-filesystems  5&lt;br /&gt;
meta-anthias          /home/developer/asteroid/src/meta-smartwatch/meta-anthias  7&lt;br /&gt;
meta-bass             /home/developer/asteroid/src/meta-smartwatch/meta-bass  7&lt;br /&gt;
meta-beluga           /home/developer/asteroid/src/meta-smartwatch/meta-beluga  7&lt;br /&gt;
meta-catfish          /home/developer/asteroid/src/meta-smartwatch/meta-catfish  7&lt;br /&gt;
meta-dory             /home/developer/asteroid/src/meta-smartwatch/meta-dory  7&lt;br /&gt;
meta-lenok            /home/developer/asteroid/src/meta-smartwatch/meta-lenok  8&lt;br /&gt;
meta-mooneye          /home/developer/asteroid/src/meta-smartwatch/meta-mooneye  7&lt;br /&gt;
meta-mtk6580          /home/developer/asteroid/src/meta-smartwatch/meta-mtk6580  7&lt;br /&gt;
meta-narwhal          /home/developer/asteroid/src/meta-smartwatch/meta-narwhal  7&lt;br /&gt;
meta-ray              /home/developer/asteroid/src/meta-smartwatch/meta-ray  7&lt;br /&gt;
meta-sawfish          /home/developer/asteroid/src/meta-smartwatch/meta-sawfish  7&lt;br /&gt;
meta-skipjack         /home/developer/asteroid/src/meta-smartwatch/meta-skipjack  6&lt;br /&gt;
meta-smelt            /home/developer/asteroid/src/meta-smartwatch/meta-smelt  7&lt;br /&gt;
meta-sparrow          /home/developer/asteroid/src/meta-smartwatch/meta-sparrow  7&lt;br /&gt;
meta-sprat            /home/developer/asteroid/src/meta-smartwatch/meta-sprat  7&lt;br /&gt;
meta-sturgeon         /home/developer/asteroid/src/meta-smartwatch/meta-sturgeon  7&lt;br /&gt;
meta-swift            /home/developer/asteroid/src/meta-smartwatch/meta-swift  8&lt;br /&gt;
meta-tetra            /home/developer/asteroid/src/meta-smartwatch/meta-tetra  7&lt;br /&gt;
meta-wren             /home/developer/asteroid/src/meta-smartwatch/meta-wren  7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By convention, Yocto layers all begin with &amp;lt;code&amp;gt;meta&amp;lt;/code&amp;gt;. There are layers for individual pieces such as Qt, networking, Python, and filesystems. These are followed by the layers for each of the watch codenames. If you are looking for an AsteroidOS-specific application, you can probably guess that it&#039;s in the &amp;lt;code&amp;gt;meta-asteroid&amp;lt;/code&amp;gt; layer, but you can also ask the computer to search for you.&lt;br /&gt;
&lt;br /&gt;
Originally, &amp;lt;code&amp;gt;bitbake&amp;lt;/code&amp;gt; and its related tools were the only way to do things, but there is now a newer and much more convenient tool named [https://docs.yoctoproject.org/dev/ref-manual/devtool-reference.html &amp;lt;code&amp;gt;devtool&amp;lt;/code&amp;gt;]. To search for a recipe with &amp;lt;code&amp;gt;flashlight&amp;lt;/code&amp;gt; in the name:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
devtool search flashlight&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After a minute or so, &amp;lt;code&amp;gt;devtool&amp;lt;/code&amp;gt; finds a single recipe: &amp;lt;code&amp;gt;asteroid-flashlight&amp;lt;/code&amp;gt;. You can now modify this recipe:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
devtool modify asteroid-flashlight&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The last two lines of output will be something like these:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
INFO: Source tree extracted to /home/developer/asteroid/build/workspace/sources/asteroid-flashlight&lt;br /&gt;
INFO: Recipe asteroid-flashlight now set up to build from /home/developer/asteroid/build/workspace/sources/asteroid-flashlight&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Navigate into this directory, and find the relevant line in &amp;lt;code&amp;gt;src/main.qml&amp;lt;/code&amp;gt; and alter the color from white to light blue:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
color: flashOn ? &amp;quot;lightblue&amp;quot; : &amp;quot;#66444444&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Save the altered source code and build this copy of the flashlight app:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
devtool build asteroid-flashlight&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After some time, the build will complete and you can test the application on a watch.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
devtool deploy-target asteroid-flashlight root@192.168.2.15&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now the flashlight app will show a light blue screen. Reverting to the original version is very simple:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
devtool undeploy-target asteroid-flashlight root@192.168.2.15&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Adding a New Application==&lt;br /&gt;
&lt;br /&gt;
Let&#039;s say you have decided to create a new application. As described in [[Creating an Asteroid app]] page, the [https://github.com/AsteroidOS/asteroid-helloworld Asteroid-helloworld] which can be used as the basis for your own new application can be cloned and then modified. So let&#039;s say you&#039;ve done that and now you&#039;d like to integrate the app into the Yocto and bitbake build system.&lt;br /&gt;
&lt;br /&gt;
For these instructions, it is assumed that you have already built AsteroidOS for &amp;lt;code&amp;gt;sturgeon&amp;lt;/code&amp;gt; (or your preferred test platform). Let&#039;s say you have already cloned the &amp;lt;code&amp;gt;asteroid-helloworld&amp;lt;/code&amp;gt; into a directory named &amp;lt;code&amp;gt;~/tools/AsteroidOS/asteroid-helloworld/&amp;lt;/code&amp;gt;. You can very easily create a recipe for it with &amp;lt;code&amp;gt;devtool&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
devtool add hello ~/tools/AsteroidOS/asteroid-helloworld/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ devtool add hello ~/tools/AsteroidOS/asteroid-helloworld/&lt;br /&gt;
NOTE: Starting bitbake server...&lt;br /&gt;
NOTE: Starting bitbake server...&lt;br /&gt;
INFO: Please add the following line for &#039;LICENSE&#039; to a &#039;lib/recipetool/licenses.csv&#039; and replace `Unknown` with the license:&lt;br /&gt;
84dcc94da3adb52b53ae4fa38fe49e5d,Unknown&lt;br /&gt;
NOTE: Starting bitbake server...&lt;br /&gt;
INFO: Recipe /home/developer/asteroid/build/workspace/recipes/hello/hello_git.bb has been automatically created; further editing may be required to make it fully functional&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So the tool has created a recipe based on just the name we have given and the directory containing the source. Since it seems unsure about the license and suggests that further editing might be required, let&#039;s take its advice and edit the recipe. The simplest way to do that is again to use &amp;lt;code&amp;gt;devtool&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
devtool edit-recipe hello&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will open the recipe in an editor. It says that the license is unknown, so we change the line from &amp;lt;code&amp;gt;LICENSE = &amp;quot;Unknown&amp;quot;&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;LICENSE = &amp;quot;GPL-3.0-only&amp;quot;&amp;lt;/code&amp;gt;. Not that the &amp;lt;code&amp;gt;SRC_URI&amp;lt;/code&amp;gt; is set to point to a git repository. This is because &amp;lt;code&amp;gt;devtool&amp;lt;/code&amp;gt; is smart enough to figure out that even though you gave it a local directory, it discovered that the source was actually git and made the appropriate changes. We can now attempt to build.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
devtool build hello&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However this fails because we&#039;re still missing something. In this case, we&#039;re missing two things. First, instead of the &amp;lt;code&amp;gt;inherit cmake&amp;lt;/code&amp;gt; line, it should be &amp;lt;code&amp;gt;inherit cmake_qt5&amp;lt;/code&amp;gt; and second, we need to add the following line just below that:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPENDS += &amp;quot;qml-asteroid asteroid-generate-desktop-native qttools-native qtdeclarative-native&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With those two small changes, we should now get a successful build.&lt;br /&gt;
&lt;br /&gt;
===A word about root access===&lt;br /&gt;
If you&#039;re building for a pre-2.2 AsteroidOS, no special setup is required, since those versions used an empty root password.    &lt;br /&gt;
&lt;br /&gt;
However, starting with version 2.2 of AsteroidOS, root login via password is explicitly disabled by default.  So for the following section to work with version 2.2 or later, we have to set up root access via ssh keys.  &lt;br /&gt;
&lt;br /&gt;
The first thing that&#039;s needed is to generate a key-pair.  If the file &amp;lt;code&amp;gt;~/.ssh/id_ed25519.pub&amp;lt;/code&amp;gt; already exists, then this step is already done.  If it does not, you can generate the key pair like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh-keygen -t ed25519&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This creates a private key (&amp;lt;code&amp;gt;~/.ssh/id_ed25519&amp;lt;/code&amp;gt;) and a public key (&amp;lt;code&amp;gt;~/.ssh/id_ed25519.pub&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Once these are created, we need to add the contents of the public key to the watch.  One can copy the public key to the watch using `adb` and then append its contents to the &amp;lt;code&amp;gt;authorized_keys&amp;lt;/code&amp;gt; file. Execute these command on the host computer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
adb push id_ed25519.pub /home/root&lt;br /&gt;
adb shell&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then in the root shell on the watch, add the key to the list of authorized ones:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p ~/.ssh&lt;br /&gt;
chmod 700 ~/.ssh&lt;br /&gt;
cat ~/id_ed25519.pub &amp;gt;&amp;gt; ~/.ssh/authorized_keys&lt;br /&gt;
chmod 600 ~/.ssh/authorized_keys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets up the watch to allow password-less but secure root access.  You can now proceed to deploying the app on the watch.&lt;br /&gt;
&lt;br /&gt;
===Deploying to the watch===&lt;br /&gt;
As before, we can easily test on the watch.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
devtool deploy-target hello root@192.168.2.15&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will automatically install all of the install targets from the &amp;lt;code&amp;gt;hello&amp;lt;/code&amp;gt; project onto the watch. Start the launcher on the watch and scroll to the end of your list of apps, and you should now see a &amp;quot;HELLO WORLD APP&amp;quot; at the end. Running it will show &amp;quot;Hello World!&amp;quot; on the screen.&lt;br /&gt;
&lt;br /&gt;
Removing it from the watch is also the same as before:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
devtool undeploy-target hello root@192.168.2.15&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sharing your changes==&lt;br /&gt;
&lt;br /&gt;
If you make a change to AsteroidOS software that you think might be useful to others, such as a bug fix or feature enhancement, there are several ways to share it, depending on what exactly is being changed.&lt;br /&gt;
&lt;br /&gt;
*creating a recipe patch file&lt;br /&gt;
*creating a pull request for an AsteroidOS project&lt;br /&gt;
*creating an installable package (&amp;lt;code&amp;gt;.ipk&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Creating a recipe patch file==&lt;br /&gt;
&lt;br /&gt;
Many of the software packages that make up an AsteroidOS image are not unique to AsteroidOS. They may be general purpose tools such as &amp;lt;code&amp;gt;systemctl&amp;lt;/code&amp;gt; or watch-specific software from other open source repositories such as &amp;lt;code&amp;gt;mcetool&amp;lt;/code&amp;gt;. For these, there may be a need to introduce a patch just for AsteroidOS. To do so, first, within the appropriate &amp;lt;code&amp;gt;workspace&amp;lt;/code&amp;gt; directory where you made changes, use &amp;lt;code&amp;gt;git commit&amp;lt;/code&amp;gt; to commit the changes to the local repository. Once this is done, automatically create the patch. For our example, we could do that with this command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
devtool finish asteroid-flashlight meta-asteroid&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This creates one patch for each new git commit and automatically updates the recipe file in the named layer (in this case, &amp;lt;code&amp;gt;meta-asteroid&amp;lt;/code&amp;gt;). (Note that this is just an example and would not really be appropriate for &amp;lt;code&amp;gt;asteroid-flashlight&amp;lt;/code&amp;gt; because this application is unique to AsteroidOS.)  To see what was done, you can navigate to &amp;lt;code&amp;gt;asteroid/src/meta-asteroid&amp;lt;/code&amp;gt; and type &amp;lt;code&amp;gt;git diff&amp;lt;/code&amp;gt;. You will see that the patch file has been added to the recipe for &amp;lt;code&amp;gt;asteroid-flashlight&amp;lt;/code&amp;gt;. Also note that to ensure you don&#039;t lose any work, &amp;lt;code&amp;gt;devtool&amp;lt;/code&amp;gt; will not delete the directory tree in &amp;lt;code&amp;gt;workspace&amp;lt;/code&amp;gt; unless you specifically ask it to do so.&lt;br /&gt;
&lt;br /&gt;
==Create a pull request==&lt;br /&gt;
&lt;br /&gt;
For an AsteroidOS application, it may be more appropriate to create a [https://opensource.com/article/19/7/create-pull-request-github *pull request*]. To do that, we need to create a fork of the software we want to modify, create a branch, make the changes, commit and push the changes, and then create a pull request (PR). This guide doesn&#039;t describe all of these steps in detail, but describes how to use &amp;lt;code&amp;gt;devtool&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; to create a PR.&lt;br /&gt;
&lt;br /&gt;
Once the changes are made, as in the &amp;lt;code&amp;gt;asteroid-flashlight&amp;lt;/code&amp;gt; example above, you can simply use git to point to your own repository. Specifically, navigate to &amp;lt;code&amp;gt;asteroid/build/workspace/sources/asteroid-flashlight&amp;lt;/code&amp;gt; and use the command &amp;lt;code&amp;gt;git remote -v&amp;lt;/code&amp;gt; to see that the remote repository is the original source. Change it to point to your own repository with &amp;lt;code&amp;gt;git remote set-url origin MYCLONE&amp;lt;/code&amp;gt;, substituting your repository&#039;s URL for &amp;lt;code&amp;gt;MYCLONE&amp;lt;/code&amp;gt;. If you have already made local commits, you may wish to change the name of the branch from &amp;lt;code&amp;gt;devtool&amp;lt;/code&amp;gt; (which is what &amp;lt;code&amp;gt;devtool&amp;lt;/code&amp;gt; uses by default) to something meaningful to you before pushing the changes to your repository. Then create a PR from the new branch in the usual way.&lt;br /&gt;
&lt;br /&gt;
==Create an installable package==&lt;br /&gt;
&lt;br /&gt;
Chances are that your own Linux computer uses &amp;lt;code&amp;gt;.rpm&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;.deb&amp;lt;/code&amp;gt; files with a package manager to allow simplified installation of software. AsteroidOS uses the [https://en.wikipedia.org/wiki/Opkg &amp;lt;code&amp;gt;opkg&amp;lt;/code&amp;gt;] package manager which uses &amp;lt;code&amp;gt;.ipk&amp;lt;/code&amp;gt; files. To create one from your modified software, here we need to use &amp;lt;code&amp;gt;bitbake&amp;lt;/code&amp;gt; rather than &amp;lt;code&amp;gt;devtool&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bitbake asteroid-flashlight&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that this typically creates four different &amp;lt;code&amp;gt;ipk&amp;lt;/code&amp;gt; files. We can take a look:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd tmp/deploy/ipk/armv7vehf-neon/&lt;br /&gt;
ls asteroid-flashlight*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This returns the names of the four files:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
asteroid-flashlight-dbg_+git999-r1_armv7vehf-neon.ipk&lt;br /&gt;
asteroid-flashlight-dev_+git999-r1_armv7vehf-neon.ipk&lt;br /&gt;
asteroid-flashlight_+git999-r1_armv7vehf-neon.ipk&lt;br /&gt;
asteroid-flashlight-src_+git999-r1_armv7vehf-neon.ipk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We can ignore the &amp;lt;code&amp;gt;-dbg&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;-dev&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;-src&amp;lt;/code&amp;gt; files and simply choose the one with the shortest name, which is the release version of the package. We can copy it to the watch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
scp asteroid-flashlight_+git999-r1_armv7vehf-neon.ipk root@192.168.2.15:.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we can [[SSH]] as root to the watch (&amp;lt;code&amp;gt;ssh root@192.168.2.15&amp;lt;/code&amp;gt;) and install the package:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
opkg --force-reinstall install asteroid-flashlight_+git999-r1_armv7vehf-neon.ipk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=OpenEmbedded&amp;diff=1027</id>
		<title>OpenEmbedded</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=OpenEmbedded&amp;diff=1027"/>
		<updated>2026-08-12T16:23:04Z</updated>

		<summary type="html">&lt;p&gt;Beroset: /* Adding a New Application */  Added section on how to use devtool with AsteroidOS 2.2 and later&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://www.openembedded.org/wiki/Main_Page OpenEmbedded] (OE) is the build system used by AsteroidOS. It provides a way to easily maintain embedded Linux distributions. OE is also used by projects such as WebOS-Ports, SHR or Ångström. OpenEmbedded is supported by the [https://www.yoctoproject.org/ Yocto project] from the Linux Foundation and provides a rock-solid basis for AsteroidOS.&lt;br /&gt;
&lt;br /&gt;
OpenEmbedded uses the [https://docs.yoctoproject.org/bitbake/ &amp;lt;code&amp;gt;bitbake&amp;lt;/code&amp;gt;] tool which is developed in Python to generate images (like &amp;lt;code&amp;gt;asteroid-image&amp;lt;/code&amp;gt;) from packages (like &amp;lt;code&amp;gt;asteroid-launcher-dev&amp;lt;/code&amp;gt;) built from recipes (ex: &amp;lt;code&amp;gt;asteroid-launcher_git.bb&amp;lt;/code&amp;gt;) provided in layers (ex: &amp;lt;code&amp;gt;meta-asteroid&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
Layers are git repositories containing a bunch of related recipes, example of layers include board support packages (BSPs) like [https://github.com/AsteroidOS/meta-smartwatch/tree/master/meta-dory meta-dory-hybris] or &amp;lt;code&amp;gt;meta-rockchip&amp;lt;/code&amp;gt; which describe a way to support a new machine, but also UI layers like &amp;lt;code&amp;gt;meta-xfce&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;meta-gnome&amp;lt;/code&amp;gt; which describe the building process of graphic components.&lt;br /&gt;
&lt;br /&gt;
A recipe describes how to fetch, patch, configure, compile, install, package (in &amp;lt;code&amp;gt;.rpm&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;.deb&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;.ipk&amp;lt;/code&amp;gt;) and test a piece of software. Bitbake handles all those operations and the dependencies between them and between recipes. In the end it can generate images or an SDK for multiple targets.&lt;br /&gt;
&lt;br /&gt;
Contributing to the AsteroidOS’s OE architecture mostly consists in maintaining the [https://github.com/AsteroidOS/meta-asteroid meta-asteroid] and [https://github.com/AsteroidOS/meta-smartwatch meta-smartwatch] repositories which contain the recipes related to AsteroidOS and the watches&#039; BSPs.&lt;br /&gt;
&lt;br /&gt;
In depth info can be found in the [https://docs.yoctoproject.org/index.html Yocto Project&#039;s manual]&lt;br /&gt;
&lt;br /&gt;
[[File:Openembedded.png|frameless]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=A Quick Tutorial=&lt;br /&gt;
&lt;br /&gt;
The rest of this description assumes that you have already read and followed the [[Building AsteroidOS]] instructions, and that you have built AsteroidOS for at least one platform (a particular watch or the emulator), and that you are familiar with [https://www.atlassian.com/git/tutorials &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt;] and the [https://www.linux.org/forums/linux-beginner-tutorials.123/ Linux] command line.&lt;br /&gt;
&lt;br /&gt;
This tutorial will introduce you to the following topics:&lt;br /&gt;
&lt;br /&gt;
*[[OpenEmbedded#Changing an Existing Application|Changing an Existing Application]] You don&#039;t like how something behaves or want to fix an issue in an existing application? This will introduce you to the tooling used to allow you to make these changes.&lt;br /&gt;
* [[OpenEmbedded#Adding a New Application|Adding a New Application]] Use the tooling to create a new application recipe and test it on a watch.&lt;br /&gt;
*[[OpenEmbedded#Sharing your changes|Sharing your changes]] You&#039;ve made changes on your local build of AsteroidOS. How do you share these changes? This will be explained in this part of the tutorial.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Changing an Existing Application==&lt;br /&gt;
&lt;br /&gt;
This will guide you step-by-step from the process of wanting to make a change to actually making that change and getting it running on your watch.&lt;br /&gt;
&lt;br /&gt;
Let&#039;s say that you want to make a simple change to the flashlight app on the watch. Your favorite color is blue, so you want to change the flashlight screen&#039;s color to a blue color.&lt;br /&gt;
&lt;br /&gt;
Since you have already run &amp;lt;code&amp;gt;bitbake asteroid-image&amp;lt;/code&amp;gt; you know that there are over 5000 tasks to create the image file that can be flashed to a watch. How do you figure out which of those 5000 tasks builds the flashlight application?&lt;br /&gt;
&lt;br /&gt;
Two fundamental concepts within Yocto and bitbake are the &#039;&#039;layer&#039;&#039; and the &#039;&#039;recipe&#039;&#039; as mentioned above. Examine the layers in the AsteroidOS project:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bitbake-layers show-layers&lt;br /&gt;
NOTE: Starting bitbake server...&lt;br /&gt;
layer                 path                                      priority&lt;br /&gt;
==========================================================================&lt;br /&gt;
meta-qt5              /home/developer/asteroid/src/meta-qt5  7&lt;br /&gt;
meta                  /home/developer/asteroid/src/oe-core/meta  5&lt;br /&gt;
meta-asteroid         /home/developer/asteroid/src/meta-asteroid  7&lt;br /&gt;
meta-asteroid-community  /home/developer/asteroid/src/meta-asteroid-community  7&lt;br /&gt;
meta-oe               /home/developer/asteroid/src/meta-openembedded/meta-oe  5&lt;br /&gt;
meta-multimedia       /home/developer/asteroid/src/meta-openembedded/meta-multimedia  5&lt;br /&gt;
meta-gnome            /home/developer/asteroid/src/meta-openembedded/meta-gnome  5&lt;br /&gt;
meta-networking       /home/developer/asteroid/src/meta-openembedded/meta-networking  5&lt;br /&gt;
meta-android          /home/developer/asteroid/src/meta-smartphone/meta-android  7&lt;br /&gt;
meta-python           /home/developer/asteroid/src/meta-openembedded/meta-python  5&lt;br /&gt;
meta-filesystems      /home/developer/asteroid/src/meta-openembedded/meta-filesystems  5&lt;br /&gt;
meta-anthias          /home/developer/asteroid/src/meta-smartwatch/meta-anthias  7&lt;br /&gt;
meta-bass             /home/developer/asteroid/src/meta-smartwatch/meta-bass  7&lt;br /&gt;
meta-beluga           /home/developer/asteroid/src/meta-smartwatch/meta-beluga  7&lt;br /&gt;
meta-catfish          /home/developer/asteroid/src/meta-smartwatch/meta-catfish  7&lt;br /&gt;
meta-dory             /home/developer/asteroid/src/meta-smartwatch/meta-dory  7&lt;br /&gt;
meta-lenok            /home/developer/asteroid/src/meta-smartwatch/meta-lenok  8&lt;br /&gt;
meta-mooneye          /home/developer/asteroid/src/meta-smartwatch/meta-mooneye  7&lt;br /&gt;
meta-mtk6580          /home/developer/asteroid/src/meta-smartwatch/meta-mtk6580  7&lt;br /&gt;
meta-narwhal          /home/developer/asteroid/src/meta-smartwatch/meta-narwhal  7&lt;br /&gt;
meta-ray              /home/developer/asteroid/src/meta-smartwatch/meta-ray  7&lt;br /&gt;
meta-sawfish          /home/developer/asteroid/src/meta-smartwatch/meta-sawfish  7&lt;br /&gt;
meta-skipjack         /home/developer/asteroid/src/meta-smartwatch/meta-skipjack  6&lt;br /&gt;
meta-smelt            /home/developer/asteroid/src/meta-smartwatch/meta-smelt  7&lt;br /&gt;
meta-sparrow          /home/developer/asteroid/src/meta-smartwatch/meta-sparrow  7&lt;br /&gt;
meta-sprat            /home/developer/asteroid/src/meta-smartwatch/meta-sprat  7&lt;br /&gt;
meta-sturgeon         /home/developer/asteroid/src/meta-smartwatch/meta-sturgeon  7&lt;br /&gt;
meta-swift            /home/developer/asteroid/src/meta-smartwatch/meta-swift  8&lt;br /&gt;
meta-tetra            /home/developer/asteroid/src/meta-smartwatch/meta-tetra  7&lt;br /&gt;
meta-wren             /home/developer/asteroid/src/meta-smartwatch/meta-wren  7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By convention, Yocto layers all begin with &amp;lt;code&amp;gt;meta&amp;lt;/code&amp;gt;. There are layers for individual pieces such as Qt, networking, Python, and filesystems. These are followed by the layers for each of the watch codenames. If you are looking for an AsteroidOS-specific application, you can probably guess that it&#039;s in the &amp;lt;code&amp;gt;meta-asteroid&amp;lt;/code&amp;gt; layer, but you can also ask the computer to search for you.&lt;br /&gt;
&lt;br /&gt;
Originally, &amp;lt;code&amp;gt;bitbake&amp;lt;/code&amp;gt; and its related tools were the only way to do things, but there is now a newer and much more convenient tool named [https://docs.yoctoproject.org/dev/ref-manual/devtool-reference.html &amp;lt;code&amp;gt;devtool&amp;lt;/code&amp;gt;]. To search for a recipe with &amp;lt;code&amp;gt;flashlight&amp;lt;/code&amp;gt; in the name:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
devtool search flashlight&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After a minute or so, &amp;lt;code&amp;gt;devtool&amp;lt;/code&amp;gt; finds a single recipe: &amp;lt;code&amp;gt;asteroid-flashlight&amp;lt;/code&amp;gt;. You can now modify this recipe:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
devtool modify asteroid-flashlight&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The last two lines of output will be something like these:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
INFO: Source tree extracted to /home/developer/asteroid/build/workspace/sources/asteroid-flashlight&lt;br /&gt;
INFO: Recipe asteroid-flashlight now set up to build from /home/developer/asteroid/build/workspace/sources/asteroid-flashlight&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Navigate into this directory, and find the relevant line in &amp;lt;code&amp;gt;src/main.qml&amp;lt;/code&amp;gt; and alter the color from white to light blue:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
color: flashOn ? &amp;quot;lightblue&amp;quot; : &amp;quot;#66444444&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Save the altered source code and build this copy of the flashlight app:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
devtool build asteroid-flashlight&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After some time, the build will complete and you can test the application on a watch.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
devtool deploy-target asteroid-flashlight root@192.168.2.15&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now the flashlight app will show a light blue screen. Reverting to the original version is very simple:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
devtool undeploy-target asteroid-flashlight root@192.168.2.15&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Adding a New Application==&lt;br /&gt;
&lt;br /&gt;
Let&#039;s say you have decided to create a new application. As described in [[Creating an Asteroid app]] page, the [https://github.com/AsteroidOS/asteroid-helloworld Asteroid-helloworld] which can be used as the basis for your own new application can be cloned and then modified. So let&#039;s say you&#039;ve done that and now you&#039;d like to integrate the app into the Yocto and bitbake build system.&lt;br /&gt;
&lt;br /&gt;
For these instructions, it is assumed that you have already built AsteroidOS for &amp;lt;code&amp;gt;sturgeon&amp;lt;/code&amp;gt; (or your preferred test platform). Let&#039;s say you have already cloned the &amp;lt;code&amp;gt;asteroid-helloworld&amp;lt;/code&amp;gt; into a directory named &amp;lt;code&amp;gt;~/tools/AsteroidOS/asteroid-helloworld/&amp;lt;/code&amp;gt;. You can very easily create a recipe for it with &amp;lt;code&amp;gt;devtool&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
devtool add hello ~/tools/AsteroidOS/asteroid-helloworld/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ devtool add hello ~/tools/AsteroidOS/asteroid-helloworld/&lt;br /&gt;
NOTE: Starting bitbake server...&lt;br /&gt;
NOTE: Starting bitbake server...&lt;br /&gt;
INFO: Please add the following line for &#039;LICENSE&#039; to a &#039;lib/recipetool/licenses.csv&#039; and replace `Unknown` with the license:&lt;br /&gt;
84dcc94da3adb52b53ae4fa38fe49e5d,Unknown&lt;br /&gt;
NOTE: Starting bitbake server...&lt;br /&gt;
INFO: Recipe /home/developer/asteroid/build/workspace/recipes/hello/hello_git.bb has been automatically created; further editing may be required to make it fully functional&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
So the tool has created a recipe based on just the name we have given and the directory containing the source. Since it seems unsure about the license and suggests that further editing might be required, let&#039;s take its advice and edit the recipe. The simplest way to do that is again to use &amp;lt;code&amp;gt;devtool&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
devtool edit-recipe hello&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will open the recipe in an editor. It says that the license is unknown, so we change the line from &amp;lt;code&amp;gt;LICENSE = &amp;quot;Unknown&amp;quot;&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;LICENSE = &amp;quot;GPL-3.0-only&amp;quot;&amp;lt;/code&amp;gt;. Not that the &amp;lt;code&amp;gt;SRC_URI&amp;lt;/code&amp;gt; is set to point to a git repository. This is because &amp;lt;code&amp;gt;devtool&amp;lt;/code&amp;gt; is smart enough to figure out that even though you gave it a local directory, it discovered that the source was actually git and made the appropriate changes. We can now attempt to build.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
devtool build hello&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However this fails because we&#039;re still missing something. In this case, we&#039;re missing two things. First, instead of the &amp;lt;code&amp;gt;inherit cmake&amp;lt;/code&amp;gt; line, it should be &amp;lt;code&amp;gt;inherit cmake_qt5&amp;lt;/code&amp;gt; and second, we need to add the following line just below that:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEPENDS += &amp;quot;qml-asteroid asteroid-generate-desktop-native qttools-native qtdeclarative-native&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
With those two small changes, we should now get a successful build.&lt;br /&gt;
&lt;br /&gt;
===A word about root access===&lt;br /&gt;
If you&#039;re building for a pre-2.2 AsteroidOS, this will work directly, since those versions used an empty root password.  However, starting with version 2.2 of AsteroidOS, root login via password is explicitly disabled by default.  So for the following section to work with version 2.2 or later, we have to set up root access via ssh keys.  &lt;br /&gt;
&lt;br /&gt;
The first thing that&#039;s needed is to generate a key-pair.  If the file &amp;lt;code&amp;gt;~/.ssh/id_ed25519.pub&amp;lt;/code&amp;gt; already exists, then this step is already done.  If it does not, you can generate the key pair like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh-keygen -t ed25519&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This creates a private key (&amp;lt;code&amp;gt;~/.ssh/id_ed25519&amp;lt;/code&amp;gt;) and a public key (&amp;lt;code&amp;gt;~/.ssh/id_ed25519.pub&amp;lt;/code&amp;gt;). &lt;br /&gt;
&lt;br /&gt;
Once these are created, we need to add the contents of the public key to the watch.  One can copy the public key to the watch using `adb` and then append its contents to the &amp;lt;code&amp;gt;authorized_keys&amp;lt;/code&amp;gt; file. Execute these command on the host computer&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
adb push id_ed25519.pub /home/root&lt;br /&gt;
adb shell&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then in the root shell on the watch, add the key to the list of authorized ones:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p ~/.ssh&lt;br /&gt;
chmod 700 ~/.ssh&lt;br /&gt;
cat ~/id_ed25519.pub &amp;gt;&amp;gt; ~/.ssh/authorized_keys&lt;br /&gt;
chmod 600 ~/.ssh/authorized_keys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets up the watch to allow password-less but secure root access.  You can now proceed to deploying the app on the watch.&lt;br /&gt;
&lt;br /&gt;
===Deploying to the watch===&lt;br /&gt;
As before, we can easily test on the watch.  &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
devtool deploy-target hello root@192.168.2.15&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will automatically install all of the install targets from the &amp;lt;code&amp;gt;hello&amp;lt;/code&amp;gt; project onto the watch. Start the launcher on the watch and scroll to the end of your list of apps, and you should now see a &amp;quot;HELLO WORLD APP&amp;quot; at the end. Running it will show &amp;quot;Hello World!&amp;quot; on the screen.&lt;br /&gt;
&lt;br /&gt;
Removing it from the watch is also the same as before:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
devtool undeploy-target hello root@192.168.2.15&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Sharing your changes==&lt;br /&gt;
&lt;br /&gt;
If you make a change to AsteroidOS software that you think might be useful to others, such as a bug fix or feature enhancement, there are several ways to share it, depending on what exactly is being changed.&lt;br /&gt;
&lt;br /&gt;
*creating a recipe patch file&lt;br /&gt;
*creating a pull request for an AsteroidOS project&lt;br /&gt;
*creating an installable package (&amp;lt;code&amp;gt;.ipk&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
==Creating a recipe patch file==&lt;br /&gt;
&lt;br /&gt;
Many of the software packages that make up an AsteroidOS image are not unique to AsteroidOS. They may be general purpose tools such as &amp;lt;code&amp;gt;systemctl&amp;lt;/code&amp;gt; or watch-specific software from other open source repositories such as &amp;lt;code&amp;gt;mcetool&amp;lt;/code&amp;gt;. For these, there may be a need to introduce a patch just for AsteroidOS. To do so, first, within the appropriate &amp;lt;code&amp;gt;workspace&amp;lt;/code&amp;gt; directory where you made changes, use &amp;lt;code&amp;gt;git commit&amp;lt;/code&amp;gt; to commit the changes to the local repository. Once this is done, automatically create the patch. For our example, we could do that with this command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
devtool finish asteroid-flashlight meta-asteroid&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This creates one patch for each new git commit and automatically updates the recipe file in the named layer (in this case, &amp;lt;code&amp;gt;meta-asteroid&amp;lt;/code&amp;gt;). (Note that this is just an example and would not really be appropriate for &amp;lt;code&amp;gt;asteroid-flashlight&amp;lt;/code&amp;gt; because this application is unique to AsteroidOS.)  To see what was done, you can navigate to &amp;lt;code&amp;gt;asteroid/src/meta-asteroid&amp;lt;/code&amp;gt; and type &amp;lt;code&amp;gt;git diff&amp;lt;/code&amp;gt;. You will see that the patch file has been added to the recipe for &amp;lt;code&amp;gt;asteroid-flashlight&amp;lt;/code&amp;gt;. Also note that to ensure you don&#039;t lose any work, &amp;lt;code&amp;gt;devtool&amp;lt;/code&amp;gt; will not delete the directory tree in &amp;lt;code&amp;gt;workspace&amp;lt;/code&amp;gt; unless you specifically ask it to do so.&lt;br /&gt;
&lt;br /&gt;
==Create a pull request==&lt;br /&gt;
&lt;br /&gt;
For an AsteroidOS application, it may be more appropriate to create a [https://opensource.com/article/19/7/create-pull-request-github *pull request*]. To do that, we need to create a fork of the software we want to modify, create a branch, make the changes, commit and push the changes, and then create a pull request (PR). This guide doesn&#039;t describe all of these steps in detail, but describes how to use &amp;lt;code&amp;gt;devtool&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;git&amp;lt;/code&amp;gt; to create a PR.&lt;br /&gt;
&lt;br /&gt;
Once the changes are made, as in the &amp;lt;code&amp;gt;asteroid-flashlight&amp;lt;/code&amp;gt; example above, you can simply use git to point to your own repository. Specifically, navigate to &amp;lt;code&amp;gt;asteroid/build/workspace/sources/asteroid-flashlight&amp;lt;/code&amp;gt; and use the command &amp;lt;code&amp;gt;git remote -v&amp;lt;/code&amp;gt; to see that the remote repository is the original source. Change it to point to your own repository with &amp;lt;code&amp;gt;git remote set-url origin MYCLONE&amp;lt;/code&amp;gt;, substituting your repository&#039;s URL for &amp;lt;code&amp;gt;MYCLONE&amp;lt;/code&amp;gt;. If you have already made local commits, you may wish to change the name of the branch from &amp;lt;code&amp;gt;devtool&amp;lt;/code&amp;gt; (which is what &amp;lt;code&amp;gt;devtool&amp;lt;/code&amp;gt; uses by default) to something meaningful to you before pushing the changes to your repository. Then create a PR from the new branch in the usual way.&lt;br /&gt;
&lt;br /&gt;
==Create an installable package==&lt;br /&gt;
&lt;br /&gt;
Chances are that your own Linux computer uses &amp;lt;code&amp;gt;.rpm&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;.deb&amp;lt;/code&amp;gt; files with a package manager to allow simplified installation of software. AsteroidOS uses the [https://en.wikipedia.org/wiki/Opkg &amp;lt;code&amp;gt;opkg&amp;lt;/code&amp;gt;] package manager which uses &amp;lt;code&amp;gt;.ipk&amp;lt;/code&amp;gt; files. To create one from your modified software, here we need to use &amp;lt;code&amp;gt;bitbake&amp;lt;/code&amp;gt; rather than &amp;lt;code&amp;gt;devtool&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bitbake asteroid-flashlight&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that this typically creates four different &amp;lt;code&amp;gt;ipk&amp;lt;/code&amp;gt; files. We can take a look:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd tmp/deploy/ipk/armv7vehf-neon/&lt;br /&gt;
ls asteroid-flashlight*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This returns the names of the four files:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
asteroid-flashlight-dbg_+git999-r1_armv7vehf-neon.ipk&lt;br /&gt;
asteroid-flashlight-dev_+git999-r1_armv7vehf-neon.ipk&lt;br /&gt;
asteroid-flashlight_+git999-r1_armv7vehf-neon.ipk&lt;br /&gt;
asteroid-flashlight-src_+git999-r1_armv7vehf-neon.ipk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
We can ignore the &amp;lt;code&amp;gt;-dbg&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;-dev&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;-src&amp;lt;/code&amp;gt; files and simply choose the one with the shortest name, which is the release version of the package. We can copy it to the watch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
scp asteroid-flashlight_+git999-r1_armv7vehf-neon.ipk root@192.168.2.15:.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now we can [[SSH]] as root to the watch (&amp;lt;code&amp;gt;ssh root@192.168.2.15&amp;lt;/code&amp;gt;) and install the package:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
opkg --force-reinstall install asteroid-flashlight_+git999-r1_armv7vehf-neon.ipk&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=IP_Connection&amp;diff=1026</id>
		<title>IP Connection</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=IP_Connection&amp;diff=1026"/>
		<updated>2026-08-05T13:27:23Z</updated>

		<summary type="html">&lt;p&gt;Beroset: document 2.2 changes regarding root login and sudo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Configuring an IP connection on your watch has to be done manually until a GUI settings option is available. On watches that support WLAN, you can enable Wi-Fi and configure the connection using &amp;lt;code&amp;gt;connmanctl&amp;lt;/code&amp;gt; like described below. Forwarding IP requests to a connected PC via USB is another option, explained in the second paragraph.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== AsteroidOS versions before 2.2 ==&lt;br /&gt;
By default, there is no &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;ceres&amp;lt;/code&amp;gt; password, and no firewall rules. (However, on some watches, the kernel has the &amp;lt;code&amp;gt;CONFIG_ANDROID_PARANOID_NETWORK&amp;lt;/code&amp;gt; kernel option enabled, see below.)  A password can be set using the passwd command.&lt;br /&gt;
&lt;br /&gt;
== AsteroidOS versions 2.2 and later ==&lt;br /&gt;
There is no &amp;lt;code&amp;gt;ceres&amp;lt;/code&amp;gt; password, and no firewall rules.  There is an invalid &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; password set, disallowing any password login. Root login is also disabled in &amp;lt;code&amp;gt;sshd_config&amp;lt;/code&amp;gt;.  However the &amp;lt;code&amp;gt;sudo&amp;lt;/code&amp;gt; command is now included by default, so the &amp;lt;code&amp;gt;ceres&amp;lt;/code&amp;gt; user can use that for temporary privilege escalation when needed.&lt;br /&gt;
&lt;br /&gt;
If it&#039;s needed, root empty password can be re-enabled by running:&lt;br /&gt;
&amp;lt;code&amp;gt;sudo passwd -d root&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also, ssh password login for &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; can be enabled with:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo sed -i &#039;s/^[#[:space:]]PermitRootLogin./PermitRootLogin yes/&#039; /etc/ssh/sshd_config&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
By default, password and keyboard-interactive authentication is disabled for &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
= IP over WLAN (WiFi) =&lt;br /&gt;
Connect to your watch using &amp;lt;code&amp;gt;ssh root@192.168.2.15&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;adb shell&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;connmanctl&amp;lt;/pre&amp;gt;&lt;br /&gt;
Starts the connmanctl interactive mode. The prompt indicator will change to &amp;lt;code&amp;gt;connmanctl&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;enable wifi&amp;lt;/pre&amp;gt;&lt;br /&gt;
Output: Enabled wifi&lt;br /&gt;
&amp;lt;pre&amp;gt;scan wifi&amp;lt;/pre&amp;gt;&lt;br /&gt;
Output: Scan completed for wifi&lt;br /&gt;
&amp;lt;pre&amp;gt;agent on&amp;lt;/pre&amp;gt;&lt;br /&gt;
Output: Agent registered&lt;br /&gt;
&lt;br /&gt;
The Agent will handle automatic reconnect to the network.&lt;br /&gt;
&amp;lt;pre&amp;gt;services&amp;lt;/pre&amp;gt;&lt;br /&gt;
Shows the discovered SSIDs and their service identifier.&lt;br /&gt;
&lt;br /&gt;
Output example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;YourNetwork  wifi_1234567890_1234567890_managed_psk&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;OtherLAN     wifi_0987654321_123456789_managed_psk&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;connect &amp;lt;ServiceIdentifierOfYourSSID&amp;gt;&amp;lt;/pre&amp;gt; &lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;connect wifi_1234567890_1234567890_managed_psk&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prompt changes to &amp;lt;code&amp;gt;Passphrase?&amp;lt;/code&amp;gt; and asks for the password to the SSID.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;TypeYourPassPhraseAndPressEnter&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Output: Connected to wifi_1234567890_1234567890_managed_psk&lt;br /&gt;
&lt;br /&gt;
Note: If the connection fails with an error (e.g., &amp;quot;Invalid key&amp;quot; or no connection), try connecting to the other service identifier listed for the same SSID name, as it may correspond to the 2.4 GHz band that your watch supports more reliably (while the other is likely 5 GHz).&lt;br /&gt;
&amp;lt;pre&amp;gt;quit&amp;lt;/pre&amp;gt;&lt;br /&gt;
Leaves the connmanctl interactive mode.&lt;br /&gt;
&lt;br /&gt;
Check whether an IP address has been assigned to the watch using &amp;lt;code&amp;gt;ip a show dev wlan0&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;ifconfig wlan0&amp;lt;/code&amp;gt; or by trying to &amp;lt;code&amp;gt;ping 8.8.8.8&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Note that activated WLAN consumes additional power. Currently, it is recommended to disable the function after use. &amp;lt;code&amp;gt;connmanctl disable wifi&amp;lt;/code&amp;gt; is used to disable Wi-Fi and power off WLAN temporarily. &amp;lt;code&amp;gt;connmanctl enable wifi&amp;lt;/code&amp;gt; activates WLAN again and connects to the last used Wi-Fi network.&lt;br /&gt;
&lt;br /&gt;
Some more documentation on connman can be found on [https://wiki.archlinux.org/index.php/ConnMan#Connecting_to_a_protected_access_point ArchWiki].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=IP over USB=&lt;br /&gt;
It is possible to allow your watch to be able to use your Linux computer&#039;s internet connection via a USB connection. You will need: &lt;br /&gt;
&lt;br /&gt;
#A Linux computer with RNDIS support loaded and enabled&lt;br /&gt;
#The ability to change network configurations on that computer&lt;br /&gt;
#A network connection&lt;br /&gt;
&lt;br /&gt;
This works by using the RNDIS driver to allow the USB device to appear to be a network interface. RNDIS stands for &amp;quot;Remote Network Driver Interface Specification&amp;quot; and was a proprietary protocol from Microsoft. It is supported in Linux by the &amp;lt;code&amp;gt;rndis_host&amp;lt;/code&amp;gt; driver. This driver may either be compiled into the kernel, or more typically provided as an optional module. If you&#039;re not sure, you can try this &amp;lt;code&amp;gt;lsmod&amp;lt;/code&amp;gt; to see if it&#039;s loaded on your computer.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lsmod | grep ndis&lt;br /&gt;
rndis_host             24576  0&lt;br /&gt;
cdc_ether              24576  1 rndis_host&lt;br /&gt;
usbnet                 61440  2 rndis_host,cdc_ether&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If it isn&#039;t you might be able to use &amp;lt;code&amp;gt;modprobe rndis_host&amp;lt;/code&amp;gt; (with root privileges) to install the module.&lt;br /&gt;
&lt;br /&gt;
Once the &amp;lt;code&amp;gt;rndis_host&amp;lt;/code&amp;gt; is installed and running, you can enable Network Address Translation (NAT) to allow your Linux computer to share it&#039;s internet IP address with the watch. To configure a NAT &#039;&#039;&#039;on your computer&#039;&#039;&#039; (Note: Replace eth0 with the name of the interface that connects your computer to the Internet) with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here again, you might need root privileges for those commands, depending on how your computer is configured.&lt;br /&gt;
&lt;br /&gt;
Configure a default gateway and DNS &#039;&#039;&#039;on the watch&#039;&#039;&#039; with the following commands ran via [[SSH]] as the root user:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;ip route add default via 192.168.2.1&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;echo &amp;quot;nameserver 8.8.8.8&amp;quot; &amp;gt;&amp;gt; /etc/resolv.conf&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that this assumes that your computer&#039;s IP address on RNDIS is 192.168.2.1, which is the default, but if you have multiple watches, or have plugged and unplugged the same watch a few times, it might be different. To make sure, on the watch, you can type &amp;lt;code&amp;gt;who&amp;lt;/code&amp;gt; and it will reply with something like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&lt;br /&gt;
root            pts/0           00:01   Jun  9 08:06:24  192.168.2.2&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In this particular case, the address shown is 192.168.2.2, so the first command listed above would be &amp;lt;code&amp;gt;route add default gw 192.168.2.2&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Custom Address ==&lt;br /&gt;
The watch defaults to the address 192.168.2.15, but this can be changed.  If, for example, you want to change the address to 10.0.0.2, the recommended way to change it is to do this:&lt;br /&gt;
&lt;br /&gt;
# temporarily changing the USB mode on the watch to &amp;quot;ADB mode&amp;quot;&lt;br /&gt;
# issue the command &amp;lt;pre&amp;gt;adb dbus-send --system --type=method_call --print-reply --dest=com.meego.usb_moded /com/meego/usb_moded com.meego.usb_moded.net_config string:&#039;ip&#039; string:&#039;10.0.0.2&#039;&amp;lt;/pre&amp;gt;&lt;br /&gt;
# change USB mode to &amp;quot;SSH mode&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note that if you have more than one ADB device attached to your computer, you might have to give it the transport ID in step 2. This change persists across boots.&lt;br /&gt;
&lt;br /&gt;
An alternative approach for developers building their own image using bitbake, is to edit the file https://github.com/AsteroidOS/meta-asteroid/blob/master/recipes-nemomobile/usb-moded/usb-moded/usb-moded/usb-moded.ini. And add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[network]&lt;br /&gt;
ip=10.0.0.2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Paranoid Kernels=&lt;br /&gt;
On some watch models (e.g., &amp;lt;code&amp;gt;lenok&amp;lt;/code&amp;gt;), the kernel shipped with AsteroidOS is compiled with the Android-specific &amp;lt;code&amp;gt;CONFIG_ANDROID_PARANOID_NETWORK&amp;lt;/code&amp;gt; kernel option enabled. That option enforces non-standard restrictions on networking, based on hardcoded group IDs (GIDs):&lt;br /&gt;
*GID 3003 is the &amp;lt;code&amp;gt;inet&amp;lt;/code&amp;gt; group, allowing to create &amp;lt;code&amp;gt;AF_INET&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;AF_INET6&amp;lt;/code&amp;gt; sockets,&lt;br /&gt;
* GID 3004 is the &amp;lt;code&amp;gt;net_raw&amp;lt;/code&amp;gt; group, allowing to create raw INET sockets.&lt;br /&gt;
&lt;br /&gt;
Only &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; and members of the groups with those magic GIDs are allowed to perform the described actions. In particular, by default, the &amp;lt;code&amp;gt;ceres&amp;lt;/code&amp;gt; user is &#039;&#039;&#039;not&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Therefore, in order to be able to access the network as &amp;lt;code&amp;gt;ceres&amp;lt;/code&amp;gt; (e.g., for &amp;lt;code&amp;gt;asteroid-weatherfetch&amp;lt;/code&amp;gt; to work), SSH into your watch as &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; (or use &amp;lt;code&amp;gt;adb shell&amp;lt;/code&amp;gt;) and run the following 2 commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
groupadd -g 3003 -U root,ceres inet&lt;br /&gt;
groupadd -g 3004 -U root,ceres net_raw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
These create the two magic groups with the same name and GID as on Android and add both &amp;lt;code&amp;gt;root&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ceres&amp;lt;/code&amp;gt; to them. Then reboot your watch, because only newly started sessions will pick up the new group memberships.&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Building_AsteroidOS&amp;diff=1025</id>
		<title>Building AsteroidOS</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Building_AsteroidOS&amp;diff=1025"/>
		<updated>2026-07-20T14:24:06Z</updated>

		<summary type="html">&lt;p&gt;Beroset: /* Build with containers */ add instructions on customizing the toolchain container&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Developers]]&lt;br /&gt;
If you decide to compile AsteroidOS from source be aware that it’s a simple process but requires a lot of disk space (potentially more than 100GB) and the first build might take you a lot of time (hours). Report any problem to the [https://github.com/AsteroidOS/asteroid/issues issue tracker]:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://asteroidos.org/asteroid.mp4 Video showing the build process]&lt;br /&gt;
&lt;br /&gt;
= General information =&lt;br /&gt;
&lt;br /&gt;
You might want to build AsteroidOS in a &#039;&#039;container engine&#039;&#039; such as [https://www.docker.com/ Docker] or [https://podman.io/ podman] because you&#039;ll get a clean build environment that works no matter what kinds of package repositories or package versions you have installed or how outdated your Linux distribution is or which Linux distribution you&#039;re using in the first place.&lt;br /&gt;
&lt;br /&gt;
Another advantage of Docker specifically is that it &#039;&#039;should&#039;&#039; also work on Windows and OS X. (However, this has not been tested yet!)&lt;br /&gt;
&lt;br /&gt;
Using containers also allows you to easily roll back.  Without a container, if you decided to delete the AsteroidOS repository and uninstall the prerequisite software packages from your computer, you will potentially remove packages that you had installed before and might actually still need.  With a container, simply deleting the container image has no other effect on the host computer.&lt;br /&gt;
&lt;br /&gt;
= Clone the repository =&lt;br /&gt;
&lt;br /&gt;
Clone the main repository using the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/AsteroidOS/asteroid.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you haven&#039;t set a global git name and email yet, adapt the following &#039;&#039;git config&#039;&#039; commands to your information. (This is only required to clone some git repositories when building.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.email &amp;quot;you@example.com&amp;quot;&lt;br /&gt;
git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before you continue to &#039;&#039;Build without containers&#039;&#039; or &#039;&#039;Build with containers&#039;&#039;, make sure you&#039;re in the asteroid directory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd asteroid/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Build without containers =&lt;br /&gt;
&lt;br /&gt;
== Downloading ==&lt;br /&gt;
&lt;br /&gt;
Install the prerequisites:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Distribution prerequisite installation&lt;br /&gt;
|-&lt;br /&gt;
! Distro !! Command&lt;br /&gt;
|-&lt;br /&gt;
| Ubuntu || &amp;lt;code&amp;gt;apt-get install git build-essential chrpath cpio diffstat gawk liblz4-tool python3 shared-mime-info texinfo wget zstd &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Fedora || &amp;lt;code&amp;gt;dnf install chrpath diffstat g++ lz4 perl perl-bignum python3-pip rpcgen socat texinfo patch&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Arch || &amp;lt;code&amp;gt;pacman -Sy base-devel chrpath cpio diffstat gawk inetutils lz4 python3 rpcsvc-proto shared-mime-info texinfo wget zstd&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Alpine || &amp;lt;code&amp;gt;apk add binutils chrpath gcc g++ gawk gcc lz4 make patch perl rpcgen&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;Note: Alpine Linux does not contain diffstat in its repositories, thus you have to [https://github.com/asottile-archive/diffstat build it yourself from source].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This repository basically only contains a shell script that populates &amp;lt;code&amp;gt;src/&amp;lt;/code&amp;gt; with OpenEmbedded and the appropriate Asteroid layers. Then, it setups the environment for a bitbake build. The following command will setup a build for &amp;lt;code&amp;gt;dory&amp;lt;/code&amp;gt; (the LG G Watch) but you can also build an image for other watches by using the corresponding codename. (Codenames can be found on the [https://asteroidos.org/watches/ Watches page].)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
source ./prepare-build.sh dory # Be careful that this script must be sourced and not only ran&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the environment has been correctly setup, you should now be in the &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; subdirectory.&lt;br /&gt;
&lt;br /&gt;
== Building ==&lt;br /&gt;
&lt;br /&gt;
Once the environment is prepared, you can simply trigger a build with the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bitbake asteroid-image&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;Notes:&#039;&#039;&lt;br /&gt;
1) The build process requires roughly 2GB memory per thread. It might be necessary to limit the number of threads. This can be done by prepending &amp;lt;code&amp;gt;BB_NUMBER_THREADS=n&amp;lt;/code&amp;gt; to the build command. Or by adding &amp;lt;code&amp;gt;BB_NUMBER_THREADS = &amp;quot;n&amp;quot;&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;build/conf/local.conf&amp;lt;/code&amp;gt;. Where &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; is the amount of threads.&lt;br /&gt;
2) Bitbake is a powerful tool that can also build single packages (e.g: &amp;lt;code&amp;gt;bitbake strace&amp;lt;/code&amp;gt;) or  [[Creating an Asteroid app#Building the Cross Compilation Toolchain|Building the SDK]] for example. Refer to its documentation for more details.&lt;br /&gt;
&lt;br /&gt;
If this step was successful, you can proceed to the [[#Installing|Installing]] section below.&lt;br /&gt;
&lt;br /&gt;
== Updating the Sources ==&lt;br /&gt;
&lt;br /&gt;
You can update the AsteroidOS sources with the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
source ./prepare-build.sh update&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Build with containers =&lt;br /&gt;
&lt;br /&gt;
These instructions have been tested on Ubuntu 19.04 (with Docker) and Fedora 41 (with podman), but should also be applicable to Debian Sid (at least at the time of writing). For other distributions the dependencies may have different names and you may have to install additional ones.&lt;br /&gt;
&lt;br /&gt;
From a user&#039;s point of view, Docker and podman are quite similar and accept almost all of the exact same commands, but there are some difference.  The most significant differences for building Asteroid are that podman does not use a daemon and can be run &amp;quot;rootless&amp;quot; (that is, as a non-root user).  This makes some things a bit easier, but either can be used.&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
&lt;br /&gt;
Remove the Docker container called &amp;lt;code&amp;gt;asteroidos-toolchain&amp;lt;/code&amp;gt; if it already exists:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo docker rm -f asteroidos-toolchain&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
podman rm -f asteroidos-toolchain&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Build a container image called &amp;lt;code&amp;gt;asteroidos-toolchain&amp;lt;/code&amp;gt; from the given Dockerfile:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo docker build --tag asteroidos-toolchain .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
podman build --tag asteroidos-toolchain .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Building the software ==&lt;br /&gt;
&lt;br /&gt;
Now that the container with the toolchain software has been created, we can use this to build AsteroidOS.  All of the tools are contained and run within the container, but we use a &#039;&#039;shared volume&#039;&#039;, essentially some drive space that both the host computer and the container can read and write, for actually creating the AsteroidOS image files.&lt;br /&gt;
&lt;br /&gt;
In this example, we will build AsteroidOS for &amp;lt;code&amp;gt;dory&amp;lt;/code&amp;gt;(the LG G Watch).  To build for a different watch than the LG G Watch, use its corresponding codename instead of &amp;lt;code&amp;gt;dory&amp;lt;/code&amp;gt; when executing the &amp;lt;code&amp;gt;docker run ...&amp;lt;/code&amp;gt; command.  You can find the codenames for the supported watches on the [https://asteroidos.org/watches/ Watches page].&lt;br /&gt;
&lt;br /&gt;
Assuming that you have carefully followed the instructions so far and are in the &amp;lt;code&amp;gt;asteroid&amp;lt;/code&amp;gt; directory, you can now build the software.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Run this as a non root user&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo docker run \&lt;br /&gt;
  --rm \&lt;br /&gt;
  -it \&lt;br /&gt;
  -v /etc/passwd:/etc/passwd:ro \&lt;br /&gt;
  -u &amp;quot;$(id -u):$(id -g)&amp;quot; \&lt;br /&gt;
  -v &amp;quot;$HOME/.gitconfig:/$HOME/.gitconfig:ro&amp;quot; \&lt;br /&gt;
  -v &amp;quot;$(pwd):/asteroid&amp;quot; asteroidos-toolchain \&lt;br /&gt;
  bash -c &amp;quot;source ./prepare-build.sh dory &amp;amp;&amp;amp; bitbake asteroid-image&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
podman run \&lt;br /&gt;
  --rm \&lt;br /&gt;
  -it \&lt;br /&gt;
  -v  &amp;quot;$(pwd)&amp;quot;:/asteroid:z \&lt;br /&gt;
  --userns keep-id asteroidos-toolchain \&lt;br /&gt;
  bash -c &amp;quot;source ./prepare-build.sh dory &amp;amp;&amp;amp; bitbake asteroid-image&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The files created during the build are placed in the current directory; more specifically, the source files are placed in a &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt; subdirectory and build artefacts, including the final binary images are placed in the &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; subdirectory.&lt;br /&gt;
&lt;br /&gt;
Here is a detailed explanation of the Docker command above:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;code&amp;gt;sudo docker run&amp;lt;/code&amp;gt; Runs a container image&lt;br /&gt;
*&amp;lt;code&amp;gt;--rm&amp;lt;/code&amp;gt; Cleans up after the command is run by removing temporary container storage&lt;br /&gt;
*&amp;lt;code&amp;gt;-it&amp;lt;/code&amp;gt;  Attaches the terminal to the container so that we can see the output. Otherwise it would run blindly in the background.&lt;br /&gt;
*&amp;lt;code&amp;gt;-u &amp;quot;$(id -u):$(id -g)&amp;quot;&amp;lt;/code&amp;gt; Ensures that the current user id and group id from the host is used on files inside the container to avoid permission issues.&lt;br /&gt;
*&amp;lt;code&amp;gt;-v /etc/passwd:/etc/passwd&amp;lt;/code&amp;gt;  Ensures that the user ids and groups from the host are also available in the Docker container. (Otherwise the &amp;lt;code&amp;gt;-u&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;-g&amp;lt;/code&amp;gt; would be useless.)&lt;br /&gt;
*&amp;lt;code&amp;gt;/etc/passwd&amp;lt;/code&amp;gt; Contains the user names and their ids.&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;quot;$HOME/.gitconfig:/$HOME/.gitconfig&amp;quot;&amp;lt;/code&amp;gt; Share your user&#039;s git config with the container.&lt;br /&gt;
*&amp;lt;code&amp;gt;-v &amp;quot;$(pwd):/asteroid&amp;quot;&amp;lt;/code&amp;gt; Mount the current directory (which is your asteroid git repo clone) into the container.&lt;br /&gt;
*&amp;lt;code&amp;gt;bash -c &amp;quot;source ./prepare-build.sh dory &amp;amp;&amp;amp; bitbake asteroid-image&amp;quot;&amp;lt;/code&amp;gt;  This is the command to be executed inside of the container with &amp;quot;dory&amp;quot; being the codename of your watch.&lt;br /&gt;
&lt;br /&gt;
Here is a detailed explanation of the podman version of the command above:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;code&amp;gt;podman run&amp;lt;/code&amp;gt; Runs a container image&lt;br /&gt;
*&amp;lt;code&amp;gt;--rm&amp;lt;/code&amp;gt; Cleans up after the command is run by removing temporary container storage&lt;br /&gt;
*&amp;lt;code&amp;gt;-it&amp;lt;/code&amp;gt; Attaches the terminal to the container so that we can see the output. Otherwise it would run blindly in the background.&lt;br /&gt;
*&amp;lt;code&amp;gt;-v &amp;quot;$(pwd)&amp;quot;:/asteroid:z&amp;lt;/code&amp;gt; Mount the current directory (which is your asteroid git repo clone) into the container. The &amp;lt;code&amp;gt;:z&amp;lt;/code&amp;gt; tells SELinux, if it&#039;s running that this container to allow multiple containers to share this mount.  If &amp;lt;code&amp;gt;:Z&amp;lt;/code&amp;gt; is used instead, it tells SELinux, if it&#039;s running, that the container has &#039;&#039;exclusive access&#039;&#039; to this mount. Either can be used, but using the exclusive access flag causes the need to re-apply security labels to all files which can take significant time when the container starts.&lt;br /&gt;
*&amp;lt;code&amp;gt;--userns keep-id&amp;lt;/code&amp;gt; Run as the current user inside the container&lt;br /&gt;
*&amp;lt;code&amp;gt;bash -c &amp;quot;source ./prepare-build.sh dory &amp;amp;&amp;amp; bitbake asteroid-image&amp;quot;&amp;lt;/code&amp;gt;  This is the command to be executed inside of the container with &amp;lt;code&amp;gt;dory&amp;lt;/code&amp;gt; being the codename of your watch.&lt;br /&gt;
&lt;br /&gt;
If this step was successful, you can proceed to [[#Installing|Installing]] below.&lt;br /&gt;
&lt;br /&gt;
== Customizing the toolchain container ==&lt;br /&gt;
It can be convenient to add &amp;lt;code&amp;gt;tmux&amp;lt;/code&amp;gt; (to support commands like &amp;lt;code&amp;gt;bitbake -c devshell asteroid-hello&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;vim&amp;lt;/code&amp;gt; (or the editor of your choice).  You may have other tools that you would like to install.  You can gain root access to a running and install packages to customize the environment to your liking.  First, run the &amp;lt;code&amp;gt;podman run&amp;lt;/code&amp;gt; &#039;&#039;without&#039;&#039; the &amp;lt;code&amp;gt;--rm&amp;lt;/code&amp;gt; argument.  &lt;br /&gt;
&lt;br /&gt;
Then access the running container as root:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
podman exec -itu root asteroid bash&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then within the image, you can make any needed changes.  When finished, exit the container and run:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
podman commit asteroid custom-asteroidos:1.0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It also may be convenient to configure git with email and name.  Obviously, use your own email and name:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.email &amp;quot;you@example.com&amp;quot;&lt;br /&gt;
git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Installing =&lt;br /&gt;
&lt;br /&gt;
After a while, whether you build with or without containers, the generated image should be available in &amp;lt;code&amp;gt;build/tmp/deploy/images/dory/&amp;lt;/code&amp;gt; (for &amp;lt;code&amp;gt;dory&amp;lt;/code&amp;gt; -- for other watches, the image files are in the corresponding code word directory.)&lt;br /&gt;
&lt;br /&gt;
Install AsteroidOS using your usual device&#039;s instructions, which you can find linked from the [https://asteroidos.org/watches/ Watches page].&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Building_AsteroidOS&amp;diff=1017</id>
		<title>Building AsteroidOS</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Building_AsteroidOS&amp;diff=1017"/>
		<updated>2026-07-13T12:41:08Z</updated>

		<summary type="html">&lt;p&gt;Beroset: /* Building the software */ corrected previous edit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Developers]]&lt;br /&gt;
If you decide to compile AsteroidOS from source be aware that it’s a simple process but requires a lot of disk space (potentially more than 100GB) and the first build might take you a lot of time (hours). Report any problem to the [https://github.com/AsteroidOS/asteroid/issues issue tracker]:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://asteroidos.org/asteroid.mp4 Video showing the build process]&lt;br /&gt;
&lt;br /&gt;
= General information =&lt;br /&gt;
&lt;br /&gt;
You might want to build AsteroidOS in a &#039;&#039;container engine&#039;&#039; such as [https://www.docker.com/ Docker] or [https://podman.io/ podman] because you&#039;ll get a clean build environment that works no matter what kinds of package repositories or package versions you have installed or how outdated your Linux distribution is or which Linux distribution you&#039;re using in the first place.&lt;br /&gt;
&lt;br /&gt;
Another advantage of Docker specifically is that it &#039;&#039;should&#039;&#039; also work on Windows and OS X. (However, this has not been tested yet!)&lt;br /&gt;
&lt;br /&gt;
Using containers also allows you to easily roll back.  Without a container, if you decided to delete the AsteroidOS repository and uninstall the prerequisite software packages from your computer, you will potentially remove packages that you had installed before and might actually still need.  With a container, simply deleting the container image has no other effect on the host computer.&lt;br /&gt;
&lt;br /&gt;
= Clone the repository =&lt;br /&gt;
&lt;br /&gt;
Clone the main repository using the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/AsteroidOS/asteroid.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you haven&#039;t set a global git name and email yet, adapt the following &#039;&#039;git config&#039;&#039; commands to your information. (This is only required to clone some git repositories when building.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.email &amp;quot;you@example.com&amp;quot;&lt;br /&gt;
git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before you continue to &#039;&#039;Build without containers&#039;&#039; or &#039;&#039;Build with containers&#039;&#039;, make sure you&#039;re in the asteroid directory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd asteroid/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Build without containers =&lt;br /&gt;
&lt;br /&gt;
== Downloading ==&lt;br /&gt;
&lt;br /&gt;
Install the prerequisites:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Distribution prerequisite installation&lt;br /&gt;
|-&lt;br /&gt;
! Distro !! Command&lt;br /&gt;
|-&lt;br /&gt;
| Ubuntu || &amp;lt;code&amp;gt;apt-get install git build-essential chrpath cpio diffstat gawk liblz4-tool python3 shared-mime-info texinfo wget zstd &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Fedora || &amp;lt;code&amp;gt;dnf install chrpath diffstat g++ lz4 perl perl-bignum python3-pip rpcgen socat texinfo patch&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Arch || &amp;lt;code&amp;gt;pacman -Sy base-devel chrpath cpio diffstat gawk inetutils lz4 python3 rpcsvc-proto shared-mime-info texinfo wget zstd&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Alpine || &amp;lt;code&amp;gt;apk add binutils chrpath gcc g++ gawk gcc lz4 make patch perl rpcgen&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;Note: Alpine Linux does not contain diffstat in its repositories, thus you have to [https://github.com/asottile-archive/diffstat build it yourself from source].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This repository basically only contains a shell script that populates &amp;lt;code&amp;gt;src/&amp;lt;/code&amp;gt; with OpenEmbedded and the appropriate Asteroid layers. Then, it setups the environment for a bitbake build. The following command will setup a build for &amp;lt;code&amp;gt;dory&amp;lt;/code&amp;gt; (the LG G Watch) but you can also build an image for other watches by using the corresponding codename. (Codenames can be found on the [https://asteroidos.org/watches/ Watches page].)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
source ./prepare-build.sh dory # Be careful that this script must be sourced and not only ran&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the environment has been correctly setup, you should now be in the &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; subdirectory.&lt;br /&gt;
&lt;br /&gt;
== Building ==&lt;br /&gt;
&lt;br /&gt;
Once the environment is prepared, you can simply trigger a build with the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bitbake asteroid-image&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;Notes:&#039;&#039;&lt;br /&gt;
1) The build process requires roughly 2GB memory per thread. It might be necessary to limit the number of threads. This can be done by prepending &amp;lt;code&amp;gt;BB_NUMBER_THREADS=n&amp;lt;/code&amp;gt; to the build command. Or by adding &amp;lt;code&amp;gt;BB_NUMBER_THREADS = &amp;quot;n&amp;quot;&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;build/conf/local.conf&amp;lt;/code&amp;gt;. Where &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; is the amount of threads.&lt;br /&gt;
2) Bitbake is a powerful tool that can also build single packages (e.g: &amp;lt;code&amp;gt;bitbake strace&amp;lt;/code&amp;gt;) or  [[Creating an Asteroid app#Building the Cross Compilation Toolchain|Building the SDK]] for example. Refer to its documentation for more details.&lt;br /&gt;
&lt;br /&gt;
If this step was successful, you can proceed to the [[#Installing|Installing]] section below.&lt;br /&gt;
&lt;br /&gt;
== Updating the Sources ==&lt;br /&gt;
&lt;br /&gt;
You can update the AsteroidOS sources with the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
source ./prepare-build.sh update&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Build with containers =&lt;br /&gt;
&lt;br /&gt;
These instructions have been tested on Ubuntu 19.04 (with Docker) and Fedora 41 (with podman), but should also be applicable to Debian Sid (at least at the time of writing). For other distributions the dependencies may have different names and you may have to install additional ones.&lt;br /&gt;
&lt;br /&gt;
From a user&#039;s point of view, Docker and podman are quite similar and accept almost all of the exact same commands, but there are some difference.  The most significant differences for building Asteroid are that podman does not use a daemon and can be run &amp;quot;rootless&amp;quot; (that is, as a non-root user).  This makes some things a bit easier, but either can be used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
&lt;br /&gt;
Remove the Docker container called &amp;lt;code&amp;gt;asteroidos-toolchain&amp;lt;/code&amp;gt; if it already exists:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo docker rm -f asteroidos-toolchain&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
podman rm -f asteroidos-toolchain&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Build a container image called &amp;lt;code&amp;gt;asteroidos-toolchain&amp;lt;/code&amp;gt; from the given Dockerfile:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo docker build --tag asteroidos-toolchain .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
podman build --tag asteroidos-toolchain .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Building the software ==&lt;br /&gt;
&lt;br /&gt;
Now that the container with the toolchain software has been created, we can use this to build AsteroidOS.  All of the tools are contained and run within the container, but we use a &#039;&#039;shared volume&#039;&#039;, essentially some drive space that both the host computer and the container can read and write, for actually creating the AsteroidOS image files.&lt;br /&gt;
&lt;br /&gt;
In this example, we will build AsteroidOS for &amp;lt;code&amp;gt;dory&amp;lt;/code&amp;gt;(the LG G Watch).  To build for a different watch than the LG G Watch, use its corresponding codename instead of &amp;lt;code&amp;gt;dory&amp;lt;/code&amp;gt; when executing the &amp;lt;code&amp;gt;docker run ...&amp;lt;/code&amp;gt; command.  You can find the codenames for the supported watches on the [https://asteroidos.org/watches/ Watches page].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Assuming that you have carefully followed the instructions so far and are in the &amp;lt;code&amp;gt;asteroid&amp;lt;/code&amp;gt; directory, you can now build the software.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Run this as a non root user&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo docker run \&lt;br /&gt;
  --rm \&lt;br /&gt;
  -it \&lt;br /&gt;
  -v /etc/passwd:/etc/passwd:ro \&lt;br /&gt;
  -u &amp;quot;$(id -u):$(id -g)&amp;quot; \&lt;br /&gt;
  -v &amp;quot;$HOME/.gitconfig:/$HOME/.gitconfig:ro&amp;quot; \&lt;br /&gt;
  -v &amp;quot;$(pwd):/asteroid&amp;quot; asteroidos-toolchain \&lt;br /&gt;
  bash -c &amp;quot;source ./prepare-build.sh dory &amp;amp;&amp;amp; bitbake asteroid-image&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
podman run \&lt;br /&gt;
  --rm \&lt;br /&gt;
  -it \&lt;br /&gt;
  -v  &amp;quot;$(pwd)&amp;quot;:/asteroid:z \&lt;br /&gt;
  --userns keep-id asteroidos-toolchain \&lt;br /&gt;
  bash -c &amp;quot;source ./prepare-build.sh dory &amp;amp;&amp;amp; bitbake asteroid-image&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The files created during the build are placed in the current directory; more specifically, the source files are placed in a &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt; subdirectory and build artefacts, including the final binary images are placed in the &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; subdirectory.&lt;br /&gt;
&lt;br /&gt;
Here is a detailed explanation of the Docker command above:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;code&amp;gt;sudo docker run&amp;lt;/code&amp;gt; Runs a container image&lt;br /&gt;
*&amp;lt;code&amp;gt;--rm&amp;lt;/code&amp;gt; Cleans up after the command is run by removing temporary container storage&lt;br /&gt;
*&amp;lt;code&amp;gt;-it&amp;lt;/code&amp;gt;  Attaches the terminal to the container so that we can see the output. Otherwise it would run blindly in the background.&lt;br /&gt;
*&amp;lt;code&amp;gt;-u &amp;quot;$(id -u):$(id -g)&amp;quot;&amp;lt;/code&amp;gt; Ensures that the current user id and group id from the host is used on files inside the container to avoid permission issues.&lt;br /&gt;
*&amp;lt;code&amp;gt;-v /etc/passwd:/etc/passwd&amp;lt;/code&amp;gt;  Ensures that the user ids and groups from the host are also available in the Docker container. (Otherwise the &amp;lt;code&amp;gt;-u&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;-g&amp;lt;/code&amp;gt; would be useless.)&lt;br /&gt;
*&amp;lt;code&amp;gt;/etc/passwd&amp;lt;/code&amp;gt; Contains the user names and their ids.&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;quot;$HOME/.gitconfig:/$HOME/.gitconfig&amp;quot;&amp;lt;/code&amp;gt; Share your user&#039;s git config with the container.&lt;br /&gt;
*&amp;lt;code&amp;gt;-v &amp;quot;$(pwd):/asteroid&amp;quot;&amp;lt;/code&amp;gt; Mount the current directory (which is your asteroid git repo clone) into the container.&lt;br /&gt;
*&amp;lt;code&amp;gt;bash -c &amp;quot;source ./prepare-build.sh dory &amp;amp;&amp;amp; bitbake asteroid-image&amp;quot;&amp;lt;/code&amp;gt;  This is the command to be executed inside of the container with &amp;quot;dory&amp;quot; being the codename of your watch.&lt;br /&gt;
&lt;br /&gt;
Here is a detailed explanation of the podman version of the command above:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;code&amp;gt;podman run&amp;lt;/code&amp;gt; Runs a container image&lt;br /&gt;
*&amp;lt;code&amp;gt;--rm&amp;lt;/code&amp;gt; Cleans up after the command is run by removing temporary container storage&lt;br /&gt;
*&amp;lt;code&amp;gt;-it&amp;lt;/code&amp;gt; Attaches the terminal to the container so that we can see the output. Otherwise it would run blindly in the background.&lt;br /&gt;
*&amp;lt;code&amp;gt;-v &amp;quot;$(pwd)&amp;quot;:/asteroid:z&amp;lt;/code&amp;gt; Mount the current directory (which is your asteroid git repo clone) into the container. The &amp;lt;code&amp;gt;:z&amp;lt;/code&amp;gt; tells SELinux, if it&#039;s running that this container to allow multiple containers to share this mount.  If &amp;lt;code&amp;gt;:Z&amp;lt;/code&amp;gt; is used instead, it tells SELinux, if it&#039;s running, that the container has &#039;&#039;exclusive access&#039;&#039; to this mount. Either can be used, but using the exclusive access flag causes the need to re-apply security labels to all files which can take significant time when the container starts.&lt;br /&gt;
*&amp;lt;code&amp;gt;--userns keep-id&amp;lt;/code&amp;gt; Run as the current user inside the container&lt;br /&gt;
*&amp;lt;code&amp;gt;bash -c &amp;quot;source ./prepare-build.sh dory &amp;amp;&amp;amp; bitbake asteroid-image&amp;quot;&amp;lt;/code&amp;gt;  This is the command to be executed inside of the container with &amp;lt;code&amp;gt;dory&amp;lt;/code&amp;gt; being the codename of your watch.&lt;br /&gt;
&lt;br /&gt;
If this step was successful, you can proceed to [[#Installing|Installing]] below.&lt;br /&gt;
&lt;br /&gt;
= Installing =&lt;br /&gt;
&lt;br /&gt;
After a while, whether you build with or without containers, the generated image should be available in &amp;lt;code&amp;gt;build/tmp/deploy/images/dory/&amp;lt;/code&amp;gt; (for &amp;lt;code&amp;gt;dory&amp;lt;/code&amp;gt; -- for other watches, the image files are in the corresponding code word directory.)&lt;br /&gt;
&lt;br /&gt;
Install AsteroidOS using your usual device&#039;s instructions, which you can find linked from the [https://asteroidos.org/watches/ Watches page].&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Building_AsteroidOS&amp;diff=1016</id>
		<title>Building AsteroidOS</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Building_AsteroidOS&amp;diff=1016"/>
		<updated>2026-07-13T12:27:59Z</updated>

		<summary type="html">&lt;p&gt;Beroset: /* Building the software */ Add a note about :z versus :Z for volume mount&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Developers]]&lt;br /&gt;
If you decide to compile AsteroidOS from source be aware that it’s a simple process but requires a lot of disk space (potentially more than 100GB) and the first build might take you a lot of time (hours). Report any problem to the [https://github.com/AsteroidOS/asteroid/issues issue tracker]:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[https://asteroidos.org/asteroid.mp4 Video showing the build process]&lt;br /&gt;
&lt;br /&gt;
= General information =&lt;br /&gt;
&lt;br /&gt;
You might want to build AsteroidOS in a &#039;&#039;container engine&#039;&#039; such as [https://www.docker.com/ Docker] or [https://podman.io/ podman] because you&#039;ll get a clean build environment that works no matter what kinds of package repositories or package versions you have installed or how outdated your Linux distribution is or which Linux distribution you&#039;re using in the first place.&lt;br /&gt;
&lt;br /&gt;
Another advantage of Docker specifically is that it &#039;&#039;should&#039;&#039; also work on Windows and OS X. (However, this has not been tested yet!)&lt;br /&gt;
&lt;br /&gt;
Using containers also allows you to easily roll back.  Without a container, if you decided to delete the AsteroidOS repository and uninstall the prerequisite software packages from your computer, you will potentially remove packages that you had installed before and might actually still need.  With a container, simply deleting the container image has no other effect on the host computer.&lt;br /&gt;
&lt;br /&gt;
= Clone the repository =&lt;br /&gt;
&lt;br /&gt;
Clone the main repository using the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/AsteroidOS/asteroid.git&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you haven&#039;t set a global git name and email yet, adapt the following &#039;&#039;git config&#039;&#039; commands to your information. (This is only required to clone some git repositories when building.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git config --global user.email &amp;quot;you@example.com&amp;quot;&lt;br /&gt;
git config --global user.name &amp;quot;Your Name&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Before you continue to &#039;&#039;Build without containers&#039;&#039; or &#039;&#039;Build with containers&#039;&#039;, make sure you&#039;re in the asteroid directory:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd asteroid/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Build without containers =&lt;br /&gt;
&lt;br /&gt;
== Downloading ==&lt;br /&gt;
&lt;br /&gt;
Install the prerequisites:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ Distribution prerequisite installation&lt;br /&gt;
|-&lt;br /&gt;
! Distro !! Command&lt;br /&gt;
|-&lt;br /&gt;
| Ubuntu || &amp;lt;code&amp;gt;apt-get install git build-essential chrpath cpio diffstat gawk liblz4-tool python3 shared-mime-info texinfo wget zstd &amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Fedora || &amp;lt;code&amp;gt;dnf install chrpath diffstat g++ lz4 perl perl-bignum python3-pip rpcgen socat texinfo patch&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Arch || &amp;lt;code&amp;gt;pacman -Sy base-devel chrpath cpio diffstat gawk inetutils lz4 python3 rpcsvc-proto shared-mime-info texinfo wget zstd&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Alpine || &amp;lt;code&amp;gt;apk add binutils chrpath gcc g++ gawk gcc lz4 make patch perl rpcgen&amp;lt;/code&amp;gt; &amp;lt;br&amp;gt;Note: Alpine Linux does not contain diffstat in its repositories, thus you have to [https://github.com/asottile-archive/diffstat build it yourself from source].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
This repository basically only contains a shell script that populates &amp;lt;code&amp;gt;src/&amp;lt;/code&amp;gt; with OpenEmbedded and the appropriate Asteroid layers. Then, it setups the environment for a bitbake build. The following command will setup a build for &amp;lt;code&amp;gt;dory&amp;lt;/code&amp;gt; (the LG G Watch) but you can also build an image for other watches by using the corresponding codename. (Codenames can be found on the [https://asteroidos.org/watches/ Watches page].)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
source ./prepare-build.sh dory # Be careful that this script must be sourced and not only ran&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the environment has been correctly setup, you should now be in the &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; subdirectory.&lt;br /&gt;
&lt;br /&gt;
== Building ==&lt;br /&gt;
&lt;br /&gt;
Once the environment is prepared, you can simply trigger a build with the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bitbake asteroid-image&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;Notes:&#039;&#039;&lt;br /&gt;
1) The build process requires roughly 2GB memory per thread. It might be necessary to limit the number of threads. This can be done by prepending &amp;lt;code&amp;gt;BB_NUMBER_THREADS=n&amp;lt;/code&amp;gt; to the build command. Or by adding &amp;lt;code&amp;gt;BB_NUMBER_THREADS = &amp;quot;n&amp;quot;&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;build/conf/local.conf&amp;lt;/code&amp;gt;. Where &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; is the amount of threads.&lt;br /&gt;
2) Bitbake is a powerful tool that can also build single packages (e.g: &amp;lt;code&amp;gt;bitbake strace&amp;lt;/code&amp;gt;) or  [[Creating an Asteroid app#Building the Cross Compilation Toolchain|Building the SDK]] for example. Refer to its documentation for more details.&lt;br /&gt;
&lt;br /&gt;
If this step was successful, you can proceed to the [[#Installing|Installing]] section below.&lt;br /&gt;
&lt;br /&gt;
== Updating the Sources ==&lt;br /&gt;
&lt;br /&gt;
You can update the AsteroidOS sources with the following command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
source ./prepare-build.sh update&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Build with containers =&lt;br /&gt;
&lt;br /&gt;
These instructions have been tested on Ubuntu 19.04 (with Docker) and Fedora 41 (with podman), but should also be applicable to Debian Sid (at least at the time of writing). For other distributions the dependencies may have different names and you may have to install additional ones.&lt;br /&gt;
&lt;br /&gt;
From a user&#039;s point of view, Docker and podman are quite similar and accept almost all of the exact same commands, but there are some difference.  The most significant differences for building Asteroid are that podman does not use a daemon and can be run &amp;quot;rootless&amp;quot; (that is, as a non-root user).  This makes some things a bit easier, but either can be used.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Setup ==&lt;br /&gt;
&lt;br /&gt;
Remove the Docker container called &amp;lt;code&amp;gt;asteroidos-toolchain&amp;lt;/code&amp;gt; if it already exists:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo docker rm -f asteroidos-toolchain&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
podman rm -f asteroidos-toolchain&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Build a container image called &amp;lt;code&amp;gt;asteroidos-toolchain&amp;lt;/code&amp;gt; from the given Dockerfile:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo docker build --tag asteroidos-toolchain .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
podman build --tag asteroidos-toolchain .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Building the software ==&lt;br /&gt;
&lt;br /&gt;
Now that the container with the toolchain software has been created, we can use this to build AsteroidOS.  All of the tools are contained and run within the container, but we use a &#039;&#039;shared volume&#039;&#039;, essentially some drive space that both the host computer and the container can read and write, for actually creating the AsteroidOS image files.&lt;br /&gt;
&lt;br /&gt;
In this example, we will build AsteroidOS for &amp;lt;code&amp;gt;dory&amp;lt;/code&amp;gt;(the LG G Watch).  To build for a different watch than the LG G Watch, use its corresponding codename instead of &amp;lt;code&amp;gt;dory&amp;lt;/code&amp;gt; when executing the &amp;lt;code&amp;gt;docker run ...&amp;lt;/code&amp;gt; command.  You can find the codenames for the supported watches on the [https://asteroidos.org/watches/ Watches page].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Assuming that you have carefully followed the instructions so far and are in the &amp;lt;code&amp;gt;asteroid&amp;lt;/code&amp;gt; directory, you can now build the software.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Run this as a non root user&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo docker run \&lt;br /&gt;
  --rm \&lt;br /&gt;
  -it \&lt;br /&gt;
  -v /etc/passwd:/etc/passwd:ro \&lt;br /&gt;
  -u &amp;quot;$(id -u):$(id -g)&amp;quot; \&lt;br /&gt;
  -v &amp;quot;$HOME/.gitconfig:/$HOME/.gitconfig:ro&amp;quot; \&lt;br /&gt;
  -v &amp;quot;$(pwd):/asteroid&amp;quot; asteroidos-toolchain \&lt;br /&gt;
  bash -c &amp;quot;source ./prepare-build.sh dory &amp;amp;&amp;amp; bitbake asteroid-image&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
podman run \&lt;br /&gt;
  --rm \&lt;br /&gt;
  -it \&lt;br /&gt;
  -v  &amp;quot;$(pwd)&amp;quot;:/asteroid:Z \&lt;br /&gt;
  --userns keep-id asteroidos-toolchain \&lt;br /&gt;
  bash -c &amp;quot;source ./prepare-build.sh dory &amp;amp;&amp;amp; bitbake asteroid-image&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The files created during the build are placed in the current directory; more specifically, the source files are placed in a &amp;lt;code&amp;gt;src&amp;lt;/code&amp;gt; subdirectory and build artefacts, including the final binary images are placed in the &amp;lt;code&amp;gt;build&amp;lt;/code&amp;gt; subdirectory.&lt;br /&gt;
&lt;br /&gt;
Here is a detailed explanation of the Docker command above:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;code&amp;gt;sudo docker run&amp;lt;/code&amp;gt; Runs a container image&lt;br /&gt;
*&amp;lt;code&amp;gt;--rm&amp;lt;/code&amp;gt; Cleans up after the command is run by removing temporary container storage&lt;br /&gt;
*&amp;lt;code&amp;gt;-it&amp;lt;/code&amp;gt;  Attaches the terminal to the container so that we can see the output. Otherwise it would run blindly in the background.&lt;br /&gt;
*&amp;lt;code&amp;gt;-u &amp;quot;$(id -u):$(id -g)&amp;quot;&amp;lt;/code&amp;gt; Ensures that the current user id and group id from the host is used on files inside the container to avoid permission issues.&lt;br /&gt;
*&amp;lt;code&amp;gt;-v /etc/passwd:/etc/passwd&amp;lt;/code&amp;gt;  Ensures that the user ids and groups from the host are also available in the Docker container. (Otherwise the &amp;lt;code&amp;gt;-u&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;-g&amp;lt;/code&amp;gt; would be useless.)&lt;br /&gt;
*&amp;lt;code&amp;gt;/etc/passwd&amp;lt;/code&amp;gt; Contains the user names and their ids.&lt;br /&gt;
*&amp;lt;code&amp;gt;&amp;quot;$HOME/.gitconfig:/$HOME/.gitconfig&amp;quot;&amp;lt;/code&amp;gt; Share your user&#039;s git config with the container.&lt;br /&gt;
*&amp;lt;code&amp;gt;-v &amp;quot;$(pwd):/asteroid&amp;quot;&amp;lt;/code&amp;gt; Mount the current directory (which is your asteroid git repo clone) into the container.&lt;br /&gt;
*&amp;lt;code&amp;gt;bash -c &amp;quot;source ./prepare-build.sh dory &amp;amp;&amp;amp; bitbake asteroid-image&amp;quot;&amp;lt;/code&amp;gt;  This is the command to be executed inside of the container with &amp;quot;dory&amp;quot; being the codename of your watch.&lt;br /&gt;
&lt;br /&gt;
Here is a detailed explanation of the podman version of the command above:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;code&amp;gt;podman run&amp;lt;/code&amp;gt; Runs a container image&lt;br /&gt;
*&amp;lt;code&amp;gt;--rm&amp;lt;/code&amp;gt; Cleans up after the command is run by removing temporary container storage&lt;br /&gt;
*&amp;lt;code&amp;gt;-it&amp;lt;/code&amp;gt; Attaches the terminal to the container so that we can see the output. Otherwise it would run blindly in the background.&lt;br /&gt;
*&amp;lt;code&amp;gt;-v &amp;quot;$(pwd)&amp;quot;:/asteroid:Z&amp;lt;/code&amp;gt; Mount the current directory (which is your asteroid git repo clone) into the container. The &amp;lt;code&amp;gt;:Z&amp;lt;/code&amp;gt; tells SELinux, if it&#039;s running that this container has &#039;&#039;exclusive access&#039;&#039; to this mount.  If &amp;lt;code&amp;gt;:z&amp;lt;/code&amp;gt; is used instead, it tells SELinux, if it&#039;s running, to allow multiple containers to share this mount.  Either can be used, but the exclusive access flag avoids the need to re-apply security labels to all files which can take significant time when the container starts.&lt;br /&gt;
*&amp;lt;code&amp;gt;--userns keep-id&amp;lt;/code&amp;gt; Run as the current user inside the container&lt;br /&gt;
*&amp;lt;code&amp;gt;bash -c &amp;quot;source ./prepare-build.sh dory &amp;amp;&amp;amp; bitbake asteroid-image&amp;quot;&amp;lt;/code&amp;gt;  This is the command to be executed inside of the container with &amp;lt;code&amp;gt;dory&amp;lt;/code&amp;gt; being the codename of your watch.&lt;br /&gt;
&lt;br /&gt;
If this step was successful, you can proceed to [[#Installing|Installing]] below.&lt;br /&gt;
&lt;br /&gt;
= Installing =&lt;br /&gt;
&lt;br /&gt;
After a while, whether you build with or without containers, the generated image should be available in &amp;lt;code&amp;gt;build/tmp/deploy/images/dory/&amp;lt;/code&amp;gt; (for &amp;lt;code&amp;gt;dory&amp;lt;/code&amp;gt; -- for other watches, the image files are in the corresponding code word directory.)&lt;br /&gt;
&lt;br /&gt;
Install AsteroidOS using your usual device&#039;s instructions, which you can find linked from the [https://asteroidos.org/watches/ Watches page].&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Beluga&amp;diff=1015</id>
		<title>Beluga</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Beluga&amp;diff=1015"/>
		<updated>2026-07-12T11:37:08Z</updated>

		<summary type="html">&lt;p&gt;Beroset: added additional recovery method under issues&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Watches&lt;br /&gt;
|Name=beluga&lt;br /&gt;
|Model=OPPO Watch&lt;br /&gt;
|ReleaseDate=2020-07-31&lt;br /&gt;
|Picture=beluga.png&lt;br /&gt;
|Status=supported&lt;br /&gt;
|Stars=4.9&lt;br /&gt;
|Chipset=msm8909w&lt;br /&gt;
|KernelVersion=4.9&lt;br /&gt;
|AndroidVersion=pie&lt;br /&gt;
|StatusDisplay=good&lt;br /&gt;
|StatusTouch=good&lt;br /&gt;
|StatusBluetooth=good&lt;br /&gt;
|StatusHaptics=good&lt;br /&gt;
|StatusTiltToWake=good&lt;br /&gt;
|StatusLightSensor=good&lt;br /&gt;
|StatusAlwaysOnDisplay=good&lt;br /&gt;
|StatusDualDisplay=missing&lt;br /&gt;
|StatusMicrophone=good&lt;br /&gt;
|StatusSpeaker=good&lt;br /&gt;
|StatusCompass=good&lt;br /&gt;
|StatusSteps=bad&lt;br /&gt;
|StatusHeartRate=good&lt;br /&gt;
|StatusUSB=partial&lt;br /&gt;
|StatusWLAN=good&lt;br /&gt;
|StatusGPS=good&lt;br /&gt;
|StatusNFC=bad&lt;br /&gt;
|StatusCellular=bad&lt;br /&gt;
|StatusCamera=missing&lt;br /&gt;
|StatusCrown=missing&lt;br /&gt;
|StatusHands=missing&lt;br /&gt;
}}&lt;br /&gt;
Beluga (OPPO Watch) is a large rectangular watch with a lot of features. &lt;br /&gt;
----&lt;br /&gt;
Warning: The OPPO Watch Free is not supported! See the list on the [[porting Status]] page to find out if your model is supported.&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
Beluga is a large rectangular watch with a (side) curved OLED display, fairly large amount of sensors and a good vibration motor.&lt;br /&gt;
The casing of the watch is relatively thin, making it easier to tuck under the sleeves.&lt;br /&gt;
The watch uses a proprietary watchband mechanism for which one can buy adapters so standard 22mm straps can be attached.&lt;br /&gt;
&lt;br /&gt;
== Issues ==&lt;br /&gt;
NFC support causes graphical glitches, so it has been disabled for now.&lt;br /&gt;
&lt;br /&gt;
It has also been reported by some that switching back to the original OS from backups via the usual method doesn&#039;t always seem to work, so an alternative recipe is to extract the parts from the backup (as with [https://github.com/beroset/asteroid-hosttools#watch-image watch-image]) and then, with the watch in fastboot mode:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fastboot flash system system.img &lt;br /&gt;
fastboot flash vendor vendor.img&lt;br /&gt;
fastboot flash userdata userdata.img&lt;br /&gt;
fastboot flash recovery recovery.img&lt;br /&gt;
fastboot flash cache cache.img&lt;br /&gt;
fastboot flash boot boot.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Repair and customisation ==&lt;br /&gt;
The back of the watch is held on by glue, which means that disassembly will impact water resistance and is somewhat frustrating.&lt;br /&gt;
&lt;br /&gt;
== Sensorlogd ==&lt;br /&gt;
&lt;br /&gt;
=== Stepcounter ===&lt;br /&gt;
The watch needs to be powered on when 0:00 happens. Else it does not reset the previous day.&lt;br /&gt;
&lt;br /&gt;
= Miscellaneous hardware docs =&lt;br /&gt;
== Keys ==&lt;br /&gt;
There are two hardware buttons located on the right of the watch.&lt;br /&gt;
&lt;br /&gt;
The bottom button is used to power on or hard reset the watch.&lt;br /&gt;
The top button can be used to wake/sleep the watch from AsteroidOS. This button is also used to navigate through the boot menu. &lt;br /&gt;
Beluga is unconventional because the power button used in AsteroidOS is not the one used to power on the watch.&lt;br /&gt;
&lt;br /&gt;
== Manually getting to fastboot ==&lt;br /&gt;
When the watch is unlocked you can easily enter fastboot by pressing the upper right hardware button during the bootup of the watch. This will make the watch enter a boot menu. Using the top button to cycle through the list. Once &amp;quot;Fastboot&amp;quot; is selected press the bottom button to boot to fastboot.&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Fresh/Wise/Lucky7&amp;diff=1014</id>
		<title>Fresh/Wise/Lucky7</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Fresh/Wise/Lucky7&amp;diff=1014"/>
		<updated>2026-07-10T20:52:59Z</updated>

		<summary type="html">&lt;p&gt;Beroset: eliminate blank lines above description&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Watches&lt;br /&gt;
|Name=fresh&lt;br /&gt;
|Model=Samsung Galaxy Watch 4&lt;br /&gt;
|ReleaseDate=2021-08-27&lt;br /&gt;
|Picture=fresh.png&lt;br /&gt;
|Status=port in progress&lt;br /&gt;
|Stars=0&lt;br /&gt;
|Chipset=exynos5515&lt;br /&gt;
|KernelVersion=7.1&lt;br /&gt;
|AndroidVersion=redvelvetcake&lt;br /&gt;
|StatusDisplay=bad&lt;br /&gt;
|StatusTouch=bad&lt;br /&gt;
|StatusBluetooth=bad&lt;br /&gt;
|StatusHaptics=bad&lt;br /&gt;
|StatusTiltToWake=bad&lt;br /&gt;
|StatusLightSensor=bad&lt;br /&gt;
|StatusAlwaysOnDisplay=bad&lt;br /&gt;
|StatusDualDisplay=missing&lt;br /&gt;
|StatusMicrophone=bad&lt;br /&gt;
|StatusSpeaker=bad&lt;br /&gt;
|StatusCompass=bad&lt;br /&gt;
|StatusSteps=bad&lt;br /&gt;
|StatusHeartRate=bad&lt;br /&gt;
|StatusUSB=bad&lt;br /&gt;
|StatusWLAN=bad&lt;br /&gt;
|StatusGPS=bad&lt;br /&gt;
|StatusNFC=bad&lt;br /&gt;
|StatusCellular=bad&lt;br /&gt;
|StatusCamera=missing&lt;br /&gt;
|StatusCrown=bad&lt;br /&gt;
|StatusHands=missing&lt;br /&gt;
}}{{Watches&lt;br /&gt;
|Name=wise&lt;br /&gt;
|Model=Samsung Galaxy Watch 4 Classic&lt;br /&gt;
|ReleaseDate=2021-08-27&lt;br /&gt;
|Picture=wise.png&lt;br /&gt;
|Status=port in progress&lt;br /&gt;
|Stars=0&lt;br /&gt;
|Chipset=exynos5515&lt;br /&gt;
|KernelVersion=7.1&lt;br /&gt;
|AndroidVersion=redvelvetcake&lt;br /&gt;
|StatusDisplay=bad&lt;br /&gt;
|StatusTouch=bad&lt;br /&gt;
|StatusBluetooth=bad&lt;br /&gt;
|StatusHaptics=bad&lt;br /&gt;
|StatusTiltToWake=bad&lt;br /&gt;
|StatusLightSensor=bad&lt;br /&gt;
|StatusAlwaysOnDisplay=bad&lt;br /&gt;
|StatusDualDisplay=missing&lt;br /&gt;
|StatusMicrophone=bad&lt;br /&gt;
|StatusSpeaker=bad&lt;br /&gt;
|StatusCompass=bad&lt;br /&gt;
|StatusSteps=bad&lt;br /&gt;
|StatusHeartRate=bad&lt;br /&gt;
|StatusUSB=bad&lt;br /&gt;
|StatusWLAN=bad&lt;br /&gt;
|StatusGPS=bad&lt;br /&gt;
|StatusNFC=bad&lt;br /&gt;
|StatusCellular=bad&lt;br /&gt;
|StatusCamera=missing&lt;br /&gt;
|StatusCrown=bad&lt;br /&gt;
|StatusHands=missing&lt;br /&gt;
}}{{Watches&lt;br /&gt;
|Name=lucky7&lt;br /&gt;
|Model=Samsung Galaxy Watch FE&lt;br /&gt;
|ReleaseDate=2024-06-13&lt;br /&gt;
|Picture=lucky7.png&lt;br /&gt;
|Status=port in progress&lt;br /&gt;
|Stars=0&lt;br /&gt;
|Chipset=exynos5515&lt;br /&gt;
|KernelVersion=7.1&lt;br /&gt;
|AndroidVersion=tiramisu&lt;br /&gt;
|StatusDisplay=partial&lt;br /&gt;
|StatusTouch=bad&lt;br /&gt;
|StatusBluetooth=bad&lt;br /&gt;
|StatusHaptics=bad&lt;br /&gt;
|StatusTiltToWake=bad&lt;br /&gt;
|StatusLightSensor=bad&lt;br /&gt;
|StatusAlwaysOnDisplay=bad&lt;br /&gt;
|StatusDualDisplay=missing&lt;br /&gt;
|StatusMicrophone=bad&lt;br /&gt;
|StatusSpeaker=bad&lt;br /&gt;
|StatusCompass=bad&lt;br /&gt;
|StatusSteps=bad&lt;br /&gt;
|StatusHeartRate=bad&lt;br /&gt;
|StatusUSB=bad&lt;br /&gt;
|StatusWLAN=bad&lt;br /&gt;
|StatusGPS=bad&lt;br /&gt;
|StatusNFC=bad&lt;br /&gt;
|StatusCellular=bad&lt;br /&gt;
|StatusCamera=missing&lt;br /&gt;
|StatusCrown=bad&lt;br /&gt;
|StatusHands=missing&lt;br /&gt;
}}&lt;br /&gt;
[[Category:Watches]]&lt;br /&gt;
==Description==&lt;br /&gt;
Fresh (Samsung Galaxy Watch 4) and Wise (Samsung Galaxy Watch 4 Classic) are round smartwatches developed by Samsung. They released with Android 11, and use the Exynos W920 (Exynos 5515) Cortex-A55 based AArch64 SoC.&lt;br /&gt;
&lt;br /&gt;
Lucky7 (Samsung Galaxy Watch FE) is a derivative of Fresh, so their hardware is almost identical. It released with Android 13.&lt;br /&gt;
&lt;br /&gt;
Wise takes on the &amp;quot;classic&amp;quot; chassis design of the Samsung Gear S2, with a larger chassis and rotating bezel for navigation, whereas Fresh and Lucky7 have a smaller, more minimalistic design, with the bezel being touch-activated to fulfill the same purpose as the rotating bezel on Wise.&lt;br /&gt;
&lt;br /&gt;
Fresh, Wise, and Lucky7 all have two buttons on the side.&lt;br /&gt;
&lt;br /&gt;
There are ten different variants of this watch:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Codename&lt;br /&gt;
!Model Number&lt;br /&gt;
!Model Name&lt;br /&gt;
!Display Size&lt;br /&gt;
|-&lt;br /&gt;
|freshbs&lt;br /&gt;
|SM-R860&lt;br /&gt;
|Samsung Galaxy Watch 4 (WiFi)&lt;br /&gt;
|40mm&lt;br /&gt;
|-&lt;br /&gt;
|freshus&lt;br /&gt;
|SM-R865&lt;br /&gt;
|Samsung Galaxy Watch 4 (LTE)&lt;br /&gt;
|40mm&lt;br /&gt;
|-&lt;br /&gt;
|freshbl&lt;br /&gt;
|SM-R870&lt;br /&gt;
|Samsung Galaxy Watch 4 (WiFi)&lt;br /&gt;
|44mm&lt;br /&gt;
|-&lt;br /&gt;
|freshul&lt;br /&gt;
|SM-R875&lt;br /&gt;
|Samsung Galaxy Watch 4 (LTE)&lt;br /&gt;
|44mm&lt;br /&gt;
|-&lt;br /&gt;
|wisebs&lt;br /&gt;
|SM-R880&lt;br /&gt;
|Samsung Galaxy Watch 4 Classic (WiFi)&lt;br /&gt;
|42mm&lt;br /&gt;
|-&lt;br /&gt;
|wiseus&lt;br /&gt;
|SM-R885&lt;br /&gt;
|Samsung Galaxy Watch 4 Classic (LTE)&lt;br /&gt;
|42mm&lt;br /&gt;
|-&lt;br /&gt;
|wisebl&lt;br /&gt;
|SM-R890&lt;br /&gt;
|Samsung Galaxy Watch 4 Classic (WiFi)&lt;br /&gt;
|46mm&lt;br /&gt;
|-&lt;br /&gt;
|wiseul&lt;br /&gt;
|SM-R895&lt;br /&gt;
|Samsung Galaxy Watch 4 Classic (LTE)&lt;br /&gt;
|46mm&lt;br /&gt;
|-&lt;br /&gt;
|lucky7bs&lt;br /&gt;
|SM-R861&lt;br /&gt;
|Samsung Galaxy Watch FE (WiFi)&lt;br /&gt;
|40mm&lt;br /&gt;
|-&lt;br /&gt;
|lucky7us&lt;br /&gt;
|SM-R866&lt;br /&gt;
|Samsung Galaxy Watch FE (LTE)&lt;br /&gt;
|40mm&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
See the GSMArena pages for [https://www.gsmarena.com/samsung_galaxy_watch4-11045.php Fresh], [https://www.gsmarena.com/samsung_galaxy_watch4_classic-11046.php Wise], and [https://www.gsmarena.com/samsung_galaxy_watch_fe-13112.php Lucky7] for more hardware details.&lt;br /&gt;
&lt;br /&gt;
==Port Status==&lt;br /&gt;
&lt;br /&gt;
===Fresh/Wise===&lt;br /&gt;
No porting work has yet been done.&lt;br /&gt;
&lt;br /&gt;
===Lucky7===&lt;br /&gt;
[[File:Lucky7-first-ui.jpg|alt=Lucky7 displaying the first-start UI|none|thumb|Lucky7 displaying the first-start UI]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
A port using a [https://github.com/Aiden-Isik/linux/tree/lucky7-mainline close-to-mainline Linux kernel] is [https://github.com/Aiden-Isik/asteroid/tree/lucky7-mainline underway]. Currently, the watch can boot all the way up and display the launcher UI using software rendering, but nothing else works.&lt;br /&gt;
&lt;br /&gt;
==Bootloader Unlocking==&lt;br /&gt;
&#039;&#039;&#039;WARNING: Unlocking the bootloader will trip Knox efuses! Connections inside the SoC will be irreversibly severed, you will permanently lose the ability to use features such as Samsung Pay, and you will get a warning on each startup stating that the device&#039;s software &amp;quot;may be corrupt&amp;quot; (this can be ignored).&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE: While Samsung disabled bootloader unlocking on their phones with the OneUI 8 (Android 16) update, they did not do so for their watches (as of 26/02/2026). All firmware versions of this watch can be unlocked.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The bootloader of the Galaxy Watch FE can be unlocked using the following steps, with the buttons facing to the right:&lt;br /&gt;
&lt;br /&gt;
*Open settings.&lt;br /&gt;
*Go to &amp;quot;About watch&amp;quot; -&amp;gt; &amp;quot;Software information&amp;quot;&lt;br /&gt;
*Tap the software version several times until you are informed that developer mode has been enabled.&lt;br /&gt;
* Locate the &amp;quot;OEM unlocking&amp;quot; option in the developer options menu, and switch it on.&lt;br /&gt;
*Hold both buttons on the side of the watch until the Samsung logo appears with the &amp;quot;rebooting...&amp;quot; text below it.&lt;br /&gt;
*Quickly press the upper button three times to open the bootloader menu.&lt;br /&gt;
*Use the upper button on the side of the watch to navigate to the &amp;quot;Bootloader unlock&amp;quot; option and select it. A short click moves to the next option and a long hold selects an option.&lt;br /&gt;
* Press the upper button to unlock the bootloader.&lt;br /&gt;
*After rebooting, if you end up in the recovery, follow the steps presented to wipe the device&#039;s data.&lt;br /&gt;
* Your bootloader is now unlocked.&lt;br /&gt;
&lt;br /&gt;
== Repair==&lt;br /&gt;
These watches are relatively easy to disassemble to repair. There are four Y00 screws on the back, then everything else just pulls apart.&lt;br /&gt;
&lt;br /&gt;
They use a rubber gasket for water resistance, so as long as it isn&#039;t damaged during disassembly it should be able to be reused, and water resistance not compromised.&lt;br /&gt;
&lt;br /&gt;
See the [https://www.ifixit.com/Device/Samsung_Galaxy_Watch_4 Fresh] (Lucky7) and [https://www.ifixit.com/Device/Samsung_Galaxy_Watch_4_Classic Wise] iFixit pages for detailed instructions for various repairs.&lt;br /&gt;
&lt;br /&gt;
==USB==&lt;br /&gt;
There are no USB connections exposed anywhere on the exterior of this watch. There are however internal USB pads near the top edge of the watch, which can have a USB cable soldered onto them.&lt;br /&gt;
&lt;br /&gt;
The pinout, with the top edge facing towards you, is as follows from left to right:&lt;br /&gt;
&lt;br /&gt;
*Vcc&lt;br /&gt;
*ID&lt;br /&gt;
*D+&lt;br /&gt;
*D-&lt;br /&gt;
*GND&lt;br /&gt;
&lt;br /&gt;
To connect to the watch over USB, you must connect the ID pin to GND through approximately 150kOhms of resistance (it doesn&#039;t have to be exact).&lt;br /&gt;
&lt;br /&gt;
==UART==&lt;br /&gt;
The internal USB pads can also be used for receiving 3V UART signals. &lt;br /&gt;
&lt;br /&gt;
The pinout, with the top edge facing towards you, is as follows from left to right:&lt;br /&gt;
&lt;br /&gt;
* Not connected&lt;br /&gt;
*ID&lt;br /&gt;
*TX&lt;br /&gt;
*RX&lt;br /&gt;
*GND&lt;br /&gt;
&lt;br /&gt;
To connect to the watch over UART, you must connect the ID pin to GND through 619kOhms of resistance. You should also either add a connector which can be unplugged between the watch and your UART adapter, or a switch on the ID line. This is required as in order for the watch to transmit serial data the ID pin must be disconnected then reconnected during the boot process.&lt;br /&gt;
&lt;br /&gt;
The bootloader does not transmit any data over UART.&lt;br /&gt;
&lt;br /&gt;
To get the kernel to transmit its logs over UART, add &#039;console=ttySAC0,115200n8 loglevel=7&#039; to CONFIG_CMDLINE in the defconfig and recompile.&lt;br /&gt;
&lt;br /&gt;
RX Seems to be tied low, so the watch is unable to receive serial data.&lt;br /&gt;
&lt;br /&gt;
==Booting==&lt;br /&gt;
====Boot Image Format (Lucky7) ====&lt;br /&gt;
The boot image format used by the S-Boot bootloader on the Galaxy Watch FE is [https://source.android.com/docs/core/architecture/bootloader/boot-image-header#header-v4 Android boot version 4], with INIT_BOOT and DTBO. The partitions involved in booting Linux are therefore BOOT, INIT_BOOT, VENDOR_BOOT, and DTBO, along with VBMETA for signature enforcement.&lt;br /&gt;
&lt;br /&gt;
====Device Tree Format (Lucky7)====&lt;br /&gt;
The device tree, used to specify to Linux which hardware the system has and where, in the absence of ACPI, is split into two. The main blob (mostly SoC-specific) part of the device tree is part of the VENDOR_BOOT partition, whereas the overlay blob (mostly board-specific) lives in its own partition, DTBO. The overlay is combined with the main blob by the bootloader to create one unified device tree for Linux to use.&lt;br /&gt;
&lt;br /&gt;
Both of these conform to the standard [https://devicetree-specification.readthedocs.io/en/stable/flattened-format.html device tree blob format] produced by DTC and the Linux build system, with an extra Android-specific header created by [https://android.googlesource.com/platform/system/libufdt/ libufdt] prepended to the beginning of the file.&lt;br /&gt;
&lt;br /&gt;
The main device tree blob in VENDOR_BOOT is a standard Android device tree blob as specified as above, except that the &#039;CUSTOM1&#039; field is set to 0xFF (255). It can be generated using mkdtboimg.py from libufdt with the following command:&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot;&amp;gt;&lt;br /&gt;
python3 mkdtboimg.py create --custom1=255 &amp;lt;output&amp;gt; &amp;lt;input&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;The overlay device tree blob in DTBO is also a standard Android device tree blob, except that the &#039;CUSTOM1&#039; field is set to 0x20 (32). It can be generated using mkdtboimg.py with the following command:&amp;lt;syntaxhighlight lang=&amp;quot;sh&amp;quot;&amp;gt;&lt;br /&gt;
python3 mkdtboimg.py create --custom1=32 &amp;lt;output&amp;gt; &amp;lt;input&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;The meaning of the values in the &#039;CUSTOM1&#039; fields is not currently known. They are possibly just magic numbers to identify the different blobs.&lt;br /&gt;
&lt;br /&gt;
====Minimum Acceptable Device Tree (Lucky7)====&lt;br /&gt;
The bootloader of this watch requires certain device tree nodes to be present, due to it applying its own overlay blob on top of the two supplied by the VENDOR_BOOT and DTBO partitions. If the nodes the bootloader wants to overlay onto are not present, it will refuse to boot. The most minimal device tree source which fulfills this requirement is as follows (note that it is useless for anything other than satisfying the bootloader):&amp;lt;syntaxhighlight lang=&amp;quot;dts&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
/dts-v1/;&lt;br /&gt;
&lt;br /&gt;
/ {&lt;br /&gt;
    #address-cells = &amp;lt;0x02&amp;gt;;&lt;br /&gt;
    #size-cells = &amp;lt;0x01&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
    dpm: dpm {&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    itmon: itmon {&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    memlogger_policy: samsung,memlogger {&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    reserved_memory: reserved-memory {&lt;br /&gt;
        #address-cells = &amp;lt;0x02&amp;gt;;&lt;br /&gt;
        #size-cells = &amp;lt;0x01&amp;gt;;&lt;br /&gt;
        ranges;&lt;br /&gt;
&lt;br /&gt;
        dss_rmem: debug_snapshot {&lt;br /&gt;
            #address-cells = &amp;lt;0x02&amp;gt;;&lt;br /&gt;
            #size-cells = &amp;lt;0x01&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
            log_platform: log_platform {&lt;br /&gt;
            };&lt;br /&gt;
&lt;br /&gt;
            log_arrdumpreset: log_arrdumpreset {&lt;br /&gt;
            };&lt;br /&gt;
&lt;br /&gt;
            log_arrdumppanic: log_arrdumppanic {&lt;br /&gt;
            };&lt;br /&gt;
&lt;br /&gt;
            log_first: log_first {&lt;br /&gt;
            };&lt;br /&gt;
&lt;br /&gt;
            log_kevents: log_kevents {&lt;br /&gt;
            };&lt;br /&gt;
&lt;br /&gt;
            log_kevents_small: log_kevents_small {&lt;br /&gt;
            };&lt;br /&gt;
&lt;br /&gt;
            log_s2d: log_s2d {&lt;br /&gt;
            };&lt;br /&gt;
        };&lt;br /&gt;
    };&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Nemo&amp;diff=1007</id>
		<title>Nemo</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Nemo&amp;diff=1007"/>
		<updated>2026-07-09T11:51:06Z</updated>

		<summary type="html">&lt;p&gt;Beroset: Shorten name of Model&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Watches&lt;br /&gt;
|Name=nemo&lt;br /&gt;
|Model=LG Watch Urbane 2&lt;br /&gt;
|ReleaseDate=2015-11-01&lt;br /&gt;
|Picture=nemo.png&lt;br /&gt;
|Status=experimental&lt;br /&gt;
|Stars=2&lt;br /&gt;
|Chipset=msm8226&lt;br /&gt;
|KernelVersion=3.10&lt;br /&gt;
|AndroidVersion=marshmallow&lt;br /&gt;
|StatusDisplay=good&lt;br /&gt;
|StatusTouch=good&lt;br /&gt;
|StatusBluetooth=bad&lt;br /&gt;
|StatusHaptics=bad&lt;br /&gt;
|StatusTiltToWake=bad&lt;br /&gt;
|StatusLightSensor=good&lt;br /&gt;
|StatusAlwaysOnDisplay=good&lt;br /&gt;
|StatusDualDisplay=missing&lt;br /&gt;
|StatusMicrophone=bad&lt;br /&gt;
|StatusSpeaker=bad&lt;br /&gt;
|StatusCompass=bad&lt;br /&gt;
|StatusSteps=bad&lt;br /&gt;
|StatusHeartRate=bad&lt;br /&gt;
|StatusUSB=good&lt;br /&gt;
|StatusWLAN=bad&lt;br /&gt;
|StatusGPS=bad&lt;br /&gt;
|StatusNFC=bad&lt;br /&gt;
|StatusCellular=bad&lt;br /&gt;
|StatusCamera=missing&lt;br /&gt;
|StatusCrown=missing&lt;br /&gt;
|StatusHands=missing&lt;br /&gt;
}}&lt;br /&gt;
Nemo (LG Watch Urbane 2nd Edition) is a large round watch with LTE. The port is currently a work in progress. &lt;br /&gt;
----&lt;br /&gt;
Warning: The LG Watch Urbane is a separate watch, see [[bass]]&lt;br /&gt;
&lt;br /&gt;
= Description =&lt;br /&gt;
Nemo is large round watch with a steel case. This was the first android wear watch with cellular networking. The watch can be opened to reveal a SIM card slot. &lt;br /&gt;
&lt;br /&gt;
= Repair and customisation =&lt;br /&gt;
The back of the watch is held on by glue, which means that disassembly will impact water resistance and is somewhat frustrating. Replacement housings-display modules and batteries are commonly available. You will likely need to replace the battery when buying these watches as they are getting quite old.&lt;br /&gt;
&lt;br /&gt;
== SIM card ==&lt;br /&gt;
Getting to the SIM card requires a special triangular tool with three pins. Use this tool to rotate the back cover counterclockwise to the &#039;unlock&#039; position and it should fall out. When reassembling, rotate the back cover in the clockwise direction.&lt;br /&gt;
&lt;br /&gt;
== Straps ==&lt;br /&gt;
The straps on nemo are not standard and contain antennas, which allows the watch to have a steel case while keeping cellular functionality. These straps are held in with screws that go through the lugs. Due to the thin plastic around the brass inserts in the straps, the straps may crack and no longer mount securely to the watch. &lt;br /&gt;
&lt;br /&gt;
Straps are rare and expensive due to the fact that they contain antennae. There are two known variants:&lt;br /&gt;
* rubber/plastic composite. These are most common and come in black or white. &lt;br /&gt;
* rubber/plastic with leather on outside. These straps are even more rare than the standard straps. &lt;br /&gt;
&lt;br /&gt;
= Miscellaneous hardware docs =&lt;br /&gt;
== Battery ==&lt;br /&gt;
The battery is commonly sold as BL-S6&lt;br /&gt;
&lt;br /&gt;
== Keys ==&lt;br /&gt;
The center key is the power button. The top and bottom keys map to volume up and down respectively. &lt;br /&gt;
== Manually getting to fastboot ==&lt;br /&gt;
Hold the lower button before and while powering on the device from power off state until the fastboot menu appears. Powering on can be either done by pressing the power button or by connecting a powered USB cable.&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Category:Watches&amp;diff=975</id>
		<title>Category:Watches</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Category:Watches&amp;diff=975"/>
		<updated>2026-07-08T14:26:08Z</updated>

		<summary type="html">&lt;p&gt;Beroset: refactored to look better and to use template&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
=== Supported watches ===&lt;br /&gt;
{{#cargo_query:&lt;br /&gt;
tables=Watches&lt;br /&gt;
|where=Status=&amp;quot;supported&amp;quot;&lt;br /&gt;
|fields=Picture,Name,Model,Stars,floor(Stars)=Stars,CONCAT(&amp;quot;&amp;lt;b&amp;gt;&amp;quot;,Model,&amp;quot;&amp;lt;/b&amp;gt;&amp;lt;br/&amp;gt;(&amp;quot;,Name,&amp;quot;)&amp;lt;br/&amp;gt;&amp;quot;,floor(Stars),&amp;quot; stars&amp;quot;)=capt,_pageName&lt;br /&gt;
|order by=Watches.Stars DESC, Watches.Name ASC&lt;br /&gt;
|format=template&lt;br /&gt;
|template=WatchGalleryItem&lt;br /&gt;
|named args=yes&lt;br /&gt;
|intro=&amp;lt;div style=&amp;quot;display:flex;flex-wrap:wrap;gap:16px;align-items:flex-start;&amp;quot;&amp;gt;&lt;br /&gt;
|outro=&amp;lt;/div&amp;gt;&lt;br /&gt;
|default=&lt;br /&gt;
}}&lt;br /&gt;
=== Experimental watches ===&lt;br /&gt;
{{#cargo_query:&lt;br /&gt;
tables=Watches&lt;br /&gt;
|where=Status=&amp;quot;experimental&amp;quot;&lt;br /&gt;
|fields=Picture,Model,Name,Stars,_pageName&lt;br /&gt;
|order by=Watches.Stars DESC, Watches.Name ASC&lt;br /&gt;
|format=template&lt;br /&gt;
|template=WatchGalleryItem&lt;br /&gt;
|named args=yes&lt;br /&gt;
|intro=&amp;lt;div style=&amp;quot;display:flex;flex-wrap:wrap;gap:16px;align-items:flex-start;&amp;quot;&amp;gt;&lt;br /&gt;
|outro=&amp;lt;/div&amp;gt;&lt;br /&gt;
|default=&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Devices without a functioning port ===&lt;br /&gt;
{{#cargo_query:&lt;br /&gt;
tables=Watches&lt;br /&gt;
|where=Status=&amp;quot;port in progress&amp;quot;&lt;br /&gt;
|fields=Picture,Name,CONCAT(&amp;quot;&amp;lt;b&amp;gt;&amp;quot;,Model,&amp;quot;&amp;lt;/b&amp;gt;&amp;lt;br/&amp;gt;(&amp;quot;,Name,&amp;quot;)&amp;lt;br/&amp;gt;&amp;quot;,floor(Stars),&amp;quot; stars&amp;quot;)=capt,_pageName&lt;br /&gt;
|order by=Watches.Stars DESC, Watches.Name ASC&lt;br /&gt;
|format=template&lt;br /&gt;
|template=WatchGalleryItem&lt;br /&gt;
|named args=yes&lt;br /&gt;
|intro=&amp;lt;div style=&amp;quot;display:flex;flex-wrap:wrap;gap:16px;align-items:flex-start;&amp;quot;&amp;gt;&lt;br /&gt;
|outro=&amp;lt;/div&amp;gt;&lt;br /&gt;
|default=&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=974</id>
		<title>Template:WatchGalleryItem</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=974"/>
		<updated>2026-07-08T14:18:46Z</updated>

		<summary type="html">&lt;p&gt;Beroset: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background:#eee; border:1px solid #ddd; border-radius:4px; display:flex; flex-direction:column; text-align:center; width:min-content&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;margin-bottom:6px;margin-top:6px;&amp;quot;&amp;gt;[[File:{{{Picture|}}}|150px|link={{{_pageName|}}}]]&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;font-weight:bold; height:10%&amp;quot;&amp;gt;{{{Model|}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;({{{Name|}}})&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;margin-bottom:6px&amp;quot;&amp;gt;&amp;lt;i&amp;gt;Support:&amp;lt;/i&amp;gt;{{#rating: {{{Stars|0}}} }}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=973</id>
		<title>Template:WatchGalleryItem</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=973"/>
		<updated>2026-07-08T14:15:50Z</updated>

		<summary type="html">&lt;p&gt;Beroset: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background:#eee; border:1px solid #ddd; border-radius:4px; display:flex; flex-direction:column; vertical-align:top; text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;margin-bottom:6px;margin-top:6px;&amp;quot;&amp;gt;[[File:{{{Picture|}}}|150px|link={{{_pageName|}}}]]&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;font-weight:bold; height:10%&amp;quot;&amp;gt;{{{Model|}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;({{{Name|}}})&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;margin-bottom:6px&amp;quot;&amp;gt;&amp;lt;i&amp;gt;Support:&amp;lt;/i&amp;gt;{{#rating: {{{Stars|0}}} }}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=972</id>
		<title>Template:WatchGalleryItem</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=972"/>
		<updated>2026-07-08T14:14:12Z</updated>

		<summary type="html">&lt;p&gt;Beroset: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background:#eee; border:1px solid #ddd; border-radius:4px; width:20%; display:flex; flex-direction:column; vertical-align:top; text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;margin-bottom:6px;margin-top:6px;&amp;quot;&amp;gt;[[File:{{{Picture|}}}|150px|link={{{_pageName|}}}]]&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;font-weight:bold; height:10%&amp;quot;&amp;gt;{{{Model|}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;({{{Name|}}})&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;margin-bottom:6px&amp;quot;&amp;gt;&amp;lt;i&amp;gt;Support:&amp;lt;/i&amp;gt;{{#rating: {{{Stars|0}}} }}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=971</id>
		<title>Template:WatchGalleryItem</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=971"/>
		<updated>2026-07-08T14:11:07Z</updated>

		<summary type="html">&lt;p&gt;Beroset: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background:#eee; border:1px solid #ddd; border-radius:4px; width:18%; display:flex; flex-direction:column; vertical-align:top; text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;margin-bottom:6px;margin-top:6px;&amp;quot;&amp;gt;[[File:{{{Picture|}}}|150px|link={{{_pageName|}}}]]&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;font-weight:bold; height:10%&amp;quot;&amp;gt;{{{Model|}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;({{{Name|}}})&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;margin-bottom:6px&amp;quot;&amp;gt;&amp;lt;i&amp;gt;Support:&amp;lt;/i&amp;gt;{{#rating: {{{Stars|0}}} }}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=970</id>
		<title>Template:WatchGalleryItem</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=970"/>
		<updated>2026-07-08T14:10:02Z</updated>

		<summary type="html">&lt;p&gt;Beroset: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background:#eee; border:1px solid #ddd; border-radius:4px; width:18%; display:flex; flex-direction:column; vertical-align:top; text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;margin-bottom:6px;margin-top:6px;&amp;quot;&amp;gt;[[File:{{{Picture|}}}|150px|link={{{_pageName|}}}]]&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;font-weight:bold&amp;quot;&amp;gt;{{{Model|}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;height:10%&amp;quot;&amp;gt;({{{Name|}}})&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;margin-bottom:6px&amp;quot;&amp;gt;&amp;lt;i&amp;gt;Support:&amp;lt;/i&amp;gt;{{#rating: {{{Stars|0}}} }}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=969</id>
		<title>Template:WatchGalleryItem</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=969"/>
		<updated>2026-07-08T14:08:36Z</updated>

		<summary type="html">&lt;p&gt;Beroset: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background:#eee; border:1px solid #ddd; border-radius:4px; width:18%; display:flex; flex-direction:column; vertical-align:top; text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;margin-bottom:6px;margin-top:6px;&amp;quot;&amp;gt;[[File:{{{Picture|}}}|150px|link={{{_pageName|}}}]]&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;font-weight:bold&amp;quot;&amp;gt;{{{Model|}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;({{{Name|}}})&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;margin-bottom:6px&amp;quot;&amp;gt;&amp;lt;i&amp;gt;Support:&amp;lt;/i&amp;gt;{{#rating: {{{Stars|0}}} }}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=968</id>
		<title>Template:WatchGalleryItem</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=968"/>
		<updated>2026-07-08T14:07:38Z</updated>

		<summary type="html">&lt;p&gt;Beroset: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background:#eee; border:1px solid #ddd; border-radius:4px; width:18.7%; margin:0.5%; display:flex; flex-direction:column; vertical-align:top; text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;margin-bottom:6px;margin-top:6px;&amp;quot;&amp;gt;[[File:{{{Picture|}}}|150px|link={{{_pageName|}}}]]&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;font-weight:bold&amp;quot;&amp;gt;{{{Model|}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;({{{Name|}}})&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;margin-bottom:6px&amp;quot;&amp;gt;&amp;lt;i&amp;gt;Support:&amp;lt;/i&amp;gt;{{#rating: {{{Stars|0}}} }}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=967</id>
		<title>Template:WatchGalleryItem</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=967"/>
		<updated>2026-07-08T13:57:59Z</updated>

		<summary type="html">&lt;p&gt;Beroset: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background:#eee; border:1px solid #ddd; border-radius:4px; width:170px; display:flex; flex-direction:column; vertical-align:top; text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;margin-bottom:6px;margin-top:6px;&amp;quot;&amp;gt;[[File:{{{Picture|}}}|150px|link={{{_pageName|}}}]]&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;font-weight:bold&amp;quot;&amp;gt;{{{Model|}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;({{{Name|}}})&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;margin-bottom:6px&amp;quot;&amp;gt;{{#rating: {{{Stars|0}}} }}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=966</id>
		<title>Template:WatchGalleryItem</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=966"/>
		<updated>2026-07-08T13:55:51Z</updated>

		<summary type="html">&lt;p&gt;Beroset: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background:#eee; border:1px solid #ddd; border-radius:4px; width:205px; display:flex; flex-direction:column; vertical-align:top; text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;margin-bottom:6px;margin-top:6px;&amp;quot;&amp;gt;[[File:{{{Picture|}}}|150px|link={{{_pageName|}}}]]&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;font-weight:bold&amp;quot;&amp;gt;{{{Model|}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;({{{Name|}}})&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;margin-bottom:6px&amp;quot;&amp;gt;{{#rating: {{{Stars|0}}} }}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=965</id>
		<title>Template:WatchGalleryItem</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=965"/>
		<updated>2026-07-08T13:55:09Z</updated>

		<summary type="html">&lt;p&gt;Beroset: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background:#eee; border:1px solid #ddd; border-radius:4px; width:155px; display:flex; flex-direction:column; vertical-align:top; text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;margin-bottom:6px;margin-top:6px;&amp;quot;&amp;gt;[[File:{{{Picture|}}}|200px|link={{{_pageName|}}}]]&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;font-weight:bold&amp;quot;&amp;gt;{{{Model|}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;({{{Name|}}})&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;margin-bottom:6px&amp;quot;&amp;gt;{{#rating: {{{Stars|0}}} }}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=964</id>
		<title>Template:WatchGalleryItem</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=964"/>
		<updated>2026-07-08T13:53:56Z</updated>

		<summary type="html">&lt;p&gt;Beroset: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background:#eee; border:1px solid #ddd; border-radius:4px; width:155px; display:flex; flex-direction:column; vertical-align:top; text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;margin-bottom:6px;margin-top:6px;&amp;quot;&amp;gt;[[File:{{{Picture|}}}|150px|link={{{_pageName|}}}]]&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;font-weight:bold&amp;quot;&amp;gt;{{{Model|}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;({{{Name|}}})&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;margin-bottom:6px&amp;quot;&amp;gt;{{#rating: {{{Stars|0}}} }}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=963</id>
		<title>Template:WatchGalleryItem</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=963"/>
		<updated>2026-07-08T13:51:52Z</updated>

		<summary type="html">&lt;p&gt;Beroset: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background:#eee; border:1px solid #ddd; border-radius:4px; width:155px; display:flex; flex-direction:column; vertical-align:top; text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;margin-bottom:6px;margin-top:6px;&amp;quot;&amp;gt;[[File:{{{Picture|}}}|150px|link={{{_pageName|}}}]]&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;font-weight:bold&amp;quot;&amp;gt;{{{Model|}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;({{{Name|}}})&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;{{#rating: {{{Stars|0}}} }}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=962</id>
		<title>Template:WatchGalleryItem</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=962"/>
		<updated>2026-07-08T13:49:57Z</updated>

		<summary type="html">&lt;p&gt;Beroset: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background:#eee; border:1px solid #ddd; border-radius:4px; width:155px; display:flex; flex-direction:column; vertical-align:top; text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;margin-bottom:6px;&amp;quot;&amp;gt;[[File:{{{Picture|}}}|150px|link={{{_pageName|}}}]]&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;font-weight:bold&amp;quot;&amp;gt;{{{Model|}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;({{{Name|}}})&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;{{#rating: {{{Stars|0}}} }}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=961</id>
		<title>Template:WatchGalleryItem</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=961"/>
		<updated>2026-07-08T13:49:01Z</updated>

		<summary type="html">&lt;p&gt;Beroset: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background:#eee; border:1px solid #ddd; border-radius:4px; width:155px; display:flex; flex-direction:column; vertical-align:top; text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;span style=&amp;quot;margin-bottom:6px;&amp;quot;&amp;gt;&lt;br /&gt;
    [[File:{{{Picture|}}}|150px|link={{{_pageName|}}}]]&lt;br /&gt;
  &amp;lt;/span&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;font-weight:bold&amp;quot;&amp;gt;{{{Model|}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;({{{Name|}}})&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;{{#rating: {{{Stars|0}}} }}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=960</id>
		<title>Template:WatchGalleryItem</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=960"/>
		<updated>2026-07-08T13:47:46Z</updated>

		<summary type="html">&lt;p&gt;Beroset: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background:#eee; border:1px solid #ddd; border-radius:4px; width:155px; display:flex; flex-direction:column; vertical-align:top; text-align:center;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;margin-bottom:6px;&amp;quot;&amp;gt;&lt;br /&gt;
    [[File:{{{Picture|}}}|150px|link={{{_pageName|}}}]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;font-weight:bold&amp;quot;&amp;gt;{{{Model|}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;({{{Name|}}})&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;{{#rating: {{{Stars|0}}} }}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=959</id>
		<title>Template:WatchGalleryItem</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=959"/>
		<updated>2026-07-08T13:38:28Z</updated>

		<summary type="html">&lt;p&gt;Beroset: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background:#eee; border:1px solid #ddd; border-radius:4px; width:155px; display:flex; flex-direction:column; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;text-align:center;margin-bottom:6px;&amp;quot;&amp;gt;&lt;br /&gt;
    [[File:{{{Picture|}}}|150px|link={{{_pageName|}}}]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;font-weight:bold;text-align:center&amp;quot;&amp;gt;{{{Model|}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;text-align:center&amp;quot;&amp;gt;({{{Name|}}})&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;{{#rating: {{{Stars|0}}} }}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=958</id>
		<title>Template:WatchGalleryItem</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=958"/>
		<updated>2026-07-08T13:37:20Z</updated>

		<summary type="html">&lt;p&gt;Beroset: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background:#eee; border:1px solid #ddd; padding:10px; border-radius:4px; width:180px; display:flex; flex-direction:column; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;text-align:center;margin-bottom:6px;&amp;quot;&amp;gt;&lt;br /&gt;
    [[File:{{{Picture|}}}|150px|link={{{_pageName|}}}]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;font-weight:bold;text-align:center&amp;quot;&amp;gt;{{{Model|}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;text-align:center&amp;quot;&amp;gt;({{{Name|}}})&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;{{#rating: {{{Stars|0}}} }}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=957</id>
		<title>Template:WatchGalleryItem</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=957"/>
		<updated>2026-07-08T13:35:19Z</updated>

		<summary type="html">&lt;p&gt;Beroset: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;background:#eee; border:1px solid #ddd; padding:10px; border-radius:4px; width:155px; display:flex; flex-direction:column; vertical-align:top;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;text-align:center;margin-bottom:6px;&amp;quot;&amp;gt;&lt;br /&gt;
    [[File:{{{Picture|}}}|150px|link={{{_pageName|}}}]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;font-weight:bold;text-align:center&amp;quot;&amp;gt;{{{Model|}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;text-align:center&amp;quot;&amp;gt;({{{Name|}}})&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;{{#rating: {{{Stars|0}}} }}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:Infobox_watch&amp;diff=956</id>
		<title>Template:Infobox watch</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:Infobox_watch&amp;diff=956"/>
		<updated>2026-07-08T13:23:29Z</updated>

		<summary type="html">&lt;p&gt;Beroset: Added #rating for stars&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;{| class=&amp;quot;infobox&amp;quot; style=&amp;quot;width:24em; font-size:90%; border-collapse:collapse;&amp;quot;&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; style=&amp;quot;text-align:left; font-size:110%; padding:0.6em;&amp;quot; |&lt;br /&gt;
  {{{Name|}}} {{#if:{{{Model|}}}|&amp;lt;span style=&amp;quot;font-size:85%; color:#666&amp;quot;&amp;gt; — {{{Model}}}&amp;lt;/span&amp;gt;}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:center; padding:0.4em;&amp;quot; colspan=&amp;quot;2&amp;quot; |&lt;br /&gt;
  {{#if:{{{Picture|}}}&lt;br /&gt;
    | [[File:{{{Picture}}}|200px|alt={{{Name|}}}]]&lt;br /&gt;
    | &amp;lt;!-- no picture --&amp;gt;&lt;br /&gt;
  }}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:0.2em 0.6em; width:40%;&amp;quot; | &#039;&#039;&#039;Status&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;padding:0.2em 0.6em;&amp;quot; | {{{Status|unknown}}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:0.2em 0.6em; width:40%;&amp;quot; | &#039;&#039;&#039;Stars&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;padding:0.2em 0.6em;&amp;quot; | {{#rating: {{{Stars|0}}} }}&lt;br /&gt;
|-&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; style=&amp;quot;background:#f6f6f6; padding:0.45em 0.6em; text-align:left;&amp;quot; | Status details&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:50%; padding:0.25em 0.6em;&amp;quot; | Display&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | {{{StatusDisplay|unknown}}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | Touch&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | {{{StatusTouch|unknown}}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | Bluetooth&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | {{{StatusBluetooth|unknown}}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | Haptics&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | {{{StatusHaptics|unknown}}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | Tilt to wake&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | {{{StatusTiltToWake|unknown}}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | Light sensor&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | {{{StatusLightSensor|unknown}}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | Always-on display&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | {{{StatusAlwaysOnDisplay|unknown}}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | Dual display&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | {{{StatusDualDisplay|unknown}}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | Microphone&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | {{{StatusMicrophone|unknown}}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | Speaker&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | {{{StatusSpeaker|unknown}}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | Compass&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | {{{StatusCompass|unknown}}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | Steps&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | {{{StatusSteps|unknown}}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | Heart rate&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | {{{StatusHeartRate|unknown}}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | USB&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | {{{StatusUSB|unknown}}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | WLAN&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | {{{StatusWLAN|unknown}}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | GPS&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | {{{StatusGPS|unknown}}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | NFC&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | {{{StatusNFC|unknown}}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | Cellular&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | {{{StatusCellular|unknown}}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | Camera&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | {{{StatusCamera|unknown}}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | Crown&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | {{{StatusCrown|unknown}}}&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | Hands&lt;br /&gt;
| style=&amp;quot;padding:0.25em 0.6em;&amp;quot; | {{{StatusHands|unknown}}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
Usage:&lt;br /&gt;
{{Infobox watch&lt;br /&gt;
|Name=&lt;br /&gt;
|Model=&lt;br /&gt;
|Picture=&lt;br /&gt;
|Status=&lt;br /&gt;
|Stars=&lt;br /&gt;
|StatusDisplay=&lt;br /&gt;
|StatusTouch=&lt;br /&gt;
|StatusBluetooth=&lt;br /&gt;
|StatusHaptics=&lt;br /&gt;
|StatusTiltToWake=&lt;br /&gt;
|StatusLightSensor=&lt;br /&gt;
|StatusAlwaysOnDisplay=&lt;br /&gt;
|StatusDualDisplay=&lt;br /&gt;
|StatusMicrophone=&lt;br /&gt;
|StatusSpeaker=&lt;br /&gt;
|StatusCompass=&lt;br /&gt;
|StatusSteps=&lt;br /&gt;
|StatusHeartRate=&lt;br /&gt;
|StatusUSB=&lt;br /&gt;
|StatusWLAN=&lt;br /&gt;
|StatusGPS=&lt;br /&gt;
|StatusNFC=&lt;br /&gt;
|StatusCellular=&lt;br /&gt;
|StatusCamera=&lt;br /&gt;
|StatusCrown=&lt;br /&gt;
|StatusHands=&lt;br /&gt;
}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=954</id>
		<title>Template:WatchGalleryItem</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=954"/>
		<updated>2026-07-08T13:16:55Z</updated>

		<summary type="html">&lt;p&gt;Beroset: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;display:flex;flex-direction:column;width:155px;vertical-align:top;display:inline-block;margin-left: 1.6em;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;text-align:center;margin-bottom:6px;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:{{{Picture|}}}|150px|link={{{_pageName|}}}]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;font-weight:bold;&amp;quot;&amp;gt;{{{Model|}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;({{{Name|}}})&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;{{#rating: {{{Stars|0}}} }}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=953</id>
		<title>Template:WatchGalleryItem</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=953"/>
		<updated>2026-07-08T13:13:16Z</updated>

		<summary type="html">&lt;p&gt;Beroset: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;display:flex;flex-direction:column;width:155px;vertical-align:top;display:inline-block;margin-left: 1.6em;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;text-align:center;margin-bottom:6px;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:{{{Picture|}}}|150px|link={{{_pageName|}}}]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;font-weight:bold;&amp;quot;&amp;gt;{{{Model|}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;({{{Name|}}})&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;{{{#rating: Stars|}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=952</id>
		<title>Template:WatchGalleryItem</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=952"/>
		<updated>2026-07-08T13:10:55Z</updated>

		<summary type="html">&lt;p&gt;Beroset: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;display:flex;flex-direction:column;width:155px;vertical-align:top;display:inline-block;margin-left: 1.6em;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;text-align:center;margin-bottom:6px;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:{{{Picture|}}}|150px|link={{{_pageName|}}}]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;font-weight:bold;&amp;quot;&amp;gt;{{{Model|}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;({{{Name|}}})&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;field_Stars&amp;quot;&amp;gt;{{{#Rating: Stars|}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=951</id>
		<title>Template:WatchGalleryItem</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=951"/>
		<updated>2026-07-08T12:36:38Z</updated>

		<summary type="html">&lt;p&gt;Beroset: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;display:flex;flex-direction:column;width:155px;vertical-align:top;display:inline-block;margin-left: 1.6em;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;text-align:center;margin-bottom:6px;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:{{{Picture|}}}|150px|link={{{_pageName|}}}]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;font-weight:bold;&amp;quot;&amp;gt;{{{Model|}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;({{{Name|}}})&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;field_Stars&amp;quot;&amp;gt;{{{Stars|}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=950</id>
		<title>Template:WatchGalleryItem</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=950"/>
		<updated>2026-07-08T12:32:29Z</updated>

		<summary type="html">&lt;p&gt;Beroset: Attempt to make stars field show stars&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;display:flex;flex-direction:column;width:155px;vertical-align:top;display:inline-block;margin-left: 1.6em;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;text-align:center;margin-bottom:6px;&amp;quot;&amp;gt;&lt;br /&gt;
[[File:{{{Picture|}}}|150px|link={{{_pageName|}}}]]&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;font-weight:bold;&amp;quot;&amp;gt;{{{Model|}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;({{{Name|}}})&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;field_Stars&amp;quot;&amp;gt;{{{Stars|}}} stars&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=928</id>
		<title>Template:WatchGalleryItem</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=928"/>
		<updated>2026-07-07T19:53:56Z</updated>

		<summary type="html">&lt;p&gt;Beroset: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;display:flex;flex-direction:column;width:220px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;text-align:center;margin-bottom:6px;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;a href=&amp;quot;{{{_pageName|}}}&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;img src=&amp;quot;https://example.com/path/{{{Picture|}}}&amp;quot; style=&amp;quot;width:200px;height:auto;&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/a&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;font-weight:bold;&amp;quot;&amp;gt;{{{Model|}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;({{{Name|}}})&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;{{{Stars|}}} stars&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=927</id>
		<title>Template:WatchGalleryItem</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=927"/>
		<updated>2026-07-07T19:50:51Z</updated>

		<summary type="html">&lt;p&gt;Beroset: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;display:flex;flex-direction:column;width:220px;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;text-align:center;margin-bottom:6px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;a href=&amp;quot;{{{_pageName|}}}&amp;quot;&amp;gt;&lt;br /&gt;
      &amp;lt;img src=&amp;quot;https://example.com/path/{{{Picture|}}}&amp;quot; style=&amp;quot;width:200px;height:auto;&amp;quot; /&amp;gt;&lt;br /&gt;
    &amp;lt;/a&amp;gt;&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div style=&amp;quot;font-weight:bold;&amp;quot;&amp;gt;{{{Model|}}}&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;({{{Name|}}})&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div&amp;gt;{{{Stars|}}} stars&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
	<entry>
		<id>https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=923</id>
		<title>Template:WatchGalleryItem</title>
		<link rel="alternate" type="text/html" href="https://wiki.asteroidos.org/index.php?title=Template:WatchGalleryItem&amp;diff=923"/>
		<updated>2026-07-07T19:37:39Z</updated>

		<summary type="html">&lt;p&gt;Beroset: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- Template:WatchGalleryItem --&amp;gt;&lt;br /&gt;
&amp;lt;div class=&amp;quot;gallerybox&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;watch-image&amp;quot;&amp;gt;[[File:{{{Picture|}}}|thumb|200px]]&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;watch-name&amp;quot;&amp;gt;&amp;lt;b&amp;gt;{{{Model|}}}&amp;lt;/b&amp;gt;&amp;lt;br/&amp;gt;({{{Name|}}})&amp;lt;/div&amp;gt;&lt;br /&gt;
  &amp;lt;div class=&amp;quot;watch-stars&amp;quot;&amp;gt;{{{Stars|}}} stars&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Beroset</name></author>
	</entry>
</feed>