Skip to main content
Photo from unsplash: csmc-mobile.png

CSMC Mobile — CS2 skin tracker for iOS & Android

React Native (Expo) client for csmarketcap.com — portfolio, trade-up calculator, Steam GC bridge for Case Move, and iOS home-screen widgets.

––– views

Work Project


Overview

CSMC Mobile is the iOS and Android client for csmarketcap.com — the CS2 skin price tracker we're building at Kolikosoft. The app brings the full web experience to the phone: market browse, real-time prices, portfolio P&L, trade-up odds, deal alerts, and a Steam Game Coordinator bridge that drives the Case Move flow entirely from the device.

Tech Stack Used

Highlights

  1. Expo SDK 54 + React Native 0.81 + expo-router — file-based routing with tab + modal stacks across markets, portfolio, trade-up, case move, deals, and community.
  2. GraphQL — single thin client in lib/api.ts. No Apollo, no react-query — small surface, less to learn, easier to reason about cache invalidation.
  3. Embedded Node.js runtimenodejs-mobile-react-native runs a Node process inside the app binary that speaks the Steam Game Coordinator protocol directly. That's how Case Move works without ever round-tripping through a server.
  4. iOS Widgets via SwiftUI + WidgetKit — built with @bacons/apple-targets. Two widgets ship today: Market Cap (live total CS2 market valuation) and Portfolio (your holdings P&L) — both refresh in the background and respect Apple's stricter timeline budgets.
  5. react-native-svg over Skia — lighter binary, faster cold-start, plenty fast for the chart workloads we have.
  6. expo-secure-store for secrets only — auth tokens, Steam refresh credentials. Everything else lives in in-memory caches; nothing sensitive gets written to disk twice.

Architecture

app/                  expo-router routes (tabs + modal stacks)
  (tabs)/             markets, portfolio, trade-up, case move, deals, community
  portfolio/          holding detail, picker, manager, settings, share, sync, …
  casemove/           connect, browse, from/to storage units, rename
  skin/[id].tsx       skin detail
components/           shared UI
  primitives/         design-system primitives (the new system)
  ui.tsx              legacy primitives — being phased out
lib/                  api client, auth, push, image utils, widget bridge
nodejs-assets/        Node.js script bundled into the iOS/Android binary (Steam GC)
targets/csmc-widgets/ iOS Widget Extension (SwiftUI / WidgetKit / AppIntents)

Two different Node.js versions live in the project: the host Node (≥ 22) that drives Metro and the Expo CLI on the developer's machine, and the embedded Node runtime (18) that ships inside the binary. They are unrelated — different machines, different responsibilities.

Status

In active development at Kolikosoft. Public release coming once we finish the design-system migration and the Case Move flow ships behind a feature flag.