Skip to main content
Paradise Code
All work
A Paradise Code product2026GameMobile appWeb app or websiteInfrastructure & DevOps

Hamdor

Game night with friends, wherever you are.

35+ social games — Hokm, Shelem, Pasur and backgammon through chess and billiards — with their real traditional rules. Online with friends or offline against bots, on Android, iPhone and desktop.

Hamdor landing page
games
36
platforms, one codebase
3
web runtime (from 15 MB)
2.7MB
commits in 11 days
384

Our role

Product design, Android app, Wasm web app, game server and infrastructure

Challenge

Players use mid-range phones on unstable connections and know the local rules by heart. One game had to work offline with bots and online with fair, authoritative matches, run on three platforms, and stay connected even behind DNS filtering.

Solution

We wrote one Kotlin Multiplatform rules engine that runs on the phone (offline bots) and on the server (the authoritative referee for online matches). The UI is Compose, and the same code compiles to Kotlin/Wasm so iPhone and desktop players run it in the browser. A Ktor server over a single WebSocket with ProtoBuf messages makes reconnecting and resuming a match the default.

Features

  • 36 games in 5 categories: classics, cards, board, sports and puzzles
  • Ranked play with Elo ratings, leaderboards and private rooms by code
  • Offline play against bots at several difficulty levels, plus pass-and-play
  • Friends, in-match chat, stickers and public chat rooms
  • Payments via ZarinPal, Bale wallet, Cafe Bazaar and Myket — no gambling
  • Full admin console: live dashboard, match control, shop and revenue reports

Architecture

  1. 01

    Clients

    • Android · Jetpack Compose
    • Web · Kotlin/Wasm PWA
    • iPhone · PWA
  2. 02

    Shared core

    • KMP rules engine
    • Bots
    • Protocol · ProtoBuf
  3. 03

    Server

    • Ktor 3 · WebSocket
    • Match runtime
    • Admin · Shop · Bale bot
  4. 04

    Data & infra

    • PostgreSQL 17
    • Docker Compose
    • Caddy · precompressed assets

Engineering notes

  • 01One shared rules engine for offline bots and the server referee
  • 02A 15 MB Wasm binary ships pre-compressed with brotli to 2.7 MB
  • 03The app carries the server address itself, so it connects behind DNS filtering
  • 04The Bale bot runs inside the API process with long polling — no webhook, no extra port
  • 05Deploys take a pre-deploy backup and roll back automatically when unhealthy

Stack

  • Kotlin
  • Jetpack Compose
  • Compose Multiplatform
  • Kotlin/Wasm
  • Kotlin Multiplatform
  • Ktor
  • PostgreSQL
  • WebSocket + ProtoBuf
  • Docker
  • Caddy

Impact

  • One Kotlin codebase for Android, web and iPhone
  • Smooth on mid-range phones and weak connections
  • A healthy revenue model: cosmetics and a subscription, never gambling

Gallery

Hamdor app home
A Hokm table
Backgammon
The game library
Billiards
Cosmetic shop
Next projectParadise Desk