Record hydrofoil sessions with your phone's GPS and send them to yaft.site ("yet another foil tracker") for the full analysis.
- Record: pick the category, start, and pocket the phone. A foreground service logs GPS at 1 Hz with the screen off. Every fix is appended to disk right away, so a killed app resumes the same session. Stopping takes a long press.
- View: the track (on foil in ink, the rest grey) and the basic numbers, offline.
- Save: sessions stay on the phone. Signed-in riders upload them to yaft.site, or anyone can share the GPX.
- From a watch: share a GPX from the watch's app (Gadgetbridge, Zepp, a file manager) to yaft and it opens as a session: pick what you rode, then upload. The file goes up as it came, so the watch's heart rate and name reach yaft. Sharing the same track again opens the session it already is.
- History: signed-in riders see all their yaft sessions next to the phone's (from
GET /api/app/sessions, cached for offline use). A phone session deleted on the website goes back to "Not uploaded"; the phone keeps its copy.
No Google Play Services, no trackers, no networking library: GPS comes from LocationManager, HTTP from HttpURLConnection.
GET <site>/api/app/configreturns the Supabase URL and publishable key that the site uses.- The rider signs in with email and password (Supabase Auth
grant_type=password), the same account as the website. - The GPX goes to the rider's own storage folder,
tracks/<user id>/<session id>.gpx. POST <site>/api/app/sessionswith the bearer token and{ id, category, place, timeZone, fileName, allowDuplicate }. The server parses and analyses the file, takes the gear of the rider's last session of that category, and stores it. It returns 201, or 409 withduplicateOfwhen the rider already has a session that looks the same.
The phone's Doppler speed is written to the GPX's Garmin TrackPointExtension speed field, so yaft treats it like a watch's speed.
Needs JDK 21 and the Android SDK (platform 37).
./gradlew testDebugUnitTest lintDebug assembleDebugadb install -r app/build/outputs/apk/debug/app-debug.apkDebug builds allow plain HTTP to 127.0.0.1, localhost and 10.0.2.2. To try against a local yaft, run its dev server and local Supabase, then adb reverse tcp:3000 tcp:3000 and adb reverse tcp:55421 tcp:55421, and in the app choose Account → Use another server → http://127.0.0.1:3000.
- GitHub Releases: download
yaft-<version>.apkfrom Releases, or add this repo to Obtainium for updates. - F-Droid: submission planned. F-Droid will carry the same signed APK (reproducible builds), with the
NonFreeNetanti-feature, since the yaft.site server isn't open source.
Releasing, signing and the F-Droid submission are in RELEASING.md.
yaft for Android was written with Claude Code, an AI coding assistant, working with the maintainer.
GPL-3.0-only. See LICENSE.