Skip to content

Tricked-dev/SolidVerdant

Repository files navigation

SolidVerdant

GitHub Downloads (specific asset, latest release) Static Badge Add to Obtainium

Modern Android time tracking client for Solidtime

A native Kotlin/Jetpack Compose Android application that connects to Solidtime for secure, OAuth2-based time tracking on mobile devices.


Features

Time tracking

  • Start/stop time entries with a live elapsed timer
  • Pause and resume active timers
  • Select projects and tasks from searchable dropdowns
  • Add descriptions, tags, and billable status
  • Continue the most recent completed entry
  • Edit or delete past time entries
  • View history grouped by date, with identical entries collapsed into expandable groups
  • Pull-to-refresh to sync with the server
  • Switch between all organizations available to your Solidtime account

Android integration

  • Quick Settings tile - Start/stop tracking without opening the app, with project and task selection
  • Persistent notification - Shows elapsed time with pause and stop controls
  • Notification quick start - Start a timer with project, task, and description selection directly from the idle notification
  • Home-screen widget - View tracking state and access quick controls
  • Boot persistence - Restores notification state after reboot

Auth and configuration

  • OAuth2 with PKCE (no API keys needed)
  • Automatic token refresh
  • Custom server endpoints and OAuth client IDs
  • Server details available in the settings drawer with tap-to-copy
  • Encrypted token storage

UI

  • Material 3 with Material You dynamic colors (Android 12+)
  • Dark and light themes follow system settings
  • Edge-to-edge display with predictive back gesture support (Android 13+)
  • Available in English, Dutch, and Japanese + any language you want if you create a pull request

Quirks

  • The Quick Settings tile state won't sync with changes made on the web or desktop unless the app is open. Not a problem if you only use the tile and app.

Screenshots

Time tracking history Active time tracking Edit a time entry

Quick Settings tile Start from the Quick Settings tile Tracking notification

History • Active Timer • Edit Entry • Quick Settings • Start Entry • Notification

Tech Stack

Core Technologies

  • Language: Kotlin
  • UI Framework: Jetpack Compose with Material 3
  • Architecture: MVVM with Clean Architecture
  • Dependency Injection: Hilt
  • Networking: Retrofit + OkHttp
  • Serialization: Kotlinx Serialization
  • Async: Kotlin Coroutines + Flow
  • Storage: DataStore Preferences with Android Keystore-backed AES-GCM encryption for OAuth secrets

Key Libraries

  • Jetpack Compose - Declarative UI framework
  • Hilt - Dependency injection
  • Retrofit - Type-safe HTTP client
  • OkHttp - HTTP interceptors and authentication
  • Kotlinx Serialization - JSON serialization
  • DataStore + Android Keystore - Tokens and transient PKCE values are encrypted with AES-GCM; non-secret app settings remain ordinary preferences
  • Custom Tabs - Secure OAuth browser flow
  • Timber - Logging

Configuration

By default, SolidVerdant connects to the official Solidtime instance at https://app.solidtime.io. To configure a custom server:

  1. Launch the app
  2. On the login screen, tap the settings icon (⚙️) in the top bar
  3. Enter your custom server endpoint and OAuth client ID
  4. Tap "Save"

Default Configuration:

  • Server Endpoint: https://app.solidtime.io
  • Client ID: 9c994748-c593-4a6d-951b-6849c829bc4e

Selfhosted

run docker exec solidtime-scheduler php artisan passport:client --name=desktop --redirect_uri=solidtime://oauth/callback --public -n

Usage

Goal of this application is to have a easy to use tile to start and stop tracking, this application does everything i need it to but pullrequests for other features are welcome, forking is fine too

  1. Login: Tap "Login with OAuth2" to authenticate via your Solidtime account
  2. View Tracking: See your current time entry with live elapsed time
  3. Switch Organization: Tap the organization name in the header while no timer is active
  4. Refresh: Pull to refresh or tap the refresh button to update tracking state
  5. Logout: Open the navigation drawer and tap logout to clear all data and return to login screen

Building for Production

Debug Build

./gradlew assembleDebug

Build Variants

  • Debug (app-debug.apk) - Includes logging, no minification, package suffix .dev
  • Release (app-release.apk) - ProGuard enabled, resources shrunk, signed for distribution

Testing

Run unit tests:

./gradlew test

Run instrumentation tests:

./gradlew connectedAndroidTest

Verification

You can verify the authenticity of SolidVerdant APKs using the signing certificate hash below. This works with AppVerifier or Obtainium's built-in verification.

Field Value
Package ID dev.tricked.solidverdant
SHA-256 Signing Certificate 7A:38:2F:E9:14:1B:D3:DC:A4:C4:82:20:7F:FF:12:5A:82:8D:66:92:C4:0E:5A:BC:30:61:6C:33:15:C7:F3:64

You can also view this information in-app via Settings > About > Verification Info.

Links

Acknowledgments


Made with ❤️ (and almost entirely Claude) for the Solidtime community

About

ANDROID SOLIDTIME APP - Easily manage your solidtime time tracking using a android tile

Topics

Resources

License

Stars

8 stars

Watchers

0 watching

Forks

Contributors

Languages