A lightweight Wear OS timer app designed for silent operation — vibrates without ringing.
✅ Silent: Vibrates instead of ringing.
✅ Halftime alert: Option to buzz briefly at halftime.
✅ Ambient mode: Supports countdown in ambient mode.
✅ Complication: Includes a watchface complication.
✅ Minimalist UI: Designed for Wear OS with a simple interface.
I developed this app for personal use because of features I missed in the default Pixel Watch timer app. The goal is to keep it simple and similar to the default timer. Features I wanted in my timer app:
- Silent operation: Vibrate without ringing when the timer expires.
- Halfway alert: Brief reminder when the timer is halfway (e.g. for cooking).
- Ambient mode: See the countdown when the watch is in ambient mode.
The app currently supports Wear OS 4.0 and above.
There are two ways to install the app on the device:
- Join the beta test to download it directly from the Google Play Store.
- Sideload it on the device.
- Join the Google group to be automatically added to the testers list: https://groups.google.com/g/closed-testing-silent-timer
- Join the beta: https://play.google.com/apps/testing/com.github.vmsteiner.silenttimer
- When installing the app be sure to select your watch as the target device (and not your phone, or you will get an error)
The sideloading guide below is based on a Pixel Watch 2 running Wear OS 5.1 and a Windows PC.
- Download the prebuild APK file from releases (or build it yourself)
- Open Settings
- Tap System > About > Versions
- Tap the Build number seven times to enable developer options
- Go back to Settings
- Tap Developer options
- Enable "ADB debugging"
- Download the SDK Platform Tools provided by Google
- Extract the .zip
- Connect the watch charger to a USB-C port from your PC (Pixel Watch 2 and up)
- Put your watch on the charger and unlock it with PIN
- A pop-up should appear "Allow Debugging". Select OK.
- (If no Pop-Up appears disable and enable "ADB debugging" from Step 2 while connected to the PC)
- Open a Terminal in the folder where you extracted the SDK Platform Tools in Step 3
- Run the following command:
.\adb install "Path\to\the\downloaded\silenttimer.apk" - Success🎉🎉
- Disconnect the watch from PC
- Disable "ADB debugging" from step 2
- Delete the .zip and the extracted folder from step 3
📦 silenttimer
┣ 📂 presentation
┃ ┣ 📂 receiver # Broadcast receivers for timer events
┃ ┣ 📂 service # Timer and complication services
┃ ┣ 📂 theme # App-wide theming and styles
┃ ┣ 📂 ui # UI Screens (Timer Setup, Timer Display)
┃ ┣ 📂 utils # Utility functions (e.g. time formatting)
┃ ┣ 📂 viewmodel # ViewModels for state management
┃ ┗ 📜 TimerApp.kt # Application class for global setup
┣ 📜 Navigation.kt # Handles app navigation
- Ensures global setup before any component (like activities or services) is created.
- Creates a notification channel for timer-related notifications used throughout the app.
- The entry point of the app.
- Requests permissions and updates complications on launch.
- Sets up the Wear OS Material Theme.
Handles screen navigation using SwipeDismissableNavHost. Automatically switches between:
TimerSetupScreen(when timer is inactive)TimerDisplayScreen(when timer is running)
- Lets users select a countdown time.
- Starts the TimerService when confirmed.
- Shows the remaining time.
- Allows stopping the timer.
- Has a horizontal page to access the settings
- Supports Wear OS Ambient Mode for low-power display.
- Runs a foreground service to handle the countdown.
- Manages wake locks to prevent sleep mode.
- Handles vibration alerts when the timer reaches zero.
- Updates watchface complications when timer state changes.
- Provides a Wear OS complication for the countdown timer.
- Displays remaining time directly on supported watch faces.
- Receives broadcast intents for timer events (halftime and finish).
- Starts the
TimerServiceto handle the events.
- A singleton that manages the timer's lifecycle (start/stop).
- Exposes the timer state via a
StateFlowfor reactive UI updates across the app and complications.
- A data class representing a consistent snapshot of the timer (running status, duration, and end time).
- Uses
SystemClock.elapsedRealtime()to ensure accuracy and survival across device sleep/Doze states.
- Stores the selected countdown time before starting the timer.
- Contains helper functions, including time formatting.
- Manages application-level settings using Jetpack DataStore.
- Defines the Wear OS Material Theme for consistent styling.
- Declares permissions, services and the app’s entry points.
GNU General Public License v3.0
Want to contribute? Pull requests and issues are welcome! 🎉
Google Horologist: Used for the TimePicker and AmbientAware Composables.




