A modern, extensible remote control for OwnTone music server on Pebble smartwatches.
- View current track information (title, artist, album)
- Play/Pause toggle
- Skip to next/previous track
- Volume control (±5% increments)
- Action bar with standard Pebble music controls
- Quick navigation with long-press shortcuts
- Voice search for playlists, artists, and albums
- View search results
- Add selected items to queue (clears queue, starts playback, shuffles by default)
- Get random playlists, artists, or albums
- View results and select items
- Same queue behavior as search
- View all available outputs
- Single press on active output: Open volume controls directly (no state change)
- Single press on inactive output: Enable exclusively + open volume controls
- Long press: Toggle output on/off (no playback change)
- Per-output volume control (±5% increments)
- Pause playback from volume screen
- Pebble Time (Basalt) or compatible watch
- OwnTone server running at
owntone.local:3689 - Pebble SDK 3.x for building
- Basalt (Pebble Time): Full feature support with 64 colors
- Aplite (Pebble Classic): Full functionality with memory-optimized UI
- Voice/search hidden (no microphone)
- Black & white splash logo (96x96 PNG8)
- Memory-efficient icon loading with automatic retry
- All core features available: player, random, outputs, favorites
src/
├── main.c # App entry point
├── message_keys.h # Message protocol definitions
├── messaging.c/h # AppMessage handling
└── windows/
├── main_menu.c/h # Main navigation
├── player.c/h # Player controls
├── search.c/h # Voice search
├── random.c/h # Random selection
├── results.c # Search/random results
└── outputs.c/h # Output management
Clean command-based system with typed messages:
- Commands: GET_PLAYER_STATE, PLAY_PAUSE, SEARCH, etc.
- Callbacks: Player state, search results, outputs list
- Extensible for future features
src/js/
└── app.js # OwnTone API integration
cd owntone-remote-new
pebble build
pebble install --phone <phone-ip>Quick Navigation Long-press SELECT button (500ms) for instant navigation:
- From any menu (Main Menu, Favorites, Search, Random, Results): Jump to Player
- From Player: Jump to Outputs list
- From Output Volume window: Jump to Player
- Outputs list preserves existing behavior: Long-press toggles output on/off
This provides fast access to the player from anywhere in the app.
- Player - Current track + playback controls
- Search - Voice search by content type
- Random - Random content by type
- Outputs - Manage audio outputs
- UP button: Next track (long press: volume up)
- SELECT button: Play/Pause
- DOWN button: Previous track (long press: volume down)
- Icons update based on playback state
- Select content type (Playlist, Artist, Album) (long press: jump to Player)
- Speak your search query (Search only)
- View results
- Select an item to add to queue
- View list of outputs (shows ON/OFF status and volume)
- Single press on active output: Open volume controls directly
- Single press on inactive output: Enable exclusively + open volume controls
- Long press: Toggle output on/off
- Volume screen: UP/DOWN to adjust, SELECT to pause, BACK to return
- Fix player layout not reflowing correctly when track changes mid-playback (switch to
graphics_text_layout_get_content_size()to avoid stale layer render cache)
- Fix descender clipping on track/artist text (G, g, p, y no longer cut off) using
layer_set_clips(false)
- Player layout redesign: Dynamic text measurement using
text_layer_get_content_size()for accurate sizing - Text containers now sized exactly to rendered content height — no extra padding inside boxes
- Divider lines between track/artist/album
- Entire text block vertically centered on screen
- Overflow handling: album truncates first, then artist, then track
- Splash screen minimum display time halved (2000ms → 1000ms)
- Initial release with player controls, search, random, outputs management
- Favorites Management: Configure favorite playlists/artists/albums via web interface
- Output Defaults: Set default volumes for each output
- Track Search: Add individual tracks without clearing queue
- Queue Viewer: See upcoming tracks (next 10)
- Smart Playlists: Quick access to OwnTone smart playlists
- Add to Queue: Clears queue, starts playback, enables shuffle (except albums)
- Exclusive Output: Disables all others, enables selected, starts playback (only triggered when tapping an inactive output)
- Toggle Output: Changes state without affecting playback
- Volume Steps: 5% increments (0-100%)
- Uses JSON API endpoints
- Player:
/api/player - Queue:
/api/queue/items/add - Search:
/api/search - Outputs:
/api/outputs
Personal project - see LICENSE file
Built from scratch to replace buggy WIP implementation with:
- Cleaner architecture
- Predictable UI flow
- Extensible design
- Better UX (no blank screens!)