Open-source roulette built for mobile and desktop.
Mobile Roulette – No cash is a browser-based roulette game focused on a fast, touch-friendly table experience. It is designed for small mobile displays, tablets and desktop browsers, with no backend, account or real-money transactions.
- European and American roulette tables.
- Inside and outside bets, racetrack calls, Rebet, Double and Undo.
- Strategy creator with up to 24 saved betting layouts.
- Session statistics and score trend chart.
- Configurable music, sound effects, animation and table settings.
- Responsive layouts for desktop, tablets and small phones, including iPhone SE-sized screens.
- Installable Progressive Web App with offline-ready production assets.
- English, Italian, Spanish, Brazilian Portuguese, French, German, Korean, Japanese and Chinese interfaces.
- Local autosave plus JSON export and import from Settings.
The in-app Privacy screen uses the current language and never opens a URL. Play Console must use the single hosted index https://mobilespinroulette.pages.dev/privacy.html. The same pages also live under public/privacy/ for the itch zip and under hosting/privacy/ for Cloudflare Pages. The game uses virtual points only and provides no purchases, prizes, cash-out or accounts.
The game uses points only. A new profile starts with 2000000 score, and starting a new game restores that amount when the score is zero or below.
Choose a chip, tap the felt to place bets and press Spin. The table supports straight, split, street, corner, six-line and outside bets, plus the European racetrack calls where applicable. Saved strategies can place a complete layout in one action.
The result is independent of score and presentation settings:
crypto.getRandomValuessupplies cryptographically secure initial conditions.- Ball and wheel movement are integrated by the spin simulation until the ball drops.
- The result maps to the physical European (37-pocket) or American (38-pocket) wheel order.
- The canvas animation presents the result already selected by the engine.
Relevant files:
| File | Purpose |
|---|---|
src/spin/spinEngine.ts |
Spin simulation and result selection |
src/spin/rng.ts |
Cryptographically secure random source |
config/wheel-spin.json |
Simulation parameters and wheel order |
src/wheel/canvasWheel.ts |
Roulette wheel rendering and animation |
Requirements: a current Node.js release and npm.
git clone https://github.com/orfeomorello/OpenSource-Mobile-Spin-Roulette.git
cd OpenSource-Mobile-Spin-Roulette
npm.cmd install
npm.cmd run devOpen http://localhost:5173/. On macOS or Linux, use npm in place of npm.cmd.
npm.cmd test
npm.cmd run build
npm.cmd run previewThe production build is written to dist/. It regenerates the launcher icons and injects the complete local application shell into a versioned service-worker cache. Optional music remains on-demand and is intentionally not duplicated in offline storage.
PWA launcher assets can also be regenerated directly:
npm.cmd run generate:iconsThe manifest provides separate any and maskable PNG icons at 192 and 512 pixels, plus a 180-pixel Apple touch icon. Relative id, scope and start_url values preserve installability when the app is hosted in a subdirectory.
To create the itch.io upload package after building:
node scripts/zip-itch.mjsThis creates mobilespinroulette-itch.zip. The recommended itch.io embed size is 1024 × 600, with fullscreen and mobile-friendly options enabled.
The public product site lives in hosting/. It is the Cloudflare Pages origin https://mobilespinroulette.pages.dev/ (landing, GitHub, itch link, Play privacy pages). It does not serve the game. Refresh it with npm.cmd run generate:privacy and npm.cmd run generate:hosting, then deploy that folder as the Pages root.
| Path | Purpose |
|---|---|
src/core/ |
Game rules, payouts and player state |
src/spin/ |
Spin simulation and secure random generation |
src/player/ |
Touch betting and felt snapping |
src/persist/ |
Profile, session, settings and strategy persistence |
src/i18n/ |
Translation catalogs and locale metadata |
config/ |
Game balance, controls, bets and wheel configuration |
public/ |
PWA files, icon and optional audio assets |
hosting/ |
Cloudflare Pages vetrina + store privacy (not the game) |
playstore/ |
Play Console listing kit |
android/ |
Capacitor Android project. Application ID io.mobilespinroulette.app |
capacitor.config.ts |
Capacitor config: packages dist/, no remote URL |
LICENSE |
GNU GPLv3 text for the software |
NOTICE |
Copyright notice and third-party license map |
The application is built with TypeScript and Vite. It has no backend and does not include analytics. The Play package embeds that same dist/ folder so the APK does not depend on Cloudflare Pages.
The game files live inside the APK. Recreate the sideload package after any game change:
npm.cmd run apkThis runs the production web build, copies it into android/, and writes android-dist/MobileSpinRoulette-debug.apk.
Requirements: Android SDK platform 36 (Android Studio installs the SDK under %LOCALAPPDATA%\Android\Sdk) and JDK 21. The JBR 25 bundled with current Android Studio is too new for this Gradle wrapper. npm run apk prefers C:\Program Files\Microsoft\jdk-21.0.12.8-hotspot when present.
A public sideload build (GitHub Releases) must be a signed release APK, not the debug package:
$env:MOBILESPINROULETTE_KEYSTORE = "C:\path\to\upload-keystore.jks"
$env:MOBILESPINROULETTE_KEY_ALIAS = "upload"
$env:MOBILESPINROULETTE_STORE_PASSWORD = "..."
$env:MOBILESPINROULETTE_KEY_PASSWORD = "..."
npm.cmd run apk:releaseThat writes android-dist/MobileSpinRoulette.apk. Play Console still wants the Android App Bundle:
npm.cmd run aabThat writes android-dist/MobileSpinRoulette.aab. Do not commit the keystore. Do not change the application ID after the first Play upload. A Play install and a GitHub APK cannot update each other: Play re-signs the app.
npm.cmd run android:openopens the native project in Android Studio.
The repository includes a proposed official F-Droid build recipe in
fdroid/io.mobilespinroulette.app.yml
and the submission checklist in fdroid/README.md.
The recipe builds the web application from source, syncs it into the Capacitor
Android project and produces an unsigned release APK for F-Droid to sign.
Localized store text, the icon and screenshots are maintained under
fastlane/metadata/android/ so F-Droid can
import them directly from each tagged release.
The optional Pixabay playlist is not part of the source repository or the F-Droid build. This keeps the package free-software compliant; synthesized sound effects remain available. The Android project has no Google Services, analytics, ads, purchases or proprietary runtime dependencies.
Progress is saved automatically in browser localStorage:
| Key | Content |
|---|---|
mobilespinroulette.profile.v1 |
Persistent score data |
mobilespinroulette.settings.v1 |
Table, animation, audio and interface settings |
mobilespinroulette.session.v3 |
Current table session data |
mobilespinroulette.betTemplates.v1 |
Saved betting strategies |
mobilespinroulette.locale.v1 |
Selected interface language |
Legacy project keys are migrated automatically when found. Settings also provide a complete JSON backup and restore workflow; exported files use the mobilespinroulette-export-YYYY-MM-DD.json naming scheme.
npm run dev and npm run build automatically execute npm run prepare:audio. The script checks the tracks declared in public/audio-manifest.json, reuses valid local files and can retrieve supported assets. Missing optional music produces a warning but does not prevent the game from running.
The selectable Player playlist contains the six tracks whose filenames begin with andriih-. To provide those files from an authorized asset host, set:
$env:MOBILESPINROULETTE_AUDIO_BASE_URL = "https://your-authorized-host.example/mobilespinroulette-audio"
npm.cmd run prepare:audioThe host must expose each file using the name listed in public/audio-manifest.json. Source links, attribution and licensing notes are documented in public/audio/CREDITS.md. The playlist files keep the Pixabay Content License; they are not relicensed under the GPL.
The Mobile Roulette – No cash software is licensed under the GNU General Public License v3.0 or later (GPL-3.0-or-later). You may redistribute and modify the program under those terms.
Bundled fonts and music keep their original licenses. They are not placed under the GPL. The map is in NOTICE.
| Material | License |
|---|---|
Software (src/, config/, scripts/, built JS and CSS) |
GPL-3.0-or-later |
Synthesized sound effects in src/audio.ts |
GPL-3.0-or-later |
Inter font (src/assets/fonts/) |
SIL Open Font License 1.1 |
Menu loop mus_menu_loop.mp3 |
CC0 1.0 |
Player playlist andriih-*.mp3 |
Pixabay Content License |
The Pixabay tracks may be used commercially as part of this game. Do not sell or redistribute them as standalone audio files.
Mobile Roulette – No cash is intended for entertainment and educational purposes. It uses virtual points only and does not offer real-money gambling, purchases or prizes.
