Projects

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.

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.

The shobury.com home page in a desktop browser

Timeline

  1. Jan 2023

    First version

    My own idea, with XML views.

  2. Sep 2024

    Beta 0.3

    Room, Firebase Auth and sync.

  3. Sep 2025

    Version 1.0 on Google Play

    Edge-to-edge and public launch.

  4. Sep 2025 – Mar 2026

    From XML to Jetpack Compose

    Screen by screen, without pausing releases.

  5. Jun 2026

    Offline-first

    Guest mode, stats and Steam import.

  6. Jul 2026

    Social and notifications

    Friends, FCM push notifications and targetSdk 36.

  7. 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.

  1. Jetpack ComposeThe screens
  2. ViewModelEach screen's state, with MVVM
  3. Use casesThe business rules
  4. 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

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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

See the other projects

Contact

To talk about a project, an opportunity or something you saw here.