BikeControl (SwiftControl)
使用 Zwift Click、Zwift Play、Shimano Di2,或任何藍牙控制器搭配 MyWhoosh、Rouvy、Zwift 等。可於 iOS、Android、Windows 與 macOS 免費試用。
AI 翻譯
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 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.