Skip to content
Switch branches/tags
Go to file
Cannot retrieve contributors at this time
164 lines (116 sloc) 4.92 KB

πŸ”Œ sweetd

license release

Sweet daemon for pairing and control of the Bitcoin-enabled candy dispenser


sweetd is the daemon process running on the Bitcoin-enabled candy dispenser. It manages pairing and control, which is used by the Candy Dispenser app:

The sweetd program offers the following features:

  • 🍬 Control of the motor for dispensing candy
  • πŸ“³ Control of the buzzer for user feedback
  • ☝️ React on events from the touch sensor
  • πŸ”΅ Pair through Bluetooth
  • 🌐 Set up Wi-Fi on candy dispenser
  • ⚑ Dispense candy on payments from remote lnd node
  • πŸ’… Customize name of your dispenser
  • πŸ”„ Update itself through app
  • βš™οΈ Ensure all system configs are made


Download the pre-built binary for your system from the GitHub releases page.

Extract and open the downloaded archive, then run sweetd.


The sweetd program's source code is split into small modules:

  • πŸ”Œ api - REST api for remote management of the dispenser
  • βš™οΈ app - website for managing the dispenser
  • 🍬 dispenser - orchestrator for everything the dispenser does
  • ⚑️ lightning - controller for configured Lightning nodes, remote and local
  • πŸ”©οΈ machine - hardware controller for the touch sensor, motor and buzzer
  • πŸ“Ά network - network subsystem that handles Wi-Fi discovery and connectivity
  • πŸ€Ήβ€ nodeman - node manager
  • πŸ§… onion - Tor onion service conveniences and .onion address generation
  • πŸ“² pairing - pairing controller for BLE pairing
  • πŸ’΅ pos - point-of-sale website that creates invoices
  • πŸ›‘ reboot - methods for rebooting and shutting down the system
  • πŸ“ sweetdb - persistent database manager
  • πŸ“ƒ sweetlog - logging middleware for intercepting logs
  • πŸ”– sysid - methods for determining a system-specific id
  • πŸ”„ updater - update subsystem that controls system updates

Configure data directory

By default, sweetd stores all data to ./data. You can easily override this location:

sweetd --datadir=/data/sweetd

Configure machine access

Currently, the sweetd program is only tested and executed on a Raspberry Pi. Running the executable with no options is the same as providing the following options:

sweetd \
  --machine=raspberry \
  --raspberry.touchpin=25 \
  --raspberry.motorpin=23 \

You can also mock the underlying machine with the following option:

sweetd \
  --machine=mock \

With this option, you can fake touches by sending simple HTTP requests to the mock machine:

curl http://localhost:5000/touch/on
curl http://localhost:5000/touch/off

Configure the sweetd API server

sweetd exposes a gRPC API. It can be used to configure the Wi-Fi network that the candy dispenser connects to, personalize it and change settings.

By default, the API server listens on This can be changed with the following option:

sweetd --listen=localhost:9000

It's also possible to specify multiple --listen options and listen to multiple interfaces at once.

Enable Wi-Fi hotspot pairing

At the moment, the only app pairing mechanism is through a Wi-Fi hotspot that is created by the sweetd program.

This feature needs to be activated first:

sweetd --ap

Make sure that the following dependencies are installed when running the access point mode:

hostapd wireless-tools wpasupplicant dnsmasq iw

The access point is configured with the below defaults. Any of these can be changed to your needs.

sweetd \
  --ap \
  --ap.ip= \
  --ap.interface=uap0 \
  --ap.ssid=candy \
  --ap.passphrase=reckless \

This will create a Wi-Fi network called candy with the passphrase reckless. An app will connect to that network for pairing and use the gRPC api that is provided by the sweetd program.


go get -d

cd $GOPATH/src/

go build


Releasing using goreleaser

The tool goreleaser can automatically sign the release and upload it to GitHub.

git tag -a v0.1.0 -m "Release name"

git push origin v0.1.0

goreleaser --rm-dist