An orbital physics game where you control a spaceship navigating
between planets through gravitational orbits. Complete missions,
earn stars and climb the global leaderboard!
Arcade Physics
Global Rankings
Energy System
Customizations
Download the Game
Space Travel is on Google Play, free. You can also play straight in your
browser, with nothing to install. The iPhone version has not been
released yet.
A cross-platform mobile project built with modern technologies
and professional architecture.
Main Stack
React 18 + TypeScript 5 (strict mode)
Capacitor 8 — Android 16 (target API 36); iOS in
preparation
Vite 6 + a custom 2D Canvas orbital physics
engine, no third-party game engine
Firebase — Auth, Firestore, Remote Config,
Analytics and Crashlytics
Environments: Complete separation between
production and staging — builds, Firebase project, icons and
signing key
Quality gate: 9 mandatory steps, including five
validators written for this project
Game System
Procedural Generation: Infinite levels from a
deterministic seed — every player faces exactly the same level,
with nothing stored
Orbital Physics: Geometric calculations for
arcade-style gravity and trajectories
25-level sectors: Moons, comets, black holes,
portals and orbiting systems arrive as you progress, each with its
own tutorial
Star System: 3 per mission — finish it, take no
hit, and beat the target time
Energy System: Regenerating missions with a
cooldown, tunable remotely without a store release
Hybrid Persistence
Online: Firestore as the cloud copy of the profile
Offline: Capacitor Preferences on the device — the
game is fully playable with no internet
Profiles: Anonymous and Google login, with
automatic data migration after authentication
Sync queue: Every offline operation is enqueued
under a lock and drained on reconnect
Reconciled by join, not by clock: Records by
maximum, best times by minimum. Progress never goes backwards, and
the queue can drain in any order or replay with no effect
Per-account isolation: The queue is bound to its
owner, so one session's data never lands in another account
Leaderboards
Global: Worldwide top 100, with its own weekly
ranking
Regional: Top 50 by country and by state, via
device geolocation
Per mission: Best times for each level
Privacy honoured: Players who hide their name stay
in the ranking, anonymised
Cached, deduplicated reads: Keeps usage inside the
Firestore quota, with a per-player cache key
Mobile Features
Push Notifications: FCM for the daily reward and
events, in the player's own language
AdMob: Rewarded ads for coins, with a cooldown
floor the remote panel cannot undercut
In-App Purchases: RevenueCat on top of Google Play
Billing 8
Analytics: Firebase Analytics on the native stream
+ Crashlytics
Remote Config: Economy, difficulty and energy
tunable without going through the store
Performance & UX
High Performance: Canvas 2D rendering (60–120+ FPS
depending on device), with a low-power mode
Edge-to-edge: Layout adapted to Android 16, with
safe areas handled for notch, island and gesture bar
i18n: 4 languages (PT/EN/ES/FR), 378 strings each,
verified in the quality gate
Accessibility: Per-mechanic tutorials, and the
system's reduced-motion preference is honoured
Customization
13 ship shapes and 9 colour schemes
9 trails, each with its own particle system
41 planet themes and 18 star fields, swapping as
you cross sectors
Milestone reward: Clearing sector 1 grants a ship,
so players live the swap before they ever buy one
In Development
iOS Version
The Xcode project is already in the repository. App Store release
has no date yet — which is why the button above is disabled.
CI/CD Pipeline
Automatic deployment via Bitbucket Pipelines
New Mechanics
More variety in high-level generation, where the difficulty
curve currently plateaus
Project Statistics
∞
Procedural Levels
35k+
Lines of Code
544
Automated Tests
100%
TypeScript
Test build
Alongside the public release, we keep a separate app on a closed test
track, where new features land first. It installs side by side with the
normal game and does not touch your progress. To join:
⚠️ Important:
You need to join the Google Group so the Google Play Console
recognises you as an authorised tester. Without it, the link below
answers as if the app did not exist — that is not an error, it is how
Play behaves for anyone off the list.