99 Francs
sales@99francs.agency

HQ Paphos, Cyprus · worldwide

Case study · Our own product

My Chess Rating: an iPhone app and widget we built, shipped and run ourselves.

My Chess Rating puts a player’s Chess.com and Lichess ratings in one place and explains why the rating moves: a tilt check, best hours to play, openings that cost points, goals with a forecast and a weekly report every Sunday. We build products for ourselves, so we know what it takes to get one through App Store review and keep it running.

My Chess Rating on three iPhones — the My Rating screen with a Chess.com blitz rating chart in the middle, Insights timing and openings screens either side, on a dark chessboard
ProductOur own product · built and run by 99 FrancsCyprus
PlatformiPhone + home-screen widgets
StatusLive on the App Store
BuiltFeb–May 2026
StackSwiftUI, WidgetKit, Node, Postgres
Languages7 in the app
Direct answer

Our own iPhone app, widget and backend — designed, shipped and run by 99 Francs.

My Chess Rating is a native SwiftUI app with WidgetKit widgets, StoreKit 2 subscriptions and APNs push, backed by a Node and Postgres service on Railway that pulls games from Lichess and Chess.com. It went from first work in February 2026 to the App Store on 9 May 2026, and we have kept shipping since.

Why we built it

A rating says where you are, not why it moved.

Chess.com and Lichess each show a number. A player on both has two places to look, and neither says whether a bad week was tilt, the wrong hours or one opening. We wanted one screen for both sites and plain answers — and a product of our own to run end to end, from App Store review to Sunday pushes.

Native, because of the widget

The widget is what a player sees most days, so the app is Swift and SwiftUI with WidgetKit: small and medium widgets configured through an App Intent, and a Live Activity while a sync runs.

Sync on a worker, not on the phone

Sync now only queues a job. A separate worker pulls games from the public Lichess and Chess.com APIs, so the app never asks for a chess password and never waits on a slow provider.

Insights as plain maths

One SQL loader feeds small, pure calculators — tilt, best hours, openings to change, goals with a forecast. Each compares a player with their own history, so every number can be explained.

How it was built

Six steps, from the first screen to Sunday pushes.

One team did all of it: the design, the iPhone app and widgets, the backend, the App Store listing and the landing site. Nothing was handed over, because there was no one to hand it to.

01

Product and design

Work began in February 2026: what the rating screen must answer at a glance, then the app, the widgets and the paywall in one visual language.

02

iPhone app and widgets

SwiftUI app plus a WidgetKit extension. App and widget share the session through an App Group; the widget timeline refreshes every 30 minutes.

03

Backend on Railway

Node and TypeScript on Hono, with zod and jose JWTs, in front of Postgres. Moved from Supabase to Railway in April 2026: an API, a sync worker and the database.

04

Accounts and Pro

Sign in with Apple or Google, or start as a guest and merge into a real account later. Pro runs on StoreKit 2 subscriptions plus a lifetime option.

05

App Store review and release

The listing, screenshots and keywords, then review. Live on the App Store on 9 May 2026, about three months after work began.

06

Insights and push

Tilt check, best hours, openings that cost points, goals with a forecast, a localised Sunday weekly report and tilt alerts sent through APNs.

The app

The rating first, then the reasons.

The My Rating screen shows bullet, blitz, rapid and classical from either site. Insights splits into Week, Timing and Openings, and Pro unlocks the deeper cuts. Light and dark themes share one layout.

My Rating screen — a Chess.com blitz rating of 3500, up 48 in 7 days, with a rating chart and 86 wins, 3 losses and 4 draws
Insights, Week tab — a new personal best in blitz, the week's biggest study target with wins, losses and draws, and a goal and forecast card
Insights, Timing tab — best and worst hours to play, the best day and win rate by game number in a session
Insights, Openings tab — openings worth replacing and win rates per opening
The Pro paywall — monthly, yearly and lifetime plans with the yearly plan selected
My Rating screen in the dark theme — the same blitz rating chart and results
Running it

What only shows up once an app is live.

None of these appear in a design file or a first build. They surfaced because we use the app and run its backend every day, and each one is the kind of problem we now plan for in client apps.

Lock screen on a Sunday evening with two My Chess Rating notifications — a weekly blitz report with the best hours and one thing to try next week, and a new personal best in rapid
The Sunday weekly report and a personal-best push on the lock screen.

The widget stayed signed in

App and widget refresh their tokens separately, so a rotated refresh token stays exchangeable for 7 days while its session lives. Before that, the widget showed “failed to load” after a few days without opening the app.

Provider rate limits

The worker backs off on HTTP 429 and honours Retry-After, retries transient 5xx errors and throttles each provider separately, so one busy API never stalls the other.

Pushes that actually arrive

At APNs priority 5, delivery was delayed indefinitely. Alerts now go out at priority 10, and the weekly report lands on Sunday evening in the player’s own time zone and language.

Tilt alerts with restraint

A tilt push only fires when the player’s own history shows tilt in that mode, and never more than twice a week per device.

The right rating per game

Each Lichess game is stored with the rating the player had going into it — a correctness fix that keeps every chart and per-game stat honest.

Clean App Store metadata

Trademarked names are kept out of the App Store keyword field, per Apple guideline 2.3.7 — a review detail that is easy to miss on a first submission.

Landing site

The site runs on the same API.

mychessrating.app is server-rendered HTML from the same Hono service as the app’s API, animated with GSAP and Lenis, with SEO guides at /guides and an llms.txt for AI assistants.

The mychessrating.app homepage hero — Know why your rating moves, with an App Store button and the My Rating screen on an iPhone
Outcome

Live, and still shipping.

My Chess Rating is a free download on the App Store for iOS 18.6 and later. Pro costs $2.99 a month, $19.99 a year or $39.99 for lifetime access (US prices).

~3

months from first work to the App Store

Work began in February 2026; the app went live on the App Store on 9 May 2026. Version 1.0.3 went live on 29 September 2026.

7

languages in the app

English, Spanish, Portuguese, German, Italian, Russian and Ukrainian — with App Store metadata in 8 locales.

146

commits, one team

Design, iOS, backend, App Store submission and the landing site, all built and maintained by 99 Francs.

Guides

Further reading

Design → build → App Store → run

Need an iPhone app that gets through review and keeps working?

We design and build the app, the widgets and the backend, take it through App Store review and stay with it after launch — the same way we run our own.

SwiftUI · WidgetKit · StoreKit 2 · Node · Postgres
An iPhone app with home-screen widgets that puts a player's Chess.com and Lichess ratings in one place and explains why the rating moves: a tilt check, best hours to play, openings that cost points, goals with a forecast and a weekly report every Sunday.
No. It is our own product. 99 Francs designed it, built the iPhone app, widgets and backend, took it through App Store review and keeps running it. We build products for ourselves so we know first-hand what it takes to ship an app and keep it working.
Swift and SwiftUI with WidgetKit, App Intents, a Live Activity and StoreKit 2 on the iPhone. The backend is Node and TypeScript on Hono with zod and jose, on Postgres, deployed on Railway as an API, a sync worker and the database. Push goes through APNs.
From their public APIs, by username, with no chess password. Tapping sync only queues a job; a worker fetches new games, stores them and rebuilds daily summaries, backing off when a provider rate-limits it.
The app is a free download. Pro costs $2.99 a month, $19.99 a year or $39.99 once for lifetime access (US prices). It needs iOS 18.6 or later.

Yes. The same team designs, builds and ships native iPhone apps, widgets, subscriptions and the backend behind them, and takes them through App Store review. See iOS app development and mobile app design and development.