You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Arsen Musayelyan 419b2f5a79 Break transfer loops after refreshing progress bar 2 weeks ago
cmd Break transfer loops after refreshing progress bar 2 weeks ago
internal/types Add GUI frontend 3 weeks ago
.gitignore Add GUI frontend 3 weeks ago
.gitm.toml Add gitm for mirroring 3 weeks ago
LICENSE Initial Commit 3 weeks ago
Makefile Add uninstall rule to makefile 3 weeks ago Mention GUI in README 3 weeks ago
config.go Fix debug config paths 3 weeks ago
go.mod Add GUI frontend 3 weeks ago
go.sum Add GUI frontend 3 weeks ago
itd.service Initial Commit 3 weeks ago
itd.toml Fix indentation in config 3 weeks ago
main.go Add config defaults and run go fmt 3 weeks ago
music.go Add config defaults and run go fmt 3 weeks ago
notifs.go Create new config format 3 weeks ago
socket.go Add GUI frontend 3 weeks ago


InfiniTime Daemon

itd is a daemon that uses my infinitime library to interact with the PineTime running InfiniTime.

Build status Binary downloads AUR package


  • Notification relay
  • Music control
  • Get info from watch (HRM, Battery level, Firmware version)
  • Set current time
  • Control socket
  • Firmware upgrades


This daemon creates a UNIX socket at /tmp/itd/socket. It allows you to directly control the daemon and, by extension, the connected watch.

The socket accepts JSON requests. For example, sending a notification looks like this:

{"type": "notify", "data": {"title": "title1", "body": "body1"}}

It will return a JSON response. A response can have 3 fields: error, msg, and value. Error is a boolean that signals whether an error was returned. If error is true, the msg field will contain the error. Value can contain any data and depends on what the request was.

The various request types and their data requirements can be seen in internal/types. I can make separate docs for it if I get enough requests.


This daemon comes with a binary called itctl which uses the socket to control the daemon from the command line. As such, it can be scripted using bash.

This is the itctl usage screen:

Control the itd daemon for InfiniTime smartwatches

  itctl [command]

Available Commands:
  completion  generate the autocompletion script for the specified shell
  firmware    Manage InfiniTime firmware
  get         Get information from InfiniTime
  help        Help about any command
  notify      Send notification to InfiniTime
  set         Set information on InfiniTime

  -h, --help   help for itctl

Use "itctl [command] --help" for more information about a command.


In cmd/itgui, there is a gui frontend to the socket of itd. It uses the fyne library for Go. It can be compiled by running:

go build ./cmd/itgui


Info tab

Notify tab

Set time tab

Upgrade tab

Upgrade in progress

Interactive mode

Running itctl by itself will open interactive mode. It's essentially a shell where you can enter commands. For example:

$ itctl                        
itctl> fw ver
itctl> get batt
itctl> get heart
92 BPM
itctl> set time 2021-08-22T00:06:18-07:00
itctl> set time now
itctl> exit


To install, install the go compiler and make. Usually, go is provided by a package either named go or golang, and make is usually provided by make. The go compiler must be version 1.16 or newer for the io/fs module.

To install, run

make && sudo make install


To start the daemon, run the following without root:

systemctl --user start itd

To autostart on login, run:

systemctl --user enable itd

Cross compiling

To cross compile, simply set the go environment variables. For example, for PinePhone, use:

make GOOS=linux GOARCH=arm64

This will compile itd and itctl for Linux aarch64 which is what runs on the PinePhone. This daemon only runs on Linux due to the library's dependencies (dbus, bluez, and playerctl specifically).


This daemon places a config file at /etc/itd.toml. This is the global config. itd will also look for a config at ~/.config/itd.toml.

Most of the time, the daemon does not need to be restarted for config changes to take effect.