BikeControl (SwiftControl)
Use Zwift Click, Zwift Play, Shimano Di2, or any Bluetooth controller with MyWhoosh, Rouvy, Zwift, and more. Free to try on iOS, Android, Windows, and macOS.
View live altitude, speed, and log jumps for skydiving
AI summary · website content
Sports & fitnessJavaScript · HTMLGitHub @envizioOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗A Leading Edge web app for wingsuit pilots with a FlySight 2. It connects over Bluetooth and shows live GPS and barometric altitude. It can also import jumps from the FlySight (or a TRACK.CSV file) and check them against the acrobatic exit rules of the FAI ISC Wingsuit Flying Competition Rules (2026 edition).
It is a plain static site with no build step and no server code. It installs as an app and works offline once it has been opened.
Use it at https://envizio.github.io/le-altitude/.
The software and documentation are licensed under the GNU Affero General Public License, version 3 only. The complete terms are in LICENSE. If you run a modified version as a network service, AGPL-3.0 section 13 requires offering its Corresponding Source to users interacting with it remotely.
The Leading Edge name, wordmark, logos, and other trademarks are not licensed by AGPL. In particular, logo-light.webp, favicon.svg, favicon.ico, favicon-192.png, favicon-512.png, and apple-touch-icon.png are brand assets and are not covered by the project license.
The fonts in fonts/ (Anton, Archivo and JetBrains Mono) are under the SIL Open Font License 1.1. Their copyright notices and license are next to them in fonts/*-OFL.txt; keep those files with the fonts when redistributing.
Contributions are submitted under AGPL-3.0-only. By opening a pull request, you confirm that you have the right to submit the contribution under those terms. See CONTRIBUTING.md for the project workflow.
Issues and pull requests are welcome at the GitHub repository. Describe the behavior affected and the checks you ran in the pull request, and keep changes focused.
Live tab
Jumps tab
Jumps are stored in the browser's IndexedDB. Settings and saved dropzones are stored in localStorage. Nothing leaves the device.
The app needs Web Bluetooth: Chrome on Android, desktop Chrome or Edge, or the Bluefy browser on iPhone. Safari and Firefox do not support it. To rejoin the last FlySight after a reload without the device picker, Chrome's persistent Bluetooth permissions must be on.
The FlySight talks to one device at a time, so disconnect any other phone or laptop first. On a device it has not paired with before, put the FlySight in pairing mode and accept the pairing prompt.
Track downloads need the FlySight's card to be free. If it is logging, the app offers to put it to sleep. A FlySight that is plugged into USB, or in config or start mode, has to be unplugged or switched off first.
Serve the folder with any static file server, for example:
python3 -m http.server 8000
Then open http://localhost:8000. Web Bluetooth and the service worker only work in a secure context: localhost is fine, but any other host needs HTTPS. To try it on a phone, deploy it or tunnel to it over HTTPS.
The site is served by GitHub Pages from the root of main, so every push to main goes live. There is nothing to build, and any other static host that serves HTTPS works the same way.
The service worker (sw.js) caches the app so it opens with no signal. When you change a file:
CACHE in sw.js (for example le-live-v21 to le-live-v22) so phones fetch the new version, and bump the LE LIVE v21 label in index.html to match. The label shows on the Live tab until a FlySight connects, so you can see which version a phone is running.FILES in sw.js.Open copies of the app reload themselves when a new version takes over, unless they are connected to a FlySight.
| File | Contents |
|---|---|
index.html | Markup and styles for every screen |
app.js | Live Bluetooth readout, units, dropzones, settings and routing (#live, #jumps, #jump/<id>) |
fsfiles.js | FlySight file transfer over Bluetooth: directory listing, file reads and sleep requests |
jumps.js | Jump logbook: storage, import, the jump screen and its charts |
analysis.js | Track and sensor file parsing and the acro analysis |
sw.js | Offline cache |
manifest.json | Install metadata |
analysis.js is pure functions with no DOM access and exports them under Node, so it can be tested directly:
const { parseTrack, analyseAcro } = require('./analysis.js');
All altitudes in the rules are GPS height above ground, so the exit verdict needs a dropzone elevation.
Barometric height uses the standard atmosphere and is zeroed at ground level, taken as the highest pressure in the file. SENSOR.CSV timestamps are matched to the track through its $TIME rows. The sampled Bluetooth download can leave seconds between barometer readings, so the jump screen interpolates the difference between barometric and GPS height rather than the height itself.
The Bluetooth UUIDs and packet layouts come from flysight-2-firmware (Docs/ble.md, STM32_WPAN/App/custom_app.c, FlySight/crs.c). The live barometer characteristic is only on firmware that streams sensor data; the app sets the barometer mask and rate on connect, since those settings last until the FlySight is switched off and another app may have changed them.