I began contributing to Amazfish and Infinitime after receiving a PineTime as a birthday gift. PineTime has relatively basic specifications: it has a 64 MHz processor, 64Kb of memory, and 4MB of storage. It also comes with an accelerometer, a heart rate sensor, and Bluetooth with low energy usage (BLE).

The features you get are determined by what the operating system (OS) and companion application can do together. If the companion app works with more types of devices, then some features are usually only available for specific devices. In this case, it’s InfiniTime, the smartwatch operating system (OS). Amazfish, the companion app, was originally designed for SailfishOS, but since my daily driver is a Volla Phone with Ubuntu Touch, it needed to be ported to work. Although Amazfish supports a wide range of features, PineTime, unfortunately, only has access to a limited set of them. For a detailed exploration of which features are available, you can refer to a helpful blog post by Nico Cartron.


The initial pairing process appears to have some bugs. The app itself cannot manage the turning on and off of the interface, so users must control it through the settings application. However, please be aware that controlling it through the Ayatana indicator is not the same as using the settings application.

Troubles may arise when pairing smartwatches that have been running for a few days, so it is recommended to reboot them before starting the pairing process.

Within the application, you need to navigate to the pairing page and then select the device. If you don’t see the list of devices, you may need to toggle Bluetooth on and off, and then return to the list of smartwatch brands to select your smartwatch again.

Additionally, the application does not check whether Bluetooth is enabled on its own. Furthermore, there are occasional disconnections between the smartwatch and the device. Ideally, the connection should remain stable at all times. It’s not clear whether this issue originates from Volla Phone, Ubuntu Touch, Amazfish, InfiniTime, or PineTime. It could be a hardware bug or a software-related problem within the stack.


The notification feature works quite well. There have been improvements in transliteration and separating the title from the message.

There is an ongoing pull request that should extend the transliteration feature to work with other devices as well.


The SailfishOS interface is currently not compatible with Ubuntu Touch, resulting in the absence of the call feature. In both cases, the use of dbus is expected for call functionality. While the com.lomiri.TelephonyServiceApprover can be used to accept or reject phone calls, it appears to be challenging to detect incoming calls by itself. Sailfish OS utilizes org.nemomobile.voicecall.VoiceCall for this purpose. It seems that ofono or telepathy must be used to achieve this functionality, with Telepathy providing a more dynamic interface. Any assistance in this matter would be greatly appreciated.

Perhaps the source codes of other projects such as RockWork, Audio Recorder or Parabola could be useful in addressing this issue.

Synchronization of steps, heartrate and activities

Infinitime it self doesn’t store data about that and doesn’t provide ble service to download those data for certain time period. There is discussion about that feature. However, real time data are streamed and shown when changed. The Amazfish daemon have last heart rate value, but the API passes this value to UI only when it is changed.

Another approach to capture at least a portion of this data is by storing changes as they arrive. However, this means that your data won’t be stored if you go cycling without your phone. There is already a proof-of-concept implementation that captures everything transmitted via BLE. However, this data arrives at random intervals when the smartwatch wakes up, and it’s quite sparse. A potential solution would involve implementing a fitness data protocol or a data sampler, similar to what the Gadgetbridge companion app uses, to prevent having numerous data samples within the same minute.

To reach continuous data from heart rate monitor sensor (HRM) must Infinitime implement background job which wakes up the device periodically.

One picture displays real-time data from the steps counter and HRM, while the other illustrates the proof-of-concept output derived from recorded immediate HRM samples. The third picture shows the analysis page.

In addition, there should be a classifier to identify various activities such as sitting, cycling, running, walking, and sleeping, among others. This would require implementing a model, such as LSTM, in a memory and CPU-efficient manner and training it on data obtained from the device. It’s essential to consider the sample rate to minimize wake-ups and keep battery consumption low. This certainly presents a challenging research task.

Calendar sync

Infinitime doesn’t provide a calendar interface, but Amazfish injects calendar events through the notification API. Currently, there’s a bug where notifications are created when the event starts, instead of when the reminder is set, as expected. However, calendar events do not appear when the Bluetooth connection is disconnected.

Firmware upload

The firmware upload functionality works as expected.

Battery status

One of the recently implemented features is the battery level information. Additionally, there’s a pull request that aims to store battery information in a database. The daemon only saves the value into the database when it changes. The challenge lies in treating it as a new value after each restart of the daemon, such as when the app is reinstalled or the device is rebooted. This raises questions about how the graph component functions, as a large number of identical battery level changes can affect the angle of the line in the graph.

Navigation notifications

Infinitime and Amazfish have implemented the notification feature based on the code. The notifications come from PureMaps, which is also available on Ubuntu Touch. However, testing this feature has proven to be challenging at the moment. The upcoming Ubuntu Touch OTA-3 update is expected to bring a faster fix for GPS-related issues. The main challenge during tests is related to wearing a cast on the leg.

Music control

The remote control of the music player works well as Ubuntu Touch implements the same Mpris interface as SailfishOS. However, there are minor requested improvements for enhancing the user experience, particularly in Infinitime.

Weather synchronization

Amazfish uses the openweathermap.org API for weather synchronization. However, its settings dialog can be quite unclear in terms of user experience. It is not possible to recognize which city is currently set and whether weather data has been successfully loaded from the internet. Furthermore, there is an ongoing pull request aimed at adding this feature to the digital watch face. The weather can only be displayed on the PineTimeStyle watch face, but it needs to be enabled in the watch face settings. Additionally, there appears to be a memory leak related to the weather feature in Infinitime’s source code. It’s worth noting that there have been many commits in Infinitime recently.

Desired features

In the Infinitime repository, there are approximately 150 pull requests. The oldest among them has been open for over two years and pertains to a gallery application that should allow users to display custom images, including barcodes and QR codes.

Numerous user experience improvements have been proposed, including the addition of an alarm clock indicator in the status bar, automatic switching to the battery app during charging, a calculator app, a persistent alarm that survives reboots, find my phone feature, configuration options accessible from the companion app, linker time optimizations, and a timing improvement aimed at reducing wake-up duration.

Amazfish has already implemented some of these features for other smartwatches. For instance, remote configuration is already available. Additionally, it’s possible to achieve a remote shutter function using a custom script.

On the other hand, Infinitime excels in continuous integration, and it would be great to have a similar level of automation in Amazfish. With three independent user environments, including SailfishOS, Ubuntu Touch, and generic Qt, and compatibility with 10 different types of smartwatches, the application is split into a UI part and a daemon. Furthermore, the code is well-structured, making it possible to estimate the impact of changes. Nevertheless, having a comprehensive continuous integration system that provides exact information would be an invaluable addition.


Long story short …

PairingNot perfect
CallsDoesn’t work
Sync steps/Heartrate✓ (dummy PoC)
Sync Activities×
Calendar sync×
Firmware upload
Battery status
Navigation notifications~
Music control
Sync time
Sync weather
Remote controlDesired
Remote configurationDesired
Gallery applicationDesired


By Jozef Mlích

Software Developer at GreyCortex, NemoMobile contributor, Micro light aircraft pilot, OpenAlt Conference organizer