Shobury
A video game tracker for Android and the web. I conceived, designed and built it, and I have been shipping it on my own since 2023.
- Role
- Everything: product, design, development and publishing
- Platforms
- Android with Kotlin and Compose, and web with Next.js
- Status
- On Google Play, version 1.3.1
- Since
- 2023
What it is
Shobury helps you keep track of what you play: you log it, sort it by status and find what to play next. The Android app and the website share the same library, so what you mark on your phone shows up in the browser.
Since April 2024 the Android repository has gathered 313 commits, and the app has gone from 1.0.0 to 1.3.1.
Screens
Captures of the current version, in guest mode with a test library.
The website
shobury.com is built with Next.js and reads the same Firebase database as the app. There is one library: what you mark on your phone shows up in the browser.


Timeline
Jan 2023
First version
My own idea, with XML views.
Sep 2024
Beta 0.3
Room, Firebase Auth and sync.
Sep 2025
Version 1.0 on Google Play
Edge-to-edge and public launch.
Sep 2025 – Mar 2026
From XML to Jetpack Compose
Screen by screen, without pausing releases.
Jun 2026
Offline-first
Guest mode, stats and Steam import.
Jul 2026
Social and notifications
Friends, FCM push notifications and targetSdk 36.
Oct 2026
Shobury 1.3.1
A new brand and today's version.
Architecture
Clean Architecture with Hilt injecting every layer. The UI never talks to the network directly.
- Jetpack ComposeThe screens
- ViewModelEach screen's state, with MVVM
- Use casesThe business rules
- RepositoryA single write path
- RoomLocal data and guest mode
- Firebase Realtime DatabaseThe same library shobury.com uses
- Cloud Function and IGDBThe token kept out of the app, and the game catalog
Decisions
A single write path
Every library change goes through one repository function that writes to Room and Firebase at once, or deletes from both. Before, one screen wrote straight to the cloud: offline, the change was lost and ghost records were left behind.
Offline-first with Room
Room is the local source, with the schema at version 7 and every migration written by hand. Guest mode lives only on the phone, and when you create an account the library goes up to Firebase.
The IGDB token stays out of the app
The app asks an HTTP Cloud Function for the token, and a scheduled function renews it on the 1st and 16th of every month. No secret ships in the APK, and the app keeps working when the token expires.
From XML to Compose without stopping
Between September 2025 and March 2026 I migrated screen by screen: the list, navigation, Explore, My list, Profile and authentication, while 1.0.x and 1.1.x releases kept shipping.
Parity with the web
The rule that decides whether a game is in your library exists identically in Kotlin and in TypeScript, and the PostHog events are the same on both platforms: what you see on your phone is what you see in the browser.
What it is built with
- Android
- Kotlin, Jetpack Compose, MVVM, Clean Architecture, Hilt, Room, Retrofit, OkHttp, Coroutines, Flow, Navigation, Coil
- Cloud
- Firebase Auth, Realtime Database, Cloud Functions, Remote Config, Crashlytics, FCM
- Web
- Next.js, Tailwind and the same Firebase database
- Product
- IGDB API, PostHog, Steam library import
Contact
To talk about a project, an opportunity or something you saw here.






