BikeControl (SwiftControl)
Zwift Click과 Shimano 컨트롤러를 MyWhoosh와 Rouvy와 Zwift에서 쓴다
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 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.