Skip to content
/ munin Public

Munin time tracker is a subscription free physical dice-like device that can be used to track time usage for different tasks.

License

Notifications You must be signed in to change notification settings

andli/munin

Repository files navigation

🐦‍⬛ Munin

Munin helps you track time for different tasks during your work day. Each face represents a different activity — just flip the cube to start logging time for a specific task (ex. "Product support", "Emails", "Coding" etc). Add labels to each side if you want.

  • 3D-printed
  • Bluetooth connected
  • Subscription-free (unlike for example Timeular and EARLY)
  • Hackable

Depending on usage, battery time should be 2-8 weeks.

Munin mockup

Hardware

The device consists of a 3d printed translucent enclosure, a single board for control and connectivity, plus a battery.

  • 3D-printed translucent enclosure (STL to come)
  • Seeed XIAO nRF52840 Sense — BLE + IMU + USB-C microcontroller
  • LiPo battery (3.7 V, EEMB 803030 with PCM)
  • SK6812 mini LED. Other LED drivers may be added in the future.

Total cost of components is something like 40€ at the moment. Could be lowered significantly but that would make assembly much more cumbersome.

LED feedback

The internal LED provides status feedback:

  • 🌈 Face switch confirmation (short glow in configured color)
  • 🟥 Low battery (pulsing red)
  • 🟩 Charging (pulsing green) and fully charged (steady green)

Software

The Munin time tracker has, besides its own firmware, a systray client app that handles connectivity, configuration and writes to a log file. The app is based on python and bleak and will work on macOS, Windows and Linux. It will not require root and will probably be distributed using something like pipx install munin-client. We shall see.

Munin systray

Log file format

~/munin_time_log.csv

timestamp,face_id,face_label,duration_s
2025-08-20T15:59:15.847411,6,Off,8.0
2025-08-20T15:59:23.875021,5,Break,4.0
2025-08-20T15:59:27.901076,2,Coding,18.0
2025-08-20T15:59:45.933763,3,Meetings,30.0
2025-08-20T16:00:15.970091,2,Coding,2.0
2025-08-21T15:51:53.807371,2,Coding,1332.3
2025-08-21T16:14:06.146382,1,Emails,11.2
2025-08-21T16:15:44.557220,1,Emails,10.0
2025-08-21T16:35:39.860765,1,Emails,22.0
2025-08-21T16:36:01.859839,2,Coding,4.1
2025-08-21T22:15:41.733766,1,Emails,87.5

Configuration

  • Label and color for each side.
  • Time log file location

Face colors (and labels) can be configured via the tray Settings UI ("Settings…") or by editing ~/.munin/config.json directly. The client automatically sends the configured colors to the device when connecting.

Each face can be customized with any color and label. See config.example.json for the default configuration values.

The device will flash the configured color briefly when switching faces.

Configuration Persistence

Client-side: Your color preferences are saved in the client configuration file (~/.munin/config.json) and persist across client restarts.

Device-side: The XIAO nRF52840 device stores color configurations in volatile RAM only. This means:

  • Color settings are sent from the client to the device each time they connect via Bluetooth
  • If the device is power-cycled or reset while disconnected from the client, it will revert to built-in default colors until the client reconnects and sends the current configuration
  • For normal usage where the client runs continuously, this provides seamless color persistence

Settings UI

Open from the tray icon → "Settings…". Features:

  • Edit face labels
  • Edit face colors (hex #RRGGBB)

Config writes are atomic; the running tray process detects external changes and pushes updates live without restart.

Dev

Client App

Run locally:

source .venv/bin/activate
python -m munin_client

Or with pipx: pipx run --spec . munin-client

Firmware Development

Using the xiao_ble_nrf52840_sense.dts board definition.

Build firmware:

cd ./zephyr_workspace && source zephyr/zephyr-env.sh && cd munin_app && west build -p always -b xiao_ble/nrf52840/sense .

Deploy firmware:

  1. Double-click reset button on XIAO to enter bootloader mode
  2. From ./zephyr_workspace/munin_app, Run: ./flash.sh (or drag build/zephyr/zephyr.uf2 to XIAO-SENSE drive)

Zephyr info

Battery life is more important than detecting a face change quickly and moreover the Munin should not change face that easily in case one accidentally rotate it or fiddle with it.

Roadmap

Client app

  • ✅ Log face change to log file (CSV format as specified above)
  • ✅ Handle device reconnection when connection is lost
  • ✅ Test client app on Windows
  • ✅ Show current face in menu
  • Implement a Settings UI in system tray for:
    • ✅ LED colors
    • ✅ Face labels
    • preferred device selection/pairing
  • ✅ Add systray icon for disconnected state
  • Implement a basic view for time tracking statistics and reports
  • Make the tray menu update while it is open
  • Add firmware update menu item and function

Munin device

  • ✅ Get BLE working
  • ✅ Get IMU sensor working
  • ✅ Light up LED on face change
  • ✅ Implement real battery voltage reading (ADC)
  • ✅ Broadcast battery level periodically
  • ✅ Receive LED configuration from client
  • ✅ Broadcast face change only on movement
  • ✅ Add on/off button and reset button
  • ✅ Stronger LED than the builtin one needed - add an SK6812
  • ✅ Add firmware support for using the SK6812
  • Add charging status detection and fix voltage being all wrong
  • LED support for low battery
  • Power saving mode - "sleep" and wake on movement
  • Optimize BLE connection parameters for battery life

3d print

  • ✅ Test print enclosure in PETG
  • ✅ Create mount points
  • ✅ Confirm snap-in lid
  • Add a latch to lock the usb-c port in place

Protocol & Infrastructure

  • Create proper installer/packaging for client app
  • Write a manual
  • BLE initial pairing
  • Implement device firmware update mechanism

About

Munin time tracker is a subscription free physical dice-like device that can be used to track time usage for different tasks.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages