How avinaxhroy/tempo works
Tempo is a local-first Android music journal and scrobbler. Playback is detected from Android media sessions, filtered and recorded as listening events, then persisted locally for history, statistics, insights, and shareable visualizations. Users can also import histories, enrich track metadata, sync browser-extension plays, and back up their library. The README documents these capabilities; sampled source supports the tracking, import, enrichment, and desktop-ingestion details shown, while unsampled subsystem links are limited to documented relationships.
Main entry points: AppDatabase.kt Room library · MainActivity.kt Android app · DesktopScrobbleIngestionService.kt Phone sync server · StatsModels.kt Stats and insights
Components 21
Playback and sync
- Playback tracking
app/src/main/java/me/avinas/tempo/service/MusicTrackingService.kt - Browser companion
browser-extension/src/background/storage.ts - Phone sync server
app/src/main/java/me/avinas/tempo/desktop/DesktopScrobbleIngestionService.kt
Library and imports
- History imports
app/src/main/java/me/avinas/tempo/data/lastfm/LastFmImportService.kt - YouTube imports
app/src/main/java/me/avinas/tempo/data/youtube/YouTubeMusicImportService.kt - Spotify history
app/src/main/java/me/avinas/tempo/data/spotify/SpotifyHistoryReconstructionService.kt - Track resolution
app/src/main/java/me/avinas/tempo/data/repository/TrackResolver.kt - Metadata enrichment
app/src/main/java/me/avinas/tempo/data/enrichment/SpotifyEnrichmentService.kt - Library management
app/src/main/java/me/avinas/tempo/data/repository/ArtistMergeRepository.kt
Insights and presentation
- Android app
app/src/main/java/me/avinas/tempo/MainActivity.kt - Stats and insights
app/src/main/java/me/avinas/tempo/data/stats/StatsModels.kt - Spotlight cards
app/src/main/java/me/avinas/tempo/ui/spotlight/SpotlightScreen.kt - Home widgets
app/src/main/java/me/avinas/tempo/widget/TempoAppWidget.kt
Local data and services
- Listening repository
app/src/main/java/me/avinas/tempo/data/repository/ListeningRepository.kt - Room library
app/src/main/java/me/avinas/tempo/data/local/AppDatabase.kt
Backup and privacy
- Backup and export
app/src/main/java/me/avinas/tempo/data/drive/GoogleDriveService.kt - Privacy diagnostics
app/src/main/java/me/avinas/tempo/data/diagnostics/DiagnosticsReport.kt
Other components
- Listener
- Music players
- Music metadata APIs
- Google Drive
Connections 31
- Listener → Android app: uses
- Music players → Playback tracking: play sessions
- Playback tracking → Listening repository: records plays
- Listening repository → Room library: persists events
- Android app → Listening repository: queries history
- Android app → Stats and insights: requests metrics
- Stats and insights → Room library: reads history
- Android app → Spotlight cards: opens cards
- Spotlight cards → Stats and insights: uses metrics
- Home widgets → Stats and insights: shows summaries
- Listener → History imports: selects history
- History imports → Room library: imports plays
- Listener → YouTube imports: selects export
- YouTube imports → Track resolution: resolves tracks
- YouTube imports → Room library: stores events
- Spotify history → Music metadata APIs: fetches history
- Spotify history → Track resolution: resolves tracks
- Spotify history → Room library: stores history
- Metadata enrichment → Music metadata APIs: fetches metadata
- Metadata enrichment → Room library: updates metadata
- Android app → Library management: manages library
- Library management → Room library: updates records
- Browser companion → Browser companion: queues plays
- Browser companion → Phone sync server: syncs plays
- Phone sync server → Track resolution: resolves tracks
- Phone sync server → Listening repository: records plays
- Phone sync server → Room library: stores tracks
- Android app → Backup and export: starts backup
- Backup and export → Room library: exports library
- Backup and export → Google Drive: uploads backup
- Android app → Privacy diagnostics: shares report