A dark-fantasy fitness RPG for Android. Workouts become quests, reps become damage, and the village you build is made of what you actually lifted. Offline first, no account, no tracking.
翻訳待ち
スポーツ・フィットネスTypeScript · PythonGitHub @Guiforgeオンライン所有者未確認
Have you tried it? One tap is enough. No sign-in needed.
Dark-fantasy fitness RPG built with Expo, React Native and Tamagui. Offline-first on SQLite: your workouts become quests, boss fights, and a village that grows out of what you actually lifted.
翻訳待ち
Loading the full README.
Read the full README ↗Train like a hero, build like a king.
A dark-fantasy fitness RPG. Your workouts are quests, your reps are damage, and the village you build is made of what you actually lifted.
getbati.app, the site, in English, French, German, Spanish and Russian
A workout is a quest. Your reps land as damage on a boss. The muscles you actually train raise the buildings of a village that grows out of what you lifted, not out of what you bought.
Sport first, RPG second: the training logic leads and the game amplifies it. Nothing decorative gets between you and your next set.
It is built for people who train alone and lose the thread, at home, in a gym, or on a road out of town. No coach, no feed, no leaderboard, nobody to compare yourself to. The only thing keeping score is a village that can only be built by showing up.
Your training stays on your phone. No account, no servers of ours, no analytics, no ads. Your history lives in a database on the device. Three things can reach the network, each behind its own switch in Settings, all three off by default.
First, the map behind an expedition's route. Switched on, the phone asks OpenFreeMap
(OpenStreetMap data, served from tiles.openfreemap.org) for tiles, the square images a map is
made of, covering the place where you went. That request tells the host roughly where you were,
with your IP address and the time. Not the route to the metre, not the pace, not the training, not
who you are, but the area, yes. Off, the route is drawn on a plain background and nothing is
requested.
Second, Check for updates: switched on, the app asks api.github.com once a day whether a newer
version has been published, which is how a copy installed from an APK by hand finds out at all.
That request carries no identifier, downloads nothing, and the card it raises opens the release
page in your own browser.
Third, Sync my devices: switched on, each device encrypts its whole history on the phone (AES-256-GCM, with your backup key) and sends it to a WebDAV or Nextcloud server you choose, which stores bytes it cannot read. Pointed at a folder that Syncthing keeps in step instead, Bati makes no request at all.
Nothing else may open a connection: a lint rule rejects every network call written in JavaScript
outside src/updateCheck.ts and src/cloudSync.ts, so a fourth destination cannot arrive by
accident. The map is fetched natively by MapLibre, from the one host its style names. Three
switches; everything else is the architecture.
Early days. The app works end to end and is published through F-Droid, which is where its first users came from. It is not on Google Play: that account exists and has never left its internal track.
Every workout is a quest. A campaign with a story, chapters and a map. You pick the next quest, and it knows what you trained last.
Your reps land as damage. Finish a set and the boss takes the hit. The bar moves because you moved, and the fight is over when the session is.
Some sessions fight back. Boss fights close a chapter and ask for a real effort: the one session in the arc you have to show up for.
The village is made of what you lifted. Train shoulders, the forge rises. Nothing in it can be bought, skipped or rushed; every building is a receipt for work you actually did.
Some quests leave the walls. Walking, running and riding are expeditions: a session measured
in ground covered rather than repetitions. The distance comes from the app's own GPS module,
written against Android's LocationManager with no Google library anywhere near it, and the
leagues it records raise the High Road, the one building in the village that nothing you lift can
level.
Years of history, on one screen. Streaks, records, muscle balance and every session you ever finished, read from a database on your phone, with nothing to log in to.
No account, and three network destinations, all off. There is no server of ours to leak, no
analytics to opt out of, and no cloud copy of your training unless you name the server. Bati reaches
out for three things and only if you ask it to: the map behind an expedition, from
tiles.openfreemap.org, which tells that host roughly where the outing happened; a daily question
to api.github.com about a newer version, which tells it an IP address and a time; and device
sync, to your own WebDAV or Nextcloud server, which receives your history encrypted on the phone.
Nothing else leaves the phone. Privacy policy.
Bati is for people aged 16 and over.
All of this is also on the site, in English, French, German, Spanish and Russian.
This is the beginning of the README. Read the rest at the original. Read the full README ↗