Repository: bombsimon/awesome-garmin Branch: main Commit: 8ceaaf51391d Files: 14 Total size: 208.0 KB Directory structure: gitextract_qcwf0003/ ├── .github/ │ └── workflows/ │ ├── check_sorting.sh │ ├── pr.yaml │ ├── sort_toml.sh │ └── update_readme.yaml ├── LICENSE ├── README.md └── awesome-generator/ ├── .gitignore ├── Cargo.toml ├── README.md ├── awesome.toml └── src/ ├── bin/ │ └── main.rs ├── lib.rs ├── readme.md.hbs └── search.rs ================================================ FILE CONTENTS ================================================ ================================================ FILE: .github/workflows/check_sorting.sh ================================================ #!/usr/bin/env bash file="awesome-generator/awesome.toml" exit_code=0 IFS=";" # shellcheck disable=SC2207 # This just feels like the easiest to understand. I don't know how to split the # file on multiple newlines any better way. # Ref: https://stackoverflow.com/a/62608718/2274551 sections=($(awk -v RS= -v ORS=";" '{print}' "$file")) for section in "${sections[@]}"; do header=$(echo "$section" | head -n 1) rows=$(echo "$section" | tail -n +2) sorted=$(echo "$rows" | LC_ALL=C sort) if [ "$rows" != "$sorted" ]; then invalid_sections+=("$header") exit_code=1 fi done if [ $exit_code -ne 0 ]; then cat <<-EOF Thank you for adding new resources to this project! To ensure consistency and easier maintenance (e.g., spotting duplicates), the items in each section are sorted alphanumerically. Your recent changes don't follow this convention, so please ensure the section(s) you've edited are properly sorted. **NOTE** Sorting is case sensitive and since all uppercase letters comes before lowercase letters, ensure the whole section is sorted. This means that 'B' comes before 'a' and 'b' comes after 'C'. The following sections are currently not sorted: EOF for s in "${invalid_sections[@]}"; do echo " - $s" | tr -d "[]" done fi exit $exit_code ================================================ FILE: .github/workflows/pr.yaml ================================================ name: Validate `awesome.toml` on: workflow_dispatch: push: branches: - main pull_request: jobs: validate: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Check sorting id: validate run: bash .github/workflows/check_sorting.sh ================================================ FILE: .github/workflows/sort_toml.sh ================================================ #!/usr/bin/env bash # Sorts each section of awesome.toml alphanumerically # This is needed after applying URL fixes that might break the sort order file="awesome-generator/awesome.toml" temp_file=$(mktemp) # Process the file section by section current_header="" current_lines="" while IFS= read -r line || [[ -n "$line" ]]; do # Check if this is a section header if [[ "$line" =~ ^\[.*\]$ ]]; then # If we have a previous section, write it out sorted if [ -n "$current_header" ]; then { echo "$current_header" echo "$current_lines" | LC_ALL=C sort echo "" } >>"$temp_file" fi current_header="$line" current_lines="" elif [ -n "$line" ]; then # Add non-empty lines to current section if [ -n "$current_lines" ]; then current_lines="$current_lines"$'\n'"$line" else current_lines="$line" fi fi done <"$file" # Don't forget the last section if [ -n "$current_header" ]; then { echo "$current_header" echo "$current_lines" | LC_ALL=C sort } >>"$temp_file" fi mv "$temp_file" "$file" echo "Sorted all sections in $file" ================================================ FILE: .github/workflows/update_readme.yaml ================================================ --- name: Update README on: schedule: # Re-generate every Monday - cron: "0 0 * * 1" workflow_dispatch: env: CARGO_TERM_COLOR: always jobs: generate: permissions: contents: write pull-requests: write runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Generate README working-directory: ./awesome-generator run: cargo run generate-readme > ../README.md env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITLAB_TOKEN: ${{ secrets.GITLAB_TOKEN }} - name: Commit updated README uses: stefanzweifel/git-auto-commit-action@v5 with: commit_message: "Re-generate README" - name: Check for toml fixes id: check-fixes working-directory: ./awesome-generator run: | if [ -f toml-fixes.json ]; then echo "has_fixes=true" >> "$GITHUB_OUTPUT" else echo "has_fixes=false" >> "$GITHUB_OUTPUT" fi - name: Apply fixes to awesome.toml if: steps.check-fixes.outputs.has_fixes == 'true' working-directory: ./awesome-generator run: | # Apply owner mismatch fixes (replace old URLs with new URLs) jq -r '.owner_mismatches[] | "\(.old_url)|\(.new_url)"' toml-fixes.json | while IFS='|' read -r old_url new_url; do echo "Fixing owner: $old_url -> $new_url" sed -i "s|\"$old_url\"|\"$new_url\"|g" awesome.toml done # Remove not-found URLs (use # as delimiter since URLs contain /) jq -r '.not_found[]' toml-fixes.json | while read -r url; do echo "Removing not-found: $url" sed -i "\#\"$url\"#d" awesome.toml done # Clean up rm toml-fixes.json - name: Sort toml sections if: steps.check-fixes.outputs.has_fixes == 'true' run: bash .github/workflows/sort_toml.sh - name: Create PR for toml fixes if: steps.check-fixes.outputs.has_fixes == 'true' env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | # Check if there are actual changes if git diff --quiet awesome-generator/awesome.toml; then echo "No changes to awesome.toml" exit 0 fi BRANCH_NAME="auto-fix/toml-updates-$(date +%Y%m%d)" # Configure git git config user.name "github-actions[bot]" git config user.email "github-actions[bot]@users.noreply.github.com" # Create branch and commit git checkout -b "$BRANCH_NAME" git add awesome-generator/awesome.toml git commit -m "Fix owner mismatches and remove not-found repos" # Force push (branch may exist from previous run) git push --force origin "$BRANCH_NAME" # Check if PR already exists for this branch if gh pr view "$BRANCH_NAME" &>/dev/null; then echo "PR already exists for $BRANCH_NAME" exit 0 fi gh pr create \ --title "Auto-fix: Update awesome.toml URLs" \ --body "$(cat <<'EOF' ## Summary This PR was automatically generated to fix issues found during README generation: - **Owner mismatches**: Repository URLs where the owner in the toml file doesn't match the actual repository owner - **Not found**: Repository URLs that returned 404 (deleted or made private) Please review the changes before merging. 🤖 Generated automatically by CI EOF )" \ --base main ================================================ FILE: LICENSE ================================================ DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE Version 2, December 2004 Copyright (C) 2024 Simon Sawert Everyone is permitted to copy and distribute verbatim or modified copies of this license document, and changing it is allowed as long as the name is changed. DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. You just DO WHAT THE FUCK YOU WANT TO. ================================================ FILE: README.md ================================================ # Awesome Garmin [![Awesome](https://awesome.re/badge.svg)](https://awesome.re) An extensive list of Garmin apps, both for Garmin devices written in [Monkey C] and tools that integrate with the Garmin ecosystem and services. > [!NOTE] > This README is generated! > To help exploring relevant resources the items in each segmented are _sorted > by last activity_ if available. > > _This README was last generated at 2026-05-04_. Contributions are always welcome! To add a new resource, **do not edit this file**. Instead, add it to [`awesome.toml`][awesome-toml]. If the resource is a GitHub or GitLab repository with a description, just include the URL. To customize the name, set name, and to add a missing description, set description. Since many resources in this list are outdated, watch faces, widgets, data fields, and device apps with no activity in the past two years (from the file's generation date) will be placed in a collapsible section to reduce clutter. ## Contents - [Watch faces](#watch-faces) (226) - [Data fields](#data-fields) (120) - [Widgets](#widgets) (109) - [Device Apps](#device-apps) (181) - [Audio Content Providers](#audio-content-providers) (1) - [Barrels](#barrels) (14) - [Companion apps](#companion-apps) (13) - [Tools](#tools) (45) - [Miscellaneous](#miscellaneous) (35) ## Watch faces [Watch faces] are a special application type that display on the main screen of Garmin’s wearable devices. These application types are limited some ways to allow them to have minimal impact on the device’s battery life. | Name | Last updated | Stars | | ---- | ----------------- | ----- | | [zRenardWatch](https://github.com/zRenard/zRenardWatch) | 2026‑04‑29  | | | [smartarcs](https://github.com/okdar/smartarcs) | 2026‑04‑24  | ⭐8 | | [RunnerAttitude](https://github.com/jchabsi/RunnerAttitude) | 2026‑04‑21  | | | [Segment34mkII](https://github.com/ludw/Segment34mkII) | 2026‑04‑03  | ⭐192 | | [AKInstinctQuotesStatsMoveBar](https://github.com/akendrick451/AKInstinctQuotesStatsMoveBar) | 2026‑03‑19  | | | [garmin-abouttime](https://github.com/samuelmr/garmin-abouttime) | 2026‑03‑08  | ⭐34 | | [SwissRailwayClock](https://github.com/ahuggel/SwissRailwayClock) | 2026‑02‑25  | ⭐27 | | [zRenardWatch2](https://github.com/zRenard/zRenardWatch2) | 2026‑01‑29  | ⭐2 | | [garmin-mini-chrono](https://github.com/adamdanielczyk/garmin-mini-chrono) | 2026‑01‑24  | | | [garmin-watchfaces](https://github.com/Gumix/garmin-watchfaces) | 2026‑01‑16  | ⭐2 | | [Essence](https://github.com/dev-whiterice/Essence) | 2026‑01‑01  | ⭐5 | | [garmin-nyan-cat](https://github.com/sunpazed/garmin-nyan-cat) | 2025‑12‑28  | ⭐23 | | [late](https://github.com/myneur/late) | 2025‑12‑21  | ⭐62 | | [garmin-watchface-protomolecule](https://github.com/blotspot/garmin-watchface-protomolecule) | 2025‑12‑21  | ⭐83 | | [MoveToBeActive](https://github.com/fevieira27/MoveToBeActive) | 2025‑11‑09  | ⭐41 | | [Connect-IQ-WatchFace](https://gitlab.com/ravenfeld/Connect-IQ-WatchFace) | 2025‑10‑22  | ⭐3 | | [Tac](https://github.com/derbartigelady/Tac) | 2025‑10‑17  | ⭐1 | | [wf](https://github.com/jm355/wf) | 2025‑10‑10  | ⭐1 | | [crystal-face](https://github.com/SylvainGa/crystal-face) | 2025‑09‑19  | ⭐18 | | [garmin-watchFace](https://github.com/victorpaul/garmin-watchFace) | 2025‑09‑09  | ⭐32 | | [WWF5](https://github.com/fabrikant/WWF5) | 2025‑08‑26  | ⭐1 | | [garmin_mnmlst_watchface](https://github.com/mrmarbury/garmin_mnmlst_watchface) | 2025‑08‑25  | ⭐1 | | [garmin_fenix3](https://github.com/kromar/garmin_fenix3) | 2025‑08‑03  | ⭐1 | | [WatchOfTheRings](https://github.com/patrickpl/WatchOfTheRings) | 2025‑07‑25  | ⭐1 | | [WWF](https://github.com/fabrikant/WWF) | 2025‑07‑25  | ⭐3 | | [gweatherwatch](https://github.com/ankineri/gweatherwatch) | 2025‑07‑20  | ⭐5 | | [aion](https://github.com/Anemosx/aion) | 2025‑07‑16  | | | [garmin-seaside](https://github.com/bombsimon/garmin-seaside) | 2025‑06‑29  | ⭐8 | | [SimplePixels](https://github.com/shbumba/SimplePixels) | 2025‑06‑15  | ⭐6 | | [Slanted280](https://github.com/ledouxe/Slanted280) | 2025‑05‑28  | ⭐2 | | [smartarcsactive](https://github.com/okdar/smartarcsactive) | 2025‑05‑13  | ⭐10 | | [HandAvoidance](https://github.com/pierre-muth/HandAvoidance) | 2025‑05‑13  | | | [smartarcstrip](https://github.com/okdar/smartarcstrip) | 2025‑04‑26  | ⭐4 | | [orbit-face](https://github.com/pencilitin/orbit-face) | 2025‑04‑22  | ⭐1 | | [crystal-face](https://github.com/warmsound/crystal-face) | 2025‑04‑15  | ⭐453 | | [Funix-Watch](https://github.com/funix83/Funix-Watch) | 2025‑02‑17  | ⭐8 | | [wf01](https://github.com/lanker/wf01) | 2025‑02‑07  | | | [Segment34](https://github.com/ludw/Segment34) | 2025‑02‑05  | ⭐59 | | [ElegantAnalog-Watchface](https://github.com/bhugh/ElegantAnalog-Watchface) | 2025‑01‑29  | ⭐5 | | [ThePlanets-Watchface](https://github.com/BDH-Software/ThePlanets-Watchface) | 2025‑01‑18  | | | [Anker](https://github.com/oyvindse/Anker) | 2025‑01‑15  | ⭐1 | | [garmin-pedro-watchface](https://github.com/simllll/garmin-pedro-watchface) | 2025‑01‑07  | ⭐4 | | [kago](https://github.com/krasimir/kago) | 2025‑01‑04  | ⭐10 | | [Yet-Another-WatchFace](https://github.com/Laverlin/Yet-Another-WatchFace) | 2024‑12‑07  | ⭐66 | | [garmin-watchface-40d-mip-power](https://github.com/dryotta/garmin-watchface-40d-mip-power) | 2024‑11‑23  | ⭐12 | | [Rainforest](https://github.com/SarahBass/Rainforest) | 2024‑09‑28  | | | [Ocean](https://github.com/SarahBass/Ocean) | 2024‑09‑28  | | | [CandyAdventure](https://github.com/SarahBass/CandyAdventure) | 2024‑09‑18  | | | [Sundance](https://github.com/cizi/Sundance) | 2024‑09‑16  | ⭐1 | | [BeetleJuice](https://github.com/SarahBass/BeetleJuice) | 2024‑09‑14  | | | [GarminKirby](https://github.com/SarahBass/GarminKirby) | 2024‑09‑13  | | | [TimelyFenix](https://github.com/KWottrich/TimelyFenix) | 2024‑09‑12  | ⭐2 | | [connectiq-watch-faces](https://github.com/groovc/connectiq-watch-faces) | 2024‑09‑12  | | | [RaVel-GarminDigitalWatchFace](https://github.com/modus75/RaVel-GarminDigitalWatchFace) | 2024‑09‑11  | | | [BanjoGarmin](https://github.com/SarahBass/BanjoGarmin) | 2024‑09‑10  | | | [YoshiGarmin](https://github.com/SarahBass/YoshiGarmin) | 2024‑09‑04  | | | [PokemonFishing](https://github.com/SarahBass/PokemonFishing) | 2024‑08‑30  | | | [PocketAsh](https://github.com/SarahBass/PocketAsh) | 2024‑08‑23  | | | [PocketPika](https://github.com/SarahBass/PocketPika) | 2024‑08‑23  | | | [dotter](https://github.com/psjo/dotter) | 2024‑08‑10  | | | [AlniLargeTimeWatchFace](https://github.com/alni/AlniLargeTimeWatchFace) | 2024‑08‑03  | | | [EasyDisplay](https://github.com/Holger-L/EasyDisplay) | 2024‑07‑13  | | ### Older resources
Click to expand | Name | Last updated | Stars | | ---- | ----------------- | ----- | | [WWF4](https://github.com/fabrikant/WWF4) | 2024‑04‑27  | ⭐1 | | [FontLessFace](https://github.com/fabrikant/FontLessFace) | 2024‑04‑04  | | | [aface-garmin-watchface](https://github.com/zetxek/aface-garmin-watchface) | 2024‑04‑01  | ⭐1 | | [GarminBlendWatchFace](https://github.com/MrJacquers/GarminBlendWatchFace) | 2024‑03‑25  | ⭐5 | | [Aviatorlike](https://github.com/shortattentionspan/Aviatorlike) | 2024‑02‑29  | | | [Spotlight](https://github.com/nldroid/Spotlight) | 2024‑02‑29  | ⭐10 | | [connectiq-logo-analog](https://github.com/douglasr/connectiq-logo-analog) | 2024‑02‑10  | ⭐28 | | [m2](https://github.com/markdotai/m2) | 2024‑01‑26  | ⭐3 | | [m1](https://github.com/markdotai/m1) | 2024‑01‑26  | | | [GarminWatchFaceSuccessCircle](https://github.com/sura0111/GarminWatchFaceSuccessCircle) | 2024‑01‑25  | ⭐5 | | [presbyopia-watch-face](https://github.com/eldes/presbyopia-watch-face) | 2024‑01‑12  | | | [garmin-celestial-watchface](https://github.com/Cutwell/garmin-celestial-watchface) | 2024‑01‑09  | | | [daytimeWatchFace](https://github.com/jrhahn/daytimeWatchFace) | 2023‑12‑27  | ⭐1 | | [StressWatchFace](https://github.com/mannyray/StressWatchFace) | 2023‑12‑26  | | | [thirdface](https://github.com/sudarsanyes/thirdface) | 2023‑12‑19  | | | [BavarianWatchFace](https://github.com/aklarl/BavarianWatchFace) | 2023‑11‑08  | | | [JBWatch](https://github.com/bodnar13/JBWatch) | 2023‑11‑02  | | | [AnalogExplorerWatchFace](https://github.com/hurenkam/AnalogExplorerWatchFace) | 2023‑10‑27  | ⭐4 | | [garmin.watch.analogplus](https://gitlab.com/nz_brian/garmin.watch.analogplus) | 2023‑10‑27  | | | [garmin-watch-face](https://github.com/hiddewie/garmin-watch-face) | 2023‑10‑09  | | | [BAWF](https://github.com/kevinboone/BAWF) | 2023‑09‑21  | ⭐1 | | [blackcatGarmin](https://github.com/SarahBass/blackcatGarmin) | 2023‑09‑04  | | | [HalloweenCat](https://github.com/SarahBass/HalloweenCat) | 2023‑09‑04  | ⭐1 | | [tactix-fenix](https://github.com/chakflying/tactix-fenix) | 2023‑08‑26  | ⭐2 | | [Infocal](https://github.com/RyanDam/Infocal) | 2023‑08‑23  | ⭐66 | | [Infocal](https://github.com/jeffwyeh/Infocal) | 2023‑08‑23  | ⭐4 | | [DaylightWF](https://github.com/macherel/DaylightWF) | 2023‑08‑14  | | | [Data-Heavy-Garmin-Watchface](https://github.com/SarahBass/Data-Heavy-Garmin-Watchface) | 2023‑08‑09  | ⭐5 | | [PokemonGarmin](https://github.com/SarahBass/PokemonGarmin) | 2023‑08‑09  | ⭐3 | | [Cycle-View-Garmin-Watch-Pig](https://github.com/SarahBass/Cycle-View-Garmin-Watch-Pig) | 2023‑08‑09  | ⭐1 | | [VirtualPetMonkey](https://github.com/SarahBass/VirtualPetMonkey) | 2023‑08‑09  | ⭐12 | | [PoolPanda](https://github.com/SarahBass/PoolPanda) | 2023‑08‑09  | ⭐1 | | [BeachKittyGarmin](https://github.com/SarahBass/BeachKittyGarmin) | 2023‑08‑09  | ⭐1 | | [Virtual-Garmin-Pet](https://github.com/SarahBass/Virtual-Garmin-Pet) | 2023‑08‑09  | ⭐4 | | [snout](https://github.com/wolffshots/snout) | 2023‑07‑07  | ⭐3 | | [DR4c1](https://github.com/JoopVerdoorn/DR4c1) | 2023‑07‑01  | | | [DR4c2](https://github.com/JoopVerdoorn/DR4c2) | 2023‑07‑01  | ⭐1 | | [RetroFace](https://github.com/nicolas-gte/RetroFace) | 2023‑06‑21  | ⭐1 | | [VirtualStarPetGarmin](https://github.com/SarahBass/VirtualStarPetGarmin) | 2023‑05‑04  | ⭐1 | | [VirtualStarWatchGARMIN](https://github.com/SarahBass/VirtualStarWatchGARMIN) | 2023‑04‑26  | ⭐1 | | [OnAGlimpse](https://github.com/Prime1Code/OnAGlimpse) | 2023‑04‑15  | ⭐4 | | [Triforce-Watch-Face](https://github.com/slakhani1231/Triforce-Watch-Face) | 2023‑03‑06  | ⭐1 | | [dexli-watchface](https://github.com/deviammx/dexli-watchface) | 2023‑02‑13  | | | [DR4c0](https://github.com/JoopVerdoorn/DR4c0) | 2023‑01‑18  | | | [DR8-10c0](https://github.com/JoopVerdoorn/DR8-10c0) | 2023‑01‑09  | | | [DU8-10c3](https://github.com/JoopVerdoorn/DU8-10c3) | 2023‑01‑09  | | | [CleanSteps](https://github.com/jonasbcdk/CleanSteps) | 2023‑01‑04  | ⭐1 | | [DR7c2](https://github.com/JoopVerdoorn/DR7c2) | 2022‑12‑24  | | | [DR6c1](https://github.com/JoopVerdoorn/DR6c1) | 2022‑12‑24  | | | [DR6c2](https://github.com/JoopVerdoorn/DR6c2) | 2022‑12‑24  | | | [DR5c2](https://github.com/JoopVerdoorn/DR5c2) | 2022‑12‑23  | | | [garmin_wordclock](https://github.com/thekr1s/garmin_wordclock) | 2022‑12‑21  | ⭐3 | | [DR7c0](https://github.com/JoopVerdoorn/DR7c0) | 2022‑12‑21  | ⭐3 | | [DR6c0](https://github.com/JoopVerdoorn/DR6c0) | 2022‑12‑18  | | | [garmin-connect-iq](https://github.com/dennybiasiolli/garmin-connect-iq) | 2022‑10‑10  | ⭐25 | | [eleven-forty-five](https://github.com/starryalley/eleven-forty-five) | 2022‑06‑23  | ⭐3 | | [stValentineFace](https://github.com/shurupyan/stValentineFace) | 2022‑06‑12  | | | [fitface](https://github.com/ldscavo/fitface) | 2022‑05‑07  | ⭐1 | | [ciq_binarywatch](https://github.com/lcj2/ciq_binarywatch) | 2022‑03‑23  | | | [digital-watch-cas10](https://github.com/fjbenitog/digital-watch-cas10) | 2022‑02‑24 🗄️ | ⭐2 | | [Multivision-Watch](https://github.com/JoshuaTheMiller/Multivision-Watch) | 2022‑02‑06  | ⭐21 | | [BinaryWatchFace](https://github.com/Chemaclass/BinaryWatchFace) | 2022‑01‑29  | ⭐5 | | [Garmin-WatchCLC](https://github.com/claudiocandio/Garmin-WatchCLC) | 2022‑01‑20  | ⭐1 | | [Retro-Quartz-Digital-Watch](https://github.com/domosia/Retro-Quartz-Digital-Watch) | 2022‑01‑20  | ⭐9 | | [shy-watch-face](https://github.com/kevin940726/shy-watch-face) | 2022‑01‑09  | ⭐13 | | [timeless](https://github.com/voseldop/timeless) | 2021‑10‑24  | ⭐1 | | [Aviatorlike_1Hz](https://github.com/OliverHannover/Aviatorlike_1Hz) | 2021‑08‑30  | | | [Aviatorlike](https://github.com/OliverHannover/Aviatorlike) | 2021‑08‑28  | ⭐5 | | [garmin-m8m](https://github.com/matei-tm/garmin-m8m) | 2021‑07‑04  | ⭐3 | | [ElPrimero](https://github.com/tumb1er/ElPrimero) | 2021‑05‑21  | ⭐9 | | [vaguetime-watch-face](https://github.com/dmllr/vaguetime-watch-face) | 2021‑03‑25  | ⭐2 | | [connectiq-faceymcwatchface](https://github.com/le-cds/connectiq-faceymcwatchface) | 2021‑03‑18  | ⭐6 | | [connectiq-xclock](https://github.com/plaets/connectiq-xclock) | 2021‑03‑08  | | | [VivoactiveAtreliosWatchFace](https://github.com/StefanStefanoff/VivoactiveAtreliosWatchFace) | 2021‑02‑11  | | | [JSClock](https://github.com/jensws80/JSClock) | 2021‑01‑19  | ⭐2 | | [DRG-Clutterless](https://github.com/DRG-developer/DRG-Clutterless) | 2021‑01‑17  | ⭐1 | | [kudos](https://github.com/Peterdedecker/kudos) | 2021‑01‑01  | ⭐6 | | [DRG-Nathos](https://github.com/DRG-developer/DRG-Nathos) | 2020‑10‑08  | | | [Digital5Reloaded](https://github.com/erikvb/Digital5Reloaded) | 2020‑10‑04  | | | [DRG_SNT_3](https://github.com/DRG-developer/DRG_SNT_3) | 2020‑09‑22  | | | [digital-simplicity](https://github.com/kelnage/digital-simplicity) | 2020‑09‑07  | ⭐8 | | [GarminMinimalVenuWatchface](https://github.com/ChrisWeldon/GarminMinimalVenuWatchface) | 2020‑08‑28  | ⭐12 | | [Garmin_BackToTheFuture_WatchFace](https://github.com/DenysTT/Garmin_BackToTheFuture_WatchFace) | 2020‑08‑03  | ⭐7 | | [sleepy_monkey](https://github.com/springle/sleepy_monkey) | 2020‑08‑01  | | | [framework245](https://github.com/onryou/framework245) | 2020‑07‑29  | | | [ximpo](https://github.com/mcvnh/ximpo) | 2020‑07‑24  | | | [DRG-Essential](https://github.com/DRG-developer/DRG-Essential) | 2020‑07‑10  | ⭐3 | | [iconic](https://github.com/wwarby/iconic) | 2020‑07‑06  | | | [binary-clock](https://github.com/dimasmith/binary-clock) | 2020‑06‑22  | | | [ftw-garmin](https://github.com/joakim-ribier/ftw-garmin) | 2020‑06‑12 🗄️ | | | [elp87GarminWatchFace](https://github.com/elp87/elp87GarminWatchFace) | 2020‑06‑11  | | | [garmin-roundedtext](https://github.com/tomfogg/garmin-roundedtext) | 2020‑06‑04  | ⭐13 | | [COVID19WF](https://github.com/bodyazn/COVID19WF) | 2020‑05‑21  | | | [ripoff-watch-face](https://github.com/jchen1/ripoff-watch-face) | 2020‑05‑17  | ⭐2 | | [garmin_watchface](https://github.com/BodyFatControl/garmin_watchface) | 2020‑05‑15  | | | [WHatch4Me](https://github.com/WHalford/WHatch4Me) | 2020‑05‑12  | ⭐2 | | [digital5](https://github.com/HanSolo/digital5) | 2020‑04‑27  | ⭐12 | | [slyface](https://github.com/slyoldfox/slyface) | 2020‑04‑11  | | | [SilverWatchFace](https://github.com/lukaszgruca/SilverWatchFace) | 2020‑04‑06  | ⭐9 | | [AYCHFace](https://github.com/AYCHPlus/AYCHFace) | 2020‑04‑01  | | | [cara-one](https://github.com/willful-it/cara-one) | 2020‑03‑28  | ⭐1 | | [LowEnergyFace](https://github.com/fabrikant/LowEnergyFace) | 2020‑03‑20  | ⭐2 | | [philippe-watchface](https://github.com/IanGrainger/philippe-watchface) | 2020‑03‑14  | | | [LowEnergyFace2](https://github.com/fabrikant/LowEnergyFace2) | 2020‑02‑25  | | | [GarminSampleWatch](https://github.com/AmitPandya007/GarminSampleWatch) | 2019‑12‑17  | | | [WatchFaceMonospace](https://github.com/ayaromenok/WatchFaceMonospace) | 2019‑11‑16  | | | [Plotty McClockface](https://gitlab.com/knusprjg/plotty-mcclockface) | 2019‑10‑17  | ⭐1 | | [crystal-face-jpg63](https://github.com/jpg63/crystal-face-jpg63) | 2019‑06‑29  | | | [copernicus](https://github.com/cy384/copernicus) | 2019‑05‑22  | ⭐3 | | [ConnectIQ-WorldTime-Face](https://github.com/berryk/ConnectIQ-WorldTime-Face) | 2019‑05‑05  | ⭐1 | | [garmin-hedgetime](https://github.com/sunpazed/garmin-hedgetime) | 2019‑04‑24  | ⭐7 | | [LetsGetDigital](https://github.com/micooke/LetsGetDigital) | 2019‑04‑24  | ⭐3 | | [Simplog](https://gitlab.com/jsteinkamp/Simplog) | 2019‑03‑30  | | | [garmin-djcat](https://github.com/sunpazed/garmin-djcat) | 2019‑03‑06  | | | [garmin-sidereal-watchface](https://github.com/ste616/garmin-sidereal-watchface) | 2018‑12‑16  | | | [DistanceFace](https://github.com/HikiQ/DistanceFace) | 2018‑11‑10  | ⭐1 | | [Watchface-Cuphead](https://github.com/ATGH15102AFMLD/Watchface-Cuphead) | 2018‑09‑17  | ⭐3 | | [cryptocurrency-watchface](https://github.com/johndifini/cryptocurrency-watchface) | 2018‑09‑14  | ⭐3 | | [Fenix5](https://github.com/jonathandaliva/Fenix5) | 2018‑07‑22  | | | [worldtime-crystal](https://gitlab.com/keithwberry/worldtime-crystal) | 2018‑07‑15  | ⭐2 | | [ActiAnalog3](https://github.com/usernzb/ActiAnalog3) | 2018‑07‑04  | | | [MyBigDate](https://github.com/DeCaPa/MyBigDate) | 2018‑05‑01  | | | [erock20](https://github.com/eiveiv/erock20) | 2018‑04‑30  | | | [DayRound](https://github.com/rain-dl/DayRound) | 2018‑03‑18  | ⭐1 | | [Watch-Face-Garmin](https://github.com/sixtop/Watch-Face-Garmin) | 2018‑02‑26  | | | [anyaWatches](https://github.com/mpl75/anyaWatches) | 2018‑02‑25  | ⭐1 | | [Watch-Face-Garmin](https://github.com/laurencee9/Watch-Face-Garmin) | 2018‑02‑23  | ⭐10 | | [garmin-flags](https://github.com/sunpazed/garmin-flags) | 2018‑02‑16  | ⭐1 | | [Graphomatic](https://github.com/Chiocciola/Graphomatic) | 2018‑02‑15  | | | [KISSFace](https://github.com/dbcm/KISSFace) | 2018‑01‑26  | ⭐21 | | [Snapshot](https://github.com/darrencroton/Snapshot) | 2018‑01‑24  | ⭐3 | | [TidyWatch](https://github.com/HookyQR/TidyWatch) | 2017‑10‑02  | ⭐1 | | [SnapshotWatch](https://github.com/darrencroton/SnapshotWatch) | 2017‑09‑20  | ⭐20 | | [AnalogSeed](https://github.com/backface/AnalogSeed) | 2017‑09‑16  | ⭐2 | | [BGConnectUI](https://github.com/yarmatr/BGConnectUI) | 2017‑08‑21  | | | [Garmin-Watchface](https://github.com/cekeller6121/Garmin-Watchface) | 2017‑08‑05  | | | [BYOD-Watchface](https://github.com/NickSteen/BYOD-Watchface) | 2017‑06‑30  | ⭐18 | | [garmin-pollock](https://github.com/sunpazed/garmin-pollock) | 2017‑06‑02  | | | [Garmin-Watch-Faces](https://github.com/vmaywood/Garmin-Watch-Faces) | 2017‑05‑27  | ⭐3 | | [garmin-watchface](https://github.com/shortattentionspan/garmin-watchface) | 2017‑04‑30  | ⭐1 | | [SnapshotHR](https://github.com/darrencroton/SnapshotHR) | 2017‑04‑23  | ⭐5 | | [SnapshotRHR](https://github.com/darrencroton/SnapshotRHR) | 2017‑04‑18  | ⭐3 | | [ConnectIQ-ProgbarWatchFace](https://github.com/Korimsoft/ConnectIQ-ProgbarWatchFace) | 2017‑04‑13  | ⭐2 | | [garmin-mickey](https://github.com/sunpazed/garmin-mickey) | 2017‑04‑12  | ⭐27 | | [digital](https://github.com/HanSolo/digital) | 2017‑03‑20  | ⭐11 | | [darktimes](https://github.com/psjo/darktimes) | 2017‑03‑08  | ⭐2 | | [GARMIN-AMD_Watchface](https://github.com/antonioasaro/GARMIN-AMD_Watchface) | 2017‑02‑21  | ⭐1 | | [arcsin](https://github.com/psjo/arcsin) | 2017‑02‑07  | ⭐1 | | [felt](https://github.com/psjo/felt) | 2017‑02‑02  | ⭐1 | | [garmin-drawaa](https://github.com/sunpazed/garmin-drawaa) | 2017‑01‑25  | ⭐15 | | [garmin-vangogh](https://github.com/sunpazed/garmin-vangogh) | 2017‑01‑25  | ⭐1 | | [SwagginNumerals](https://github.com/30Wedge/SwagginNumerals) | 2017‑01‑23  | | | [garmin-oz](https://github.com/sunpazed/garmin-oz) | 2017‑01‑12  | | | [Formula_1](https://github.com/OliverHannover/Formula_1) | 2017‑01‑08  | ⭐5 | | [connect-iq](https://github.com/ToryStark/connect-iq) | 2016‑12‑19  | | | [batman](https://github.com/miamo/batman) | 2016‑10‑08  | ⭐3 | | [connectiq-apps](https://github.com/andriijas/connectiq-apps) | 2016‑10‑05  | | | [garmin-offset-watch-face](https://github.com/jonathan-beebe/garmin-offset-watch-face) | 2016‑10‑04 🗄️ | | | [LimitFace](https://github.com/sarahemm/LimitFace) | 2016‑09‑11  | ⭐2 | | [connectiq-apps](https://github.com/CodyJung/connectiq-apps) | 2016‑08‑14  | ⭐50 | | [ConnectIQ-8-BitWatch](https://github.com/dbanno/ConnectIQ-8-BitWatch) | 2016‑04‑16  | ⭐1 | | [Analog24](https://github.com/sparksp/Analog24) | 2016‑03‑29  | ⭐5 | | [connect-iq](https://github.com/fuebaer/connect-iq) | 2016‑01‑26  | ⭐6 | | [z1_watchface](https://github.com/worksasdesigned/z1_watchface) | 2015‑08‑11  | ⭐10 |
## Data fields [Data fields] allow customers and third party developers to write additional metrics and data that will display with Garmin activities. The goal is to create a system that not only makes it easy for a user to make a quick data field based off our workout data, but also gives the developer the the ability to customize the presentation. | Name | Description | Last updated | Stars | | ---- | ----------- | ----------------- | ----- | | [breadcrumb-garmin](https://github.com/pauljohnston2025/breadcrumb-garmin) | Garmin watch datafield that shows breadcrumb trail | 2026‑03‑18  | ⭐15 | | [FitFieldWasterDF](https://github.com/flocsy/FitFieldWasterDF) | | 2026‑03‑15  | ⭐1 | | [GarminHikeDifficulty](https://github.com/AlexBarinov/GarminHikeDifficulty) | Calculates your real time Shenandoah's Hiking Difficulty as defined on National Park Service site | 2026‑02‑27  | ⭐5 | | [SmartBikeLights](https://github.com/maca88/SmartBikeLights) | Garmin application for ANT+ bike lights | 2026‑02‑15  | ⭐159 | | [BTHomeIQ](https://github.com/ray0711/BTHomeIQ) | ConnectIQ datafield for displaying and recording BTHome temperature broadcasts | 2025‑12‑14  | ⭐4 | | [walker](https://github.com/wwarby/walker) | A free data field for Garmin watches to provide stats for walking activities | 2025‑11‑29  | ⭐66 | | [smart-cadence](https://gitlab.com/harryonline/smart-cadence) | Connect IQ display field cadence, distance/time when cadence 0 | 2025‑11‑06  | | | [HikeFieldv2](https://github.com/evilwombat/HikeFieldv2) | Hiking data field for Garmin smartwatches. Originally forked from tymmej/HikeField | 2025‑10‑30  | ⭐2 | | [steps2fit](https://github.com/rgergely/steps2fit) | Garmin Connect IQ datafiled for counting steps during activities | 2025‑10‑25  | ⭐10 | | [E-Bike-Edge-MultiField](https://github.com/maca88/E-Bike-Edge-MultiField) | Displays up to 10 data fields from an ANT+ LEV (Light Electronic Vehicle) device | 2025‑10‑19  | ⭐17 | | [GRun-Chinese](https://github.com/Likenttt/GRun-Chinese) | Forked from GRun but localized for Chinese | 2025‑10‑17  | ⭐1 | | [BodyBatteryDF](https://github.com/flocsy/BodyBatteryDF) | Body Battery data field for Garmin watches | 2025‑10‑15  | ⭐1 | | [DFDetector](https://github.com/flocsy/DFDetector) | Garmin datafield for developers to demonstrate how multiple datafields can be detected | 2025‑10‑15  | ⭐4 | | [GRun](https://github.com/gcormier9/GRun) | Configurable Garmin Watch datafield | 2025‑10‑14  | ⭐113 | | [Garmin-Datafield-sample-code](https://github.com/ActiveLook/Garmin-Datafield-sample-code) | ActiveLook Garmin Datafield | 2025‑10‑06  | ⭐13 | | [Fellrnrs-Datafield-ActiveLook](https://github.com/fellrnr/Fellrnrs-Datafield-ActiveLook) | Fellrnr's Modification of ActiveLook Garmin Datafield | 2025‑07‑30  | | | [garmin-repafield](https://github.com/dyuri/garmin-repafield) | Garmin watch DataField for myself | 2025‑07‑19  | ⭐5 | | [GarminDashboardBlock](https://github.com/bunnyhu/GarminDashboardBlock) | This is a garmin Edge cycling computer data field. Its purpose is to display more data in one place, overcoming the limitations of the factory one-block-one-data split. | 2025‑07‑16  | | | [PowerAdjuster](https://github.com/axl13/PowerAdjuster) | Connect IQ Power Adjuster | 2025‑07‑08  | ⭐3 | | [TempeField](https://github.com/maca88/TempeField) | Garmin application for Tempe sensor | 2025‑07‑06  | ⭐9 | | [GarminGoProDatafield](https://github.com/sam-dumont/GarminGoProDatafield) | Control your GoPro camera from a Datafield | 2025‑06‑27  | ⭐14 | | [anyaBike](https://github.com/mpl75/anyaBike) | Data field for cyclists who have their watch attached to their handlebars | 2025‑06‑25  | ⭐4 | | [GarminSpeedBar](https://github.com/bunnyhu/GarminSpeedBar) | This is a garmin Edge 1050 data field. Color speed, average bar, compass and radar in one block. | 2025‑06‑07  | | | [DaylightLeft](https://github.com/rconradharris/DaylightLeft) | Daylight Left DataField for Garmin ConnectIQ Watches | 2025‑05‑23  | ⭐2 | | [spotlight](https://github.com/fabiobaltieri/spotlight) | Petzl Actik Core mod board with Bluetooth LE and Connect IQ remote control. | 2025‑05‑15 🗄️ | ⭐7 | | [ZoneTraining](https://github.com/ViktorStagge/ZoneTraining) | A Zone Training app for Garmin Watches. | 2025‑04‑24  | ⭐6 | | [SinceStopped](https://github.com/thisdougb/SinceStopped) | A Garmin data field. | 2025‑04‑15  | | | [ciq-battery-field](https://github.com/fabiobaltieri/ciq-battery-field) | Connect IQ field for battery level with Fit logging | 2025‑03‑19  | ⭐3 | | [garmin-minutes-per-powerkilometer-field](https://github.com/christoph-lucas/garmin-minutes-per-powerkilometer-field) | A data field for Garmin devices that displays the minutes per power kilometer | 2025‑01‑31  | ⭐1 | | [GarminSlopeDatafield](https://github.com/mizamae/GarminSlopeDatafield) | Datafield that shows the current slope (in %) that you are in | 2025‑01‑24  | ⭐8 | | [HikeFieldv2-forked](https://github.com/evilwombat/HikeFieldv2-forked) | Data Field for Garmin Watches | 2024‑12‑26  | ⭐2 | | [polesteps](https://github.com/rgergely/polesteps) | This is a Connect IQ datafield for counting steps on compatible Garmin wearable devices when using trekking poles. | 2024‑12‑19  | ⭐6 | | [ciq-nrf-blinky](https://github.com/fabiobaltieri/ciq-nrf-blinky) | Connect IQ application client for Nordic nRF Blinky BLE example | 2024‑10‑07  | ⭐17 | ### Older resources
Click to expand | Name | Description | Last updated | Stars | | ---- | ----------- | ----------------- | ----- | | [emtb](https://github.com/markdotai/emtb) | A data field allowing Garmin watches to show information about a Shimano STEPS e-bike. | 2024‑03‑08  | ⭐34 | | [garmin-lastsplit](https://github.com/stirnim/garmin-lastsplit) | Last Split - a Garmin Connect IQ data field | 2024‑03‑05  | ⭐1 | | [Sailing-Instrument](https://github.com/Fra-Sti/Sailing-Instrument) | Garmin sailing instrument connecting to a Calypso Ultrasonic | 2024‑02‑07  | ⭐4 | | [HikeField](https://github.com/tymmej/HikeField) | Data Field for Garmin Watches | 2024‑01‑07  | | | [CIQ_InstantPcMAS](https://github.com/ebolefeysot/CIQ_InstantPcMAS) | Garmin connect IQ data field to display current speed in percent of vVo2max | 2024‑01‑05  | ⭐3 | | [CIQ_PcvVo2max](https://github.com/ebolefeysot/CIQ_PcvVo2max) | Garmin connect IQ data field to display current speed in percent of vVo2max | 2024‑01‑05  | ⭐3 | | [connectiq-hr-zones](https://github.com/peregin/connectiq-hr-zones) | Heart rate and zones with histogram data field for Garmin IQ | 2023‑11‑20  | ⭐12 | | [UVIndexDataField](https://github.com/mattv23v/UVIndexDataField) | DataField to show UV index | 2023‑11‑10  | ⭐1 | | [DataChampGarmin](https://github.com/wubbl0rz/DataChampGarmin) | More than one data field for bike computers | 2023‑11‑04  | ⭐6 | | [HeartRateRunner](https://github.com/roelofk/HeartRateRunner) | Garmin connect IQ HeartRateRunner fields | 2023‑09‑21  | ⭐22 | | [Connect-IQ-DataField-BackHome](https://gitlab.com/ravenfeld/Connect-IQ-DataField-BackHome) | Indicates the distance and direction to be taken from the starting point of your activity | 2023‑09‑14  | | | [Connect-IQ-DataField-OC](https://gitlab.com/ravenfeld/Connect-IQ-DataField-OC) | Datafield Garmin connect iq for orientation course | 2023‑09‑14  | | | [Keiser2Garmin](https://github.com/tao-j/Keiser2Garmin) | Captures Kerser M3 bike or other M Series BLE broadcast data using a Garmin device and record it. | 2023‑08‑12  | ⭐3 | | [connectiq-time-battery](https://github.com/peregin/connectiq-time-battery) | Time of day data field with battery level and temperature information for Garmin IQ | 2023‑06‑23  | ⭐2 | | [RunPowerWorkout](https://github.com/tommyvdz/RunPowerWorkout) | Garmin ConnectIQ DataField for structured workouts using Stryd. | 2023‑06‑06  | ⭐24 | | [DF_RoadBook](https://github.com/prenard/DF_RoadBook) | This data field allows display of a rolling roadbook on your Garmin Edge 820/1000 | 2023‑04‑26  | | | [DF_TorqueAVG](https://github.com/prenard/DF_TorqueAVG) | Display average torque value in N-m during your training | 2023‑04‑25  | ⭐1 | | [whatspeed](https://github.com/djs2014/whatspeed) | What app speed | 2023‑04‑05  | | | [whatpower](https://github.com/djs2014/whatpower) | What app power | 2023‑04‑05  | | | [garmin-endurance-in-zone](https://github.com/torhovland/garmin-endurance-in-zone) | A Garmin IQ Data Field that can show time within a zone as a percentage of a target duration. | 2023‑02‑20  | ⭐7 | | [HiVisRunField](https://gitlab.com/nz_brian/HiVisRunField) | Easy to read data field | 2023‑02‑16  | | | [Connect-IQ-DataField-Speed](https://gitlab.com/ravenfeld/Connect-IQ-DataField-Speed) | Colorized speed gauge | 2022‑12‑21  | | | [Connect-IQ-DataField-VirtualPartner](https://gitlab.com/ravenfeld/Connect-IQ-DataField-VirtualPartner) | Virtual race partner | 2022‑12‑21  | | | [Connect-IQ-DataField-GPS](https://gitlab.com/ravenfeld/Connect-IQ-DataField-GPS) | Datafield Garmin connect iq GPS | 2022‑12‑21  | | | [Connect-IQ-DataField-Battery](https://gitlab.com/ravenfeld/Connect-IQ-DataField-Battery) | Datafield Garmin connect iq battery | 2022‑12‑21  | | | [EveryTile](https://github.com/to-ko/EveryTile) | DataField App for garmin edge cycling computers | 2022‑10‑01  | ⭐10 | | [4caster](https://github.com/guibber/4caster) | DataField for Garmin devices that predicts milestone times based upon current speed and progress | 2022‑09‑11  | | | [RunPowerWorkoutNG](https://github.com/sam-dumont/RunPowerWorkoutNG) | Garmin ConnectIQ DataField for structured workouts using Stryd. | 2022‑07‑16  | | | [RaceWithPower](https://github.com/sam-dumont/RaceWithPower) | Datafield dedicated to racing with power, for Garmin Watches | 2022‑07‑15  | ⭐1 | | [ORun](https://github.com/grafstrom/ORun) | Orienteering data-field for Garmin Connect IQ devices | 2022‑06‑12  | ⭐3 | | [Connect-IQ-DataField-Runner](https://gitlab.com/ravenfeld/connect-iq-datafield-runner) | Fields of data that can correct the distance course by pressing lap | 2022‑04‑23  | | | [jumps](https://github.com/der-Dod/jumps) | Garmin datafield for jumps | 2022‑03‑18  | ⭐12 | | [garmin-fartlek4fun](https://github.com/vinzenzs/garmin-fartlek4fun) | Play some fun Fartleks | 2022‑02‑21  | | | [Connect-IQ-lap-max-speed](https://github.com/holubp/Connect-IQ-lap-max-speed) | Simple Garmin Connect IQ app to enable per-lap maximum speed for Garmin Fenix watches. | 2022‑02‑09  | ⭐2 | | [SimplyTime](https://github.com/simonl-ciq/SimplyTime) | This is a Garmin Connect IQ data field that displays the current time and optionally saves it to the FIT file when you end your activity. | 2021‑10‑29  | ⭐3 | | [RollingAverage](https://github.com/simonl-ciq/RollingAverage) | A Garmin Connect IQ data field showing rolling average pace or speed for a run or other activity | 2021‑10‑28  | ⭐7 | | [SunTimes](https://github.com/simonl-ciq/SunTimes) | A Garmin Connect IQ data field that shows the time until the next sunset or sunrise. | 2021‑10‑28  | ⭐1 | | [BackAtDaylight](https://github.com/pinselimo/BackAtDaylight) | Garmin data field showing at which minimum average speed to reach a destination before sunset. | 2021‑10‑16  | ⭐1 | | [AuxHR](https://github.com/imgrant/AuxHR) | Connect IQ data field for secondary ANT+ heart rate monitor | 2021‑09‑13  | ⭐8 | | [PauseTimer-connectiq-cm](https://github.com/britiger/PauseTimer-connectiq-cm) | Same as https://github.com/britiger/PauseTimer-connectiq but sending Position to CriticalMaps | 2021‑01‑23  | | | [GRun](https://github.com/markwmuller/GRun) | Configurable Garmin Watch datafield | 2020‑12‑21 🗄️ | | | [connectiq-workout-datafields](https://github.com/sam-dumont/connectiq-workout-datafields) | | 2020‑11‑25  | ⭐2 | | [datafields](https://github.com/danielmitd/datafields) | garmin datafields (coverage) | 2020‑08‑29  | ⭐2 | | [tempo-trainer](https://github.com/adamml/tempo-trainer) | A data field for Garmin devices which allows for training to a tempo | 2020‑05‑26  | ⭐7 | | [data-field](https://github.com/dodor84/data-field) | Test data field | 2020‑05‑24  | | | [garmin-swissgrid](https://github.com/stirnim/garmin-swissgrid) | Swissgrid - a Garmin Connect IQ data field | 2020‑05‑05  | | | [garmin-andytimer](https://github.com/stirnim/garmin-andytimer) | Andy Timer - a Garmin Connect IQ data field | 2020‑05‑05  | | | [connect-iq-datafield-accurate-pace](https://github.com/matthiasmullie/connect-iq-datafield-accurate-pace) | Accurate Pace - a Garmin Connect IQ data field | 2020‑01‑17  | | | [TrendPace](https://github.com/tobiaslj/TrendPace) | This data field shows the average pace for the past 30 seconds together with a trend indication | 2019‑11‑25  | ⭐2 | | [connect-iq-datafield-calories-equivalent](https://github.com/matthiasmullie/connect-iq-datafield-calories-equivalent) | Calories Equivalent - a Garmin Connect IQ data field | 2019‑11‑06  | ⭐1 | | [GarminCogDisplay](https://github.com/clementbarthes/GarminCogDisplay) | | 2019‑10‑11  | ⭐4 | | [RunnersField](https://github.com/kopa/RunnersField) | A specialized data field for the Garmin Fenix 3 sports watch. | 2019‑07‑03  | ⭐32 | | [edgecycle](https://github.com/davisben/edgecycle) | Cycling data field for Garmin Edge Devices | 2019‑04‑27  | | | [larsBikeDatafields](https://github.com/larspnw/larsBikeDatafields) | | 2019‑03‑07  | | | [ciq-runpower](https://github.com/flowstatedev/ciq-runpower) | Run Power data field for Garmin Connect IQ watches | 2019‑01‑13  | ⭐14 | | [PauseTimer-connectiq](https://github.com/britiger/PauseTimer-connectiq) | Pause Timer for Garmin Connect IQ | 2018‑12‑30  | | | [PBike](https://github.com/mirko77/PBike) | Configurable Garmin FR645M datafield | 2018‑12‑23  | ⭐1 | | [PRun](https://github.com/mirko77/PRun) | Configurable Garmin FR645M datafield | 2018‑12‑23  | ⭐1 | | [garmin-eta](https://github.com/bugjam/garmin-eta) | Simple data field for Garmin Connect IQ devices to show ETA (Estimated Time of Arrival) during a workout | 2018‑07‑08  | ⭐1 | | [connectiq-PowerField](https://github.com/creacominc/connectiq-PowerField) | A data field for Edge devices that shows heart rate, cadence, and 7 average power values, peaks, and targets. | 2018‑01‑09  | ⭐2 | | [CombiSpeed](https://github.com/ithiel01/CombiSpeed) | CombiSpeed | 2018‑01‑03  | | | [Connect-iQ-CGM-datafield](https://github.com/snorrehu/Connect-iQ-CGM-datafield) | | 2017‑11‑05  | | | [405HR](https://github.com/janverley/405HR) | Forerunner 405 styled HR graph Connect IQ Data Field | 2017‑09‑11  | ⭐1 | | [Lap-average-vertical-speed](https://github.com/danipindado/Lap-average-vertical-speed) | Average vertical lap speed | 2017‑07‑19  | ⭐1 | | [ColourHR](https://github.com/seajay/ColourHR) | Datafield for Garmin watches | 2017‑04‑12  | ⭐2 | | [LandNavApp](https://github.com/landnavapp/LandNavApp) | Land Nav, dead reckoning, and orienteering training datafield for Garmin GPS Connect-IQ enabled devices | 2017‑04‑03  | ⭐7 | | [connectiq_laps_datafield](https://github.com/travisvitek/connectiq_laps_datafield) | ConnectIQ: simple lap history data field | 2017‑02‑27  | ⭐1 | | [FlexiRunner](https://github.com/imgrant/FlexiRunner) | A ConnectIQ customized data field for Garmin devices | 2017‑02‑24  | ⭐16 | | [garmin-avg-speed-plus](https://github.com/chfr/garmin-avg-speed-plus) | Garmin IQ Data Field for displaying current speed and a +/- indicator of how the current speed relates to the average speed | 2017‑02‑10  | | | [TravelCalc](https://github.com/kolyuchii/TravelCalc) | This is a data field for the Garmin bicycle computers | 2017‑02‑02  | ⭐1 | | [OmniBikeField](https://github.com/ebottacin/OmniBikeField) | Connect IQ datafield | 2017‑01‑22  | | | [ciq_monkeyfuel](https://github.com/lcj2/ciq_monkeyfuel) | Connect IQ sample simple data field project. | 2017‑01‑20  | ⭐3 | | [bt-ats-ciq-datafield](https://github.com/dhague/bt-ats-ciq-datafield) | A DataField for Garmin ConnectIQ which shows Virtual Power for a Bike Technologies Advanced Training System (BT-ATS) trainer. | 2016‑12‑27  | ⭐2 | | [EnergyExpenditureField](https://github.com/imgrant/EnergyExpenditureField) | A ConnectIQ customized data field for Garmin devices | 2016‑11‑03  | ⭐1 | | [RunningEconomyField](https://github.com/imgrant/RunningEconomyField) | A ConnectIQ customized data field for Garmin devices | 2016‑11‑03  | ⭐2 | | [garmin-trimp](https://github.com/victornottat/garmin-trimp) | Garmin Connect IQ TRIMP data field | 2016‑10‑03  | ⭐4 | | [garmin-trimp-perhour](https://github.com/victornottat/garmin-trimp-perhour) | Garmin Connect IQ TRIMP per hour data field | 2016‑10‑03  | ⭐6 | | [Garmin-LSGrade](https://github.com/nickmacias/Garmin-LSGrade) | Garmin MonkeyC code for least-squares calculation of smoothed grade | 2016‑09‑02  | | | [Garmin-ClimbRate](https://github.com/nickmacias/Garmin-ClimbRate) | Garmin MonkeyC code for calculating climbing rate | 2016‑09‑02  | | | [Garmin-AvgGrade](https://github.com/nickmacias/Garmin-AvgGrade) | Garmin MonkeyC code for average grade | 2016‑09‑02  | ⭐2 | | [ActivityMonitor](https://github.com/Bimtino/ActivityMonitor) | Garmin ConnectIQ activity data field for a round display. Fenix 3 and D2 Bravo watches supported. | 2016‑08‑06  | ⭐3 | | [HCU](https://github.com/jimmyspets/HCU) | Fenix3 Datafield for HCU 129 | 2016‑06‑03  | | | [swimmer-datafiled-garmin](https://github.com/vovan-/swimmer-datafiled-garmin) | Swimmer datafiled for Garmin Connect IQ store. | 2016‑03‑03  | ⭐3 | | [cyclist-datafiled-garmin](https://github.com/vovan-/cyclist-datafiled-garmin) | Cyclist datafiled for Garmin Connect IQ store. Fenix 3 and D2 Bravo watches supported. | 2016‑03‑02  | ⭐11 | | [BikersField](https://github.com/kopa/BikersField) | A specialized data field for the Garmin Fenix 3 sports watch. | 2015‑11‑12  | ⭐16 | | [chart-datafields](https://github.com/simonmacmullen/chart-datafields) | Connect IQ data fields | 2015‑10‑22  | ⭐17 | | [HMFields](https://github.com/dmuino/HMFields) | Connect IQ Data Field for Fenix3 for running a half marathon. | 2015‑10‑11  | ⭐8 |
## Widgets [Widgets] are mini-apps that allow developers to provide glanceable views of information. The information may be from a cloud service, from the onboard sensors, or from other Connect IQ APIs. Widgets are launchable from a rotating carousel of pages accessible from the main screen of wearables, or from a side view on bike computers and outdoor handhelds. Unlike apps, Widgets time out after a period of inactivity and are not allowed to record activities, but they are also launchable at any time. | Name | Description | Last updated | Stars | | ---- | ----------- | ----------------- | ----- | | [evccg](https://github.com/METIQ-Solutions/evccg) | A Garmin widget that displays data from evcc, an open-source software solution for solar-powered EV charging. | 2026‑05‑02  | ⭐6 | | [openhab-garmin](https://github.com/openhab/openhab-garmin) | A Garmin widget that connects your wearable or cycling computer to openHAB, an open-source home automation platform. | 2026‑04‑30  | ⭐6 | | [garmin-divesite-weather-widget](https://github.com/mikeller/garmin-divesite-weather-widget) | Show the Weather Conditions at Your Favourite Divesite as a Widget on Your Garmin Watch. | 2026‑04‑28  | ⭐2 | | [gopro-remote-connectiq](https://github.com/ad220/gopro-remote-connectiq) | Garmin ConnectIQ widget to control a GoPro from your wrist | 2026‑04‑27  | ⭐7 | | [LPTG](https://github.com/bunburya/LPTG) | Garmin app to view information about London public transport. | 2026‑04‑13  | | | [CIQBitcoinWidget](https://github.com/11samype/CIQBitcoinWidget) | A Connect IQ widget that gets the current Bitcoin price. | 2026‑04‑08  | ⭐3 | | [connectiq-sonos](https://github.com/zmullett/connectiq-sonos) | A Garmin Connect IQ watch widget that controls Sonos speaker groups. | 2026‑04‑07  | ⭐10 | | [ZuluTime](https://github.com/fhdeutschmann/ZuluTime) | ZuluTime Garmin Connect IQ app | 2026‑04‑01  | | | [avganar](https://github.com/felwal/avganar) | Public transport watch app for Stockholm, Sweden | 2026‑03‑31  | ⭐11 | | [BatteryMonitor](https://github.com/SylvainGa/BatteryMonitor) | Garmin Battery Monitor Widget | 2026‑03‑09  | ⭐5 | | [HabitTree](https://github.com/lkjh654/HabitTree) | Garmin widget that supports resisting bad habits by growing a tree | 2026‑03‑03  | ⭐2 | | [Tasker-Trigger](https://github.com/ChelsWin/Tasker-Trigger) | Trigger Tasker tasks from your Garmin watch using the AutoNotification plugin on Android. | 2026‑02‑13  | ⭐3 | | [SimpTemp](https://github.com/zivke/SimpTemp) | Simple temperature widget for Garmin watches | 2026‑01‑10  | ⭐1 | | [Calculator](https://github.com/SylvainGa/Calculator) | | 2026‑01‑03  | ⭐4 | | [SolarStatus-Garmin](https://github.com/dividebysandwich/SolarStatus-Garmin) | A solar status display for the Garmin Epix | 2026‑01‑03  | ⭐3 | | [authentificator](https://github.com/jurask/authentificator) | OTP authentificator for Garmin devices | 2026‑01‑02  | ⭐7 | | [hasscontrol](https://github.com/hatl/hasscontrol) | Simple garmin widget to control home assistant scenes | 2025‑12‑21  | ⭐243 | | [Barcode-Wallet](https://github.com/macherel/Barcode-Wallet) | Display various type of barcodes (Simple barcode or 2D barcodes like QR code or Aztec code) | 2025‑12‑21  | ⭐73 | | [emergencyinfo](https://gitlab.com/harryonline/emergencyinfo) | EmergencyInfo app for Connect IQ | 2025‑11‑13  | | | [Fortune Quote](https://gitlab.com/harryonline/fortune-quote) | This widget show a random quote from the Gigaset Fortune collection | 2025‑11‑06  | ⭐1 | | [BikeLightsControl](https://github.com/maca88/BikeLightsControl) | Garmin widget for controlling ANT+ lights | 2025‑10‑08  | ⭐20 | | [Unquestionify](https://github.com/starryalley/Unquestionify) | A Garmin Connect IQ widget for displaying phone notifications as bitmap | 2025‑09‑30  | ⭐18 | | [otpauth-ciq](https://github.com/uaraven/otpauth-ciq) | ConnectIQ widget for generating TOTP authentication codes. | 2025‑09‑25  | ⭐20 | | [Tesla-Link](https://github.com/SylvainGa/Tesla-Link) | ConnectIQ widget for Tesla vehicle control | 2025‑09‑10  | ⭐16 | | [Garmin-WeeWX](https://github.com/SylvainGa/Garmin-WeeWX) | Get WeeWX data directly from your Garmin watch | 2025‑08‑30  | ⭐4 | | [garmin-iq-shortsweather](https://github.com/madskonradsen/garmin-iq-shortsweather) | A widget for Garmin watches that shows whether or not it's shorts weather | 2025‑07‑18  | ⭐6 | | [timerwidget](https://gitlab.com/harryonline/timerwidget) | A repeating timer widget for Connect IQ compatible Garmin watches. | 2025‑07‑15  | ⭐4 | | [SimplyLunar](https://github.com/simonl-ciq/SimplyLunar) | A Garmin Connect IQ widget that shows the current Lunar azimuth, elevation, phase, illumination and age. | 2025‑07‑08  | ⭐2 | | [SimplyWeather](https://github.com/simonl-ciq/SimplyWeather) | Connect IQ Weather forecasting using only the air pressure, its trend and the wind direction | 2025‑07‑06  | ⭐1 | | [garmin-JustOneButton](https://github.com/GuMiner/garmin-JustOneButton) | A Garmin Watchface with one button to interact with a https://www.home-assistant.io/ switch | 2025‑06‑13  | ⭐3 | | [WoP](https://github.com/Marios007/WoP) | Pregnancy Widget for Garmin Watches | 2025‑05‑31  | | | [garmin-ioBrokerVis](https://github.com/Vertumnus/garmin-ioBrokerVis) | ioBroker Visualization for Garmin smartwatches | 2025‑04‑20  | ⭐3 | | [BatteryGuesstimate](https://github.com/individual-it/BatteryGuesstimate) | Battery estimation for Garmin sportwatches | 2025‑02‑07  | ⭐15 | | [ThePlanets-Widget](https://github.com/BDH-Software/ThePlanets-Widget) | Garmin IQ widget to calculate position of sun, moon, & planets | 2025‑01‑17  | | | [slope-widget](https://github.com/bhugh/slope-widget) | This widget shows the angle of an inclined plane. May be used as a level or to calculate slope angle. Also displays a secondary alpha angle indicator of greater than or less than 18 degrees. | 2025‑01‑15  | | | [Flashlight](https://github.com/SylvainGa/Flashlight) | Flashlight for Garmin watches | 2024‑12‑22  | ⭐1 | | [GarminSmartHome](https://github.com/dabastynator/GarminSmartHome) | SmartHome client for Garmin Watches | 2024‑12‑19  | ⭐1 | | [lostandfound](https://github.com/okdar/lostandfound) | Lost and Found Garmin widget | 2024‑12‑18  | ⭐2 | | [otp-ciq](https://github.com/jctim/otp-ciq) | OTP Auth Widget for Garmin Connect IQ | 2024‑09‑27  | ⭐20 | | [garmin-swish-qr](https://github.com/bombsimon/garmin-swish-qr) | Show your Swish QR code on your wrist | 2024‑08‑19  | | | [book_read_counters](https://github.com/bbary/book_read_counters) | Basic counter widget with 3 different counters to keep track of book reading or memorization | 2024‑07‑04  | | ### Older resources
Click to expand | Name | Description | Last updated | Stars | | ---- | ----------- | ----------------- | ----- | | [DonnerWetter](https://github.com/fabrikant/DonnerWetter) | Widget for openweatrmap.org service | 2024‑04‑20  | ⭐2 | | [Garmin-NBA-Widget](https://github.com/tanvir-dhanjal/Garmin-NBA-Widget) | NBA widget gives score of Live NBA games with Timer - Monkey C | 2024‑04‑16  | ⭐4 | | [Jokes](https://github.com/bbary/Jokes) | Garmin widget that display random jokes | 2024‑03‑18  | | | [counters](https://github.com/bbary/counters) | garmin counters x3 widget | 2024‑03‑17  | ⭐1 | | [garminSmartLockApi](https://github.com/yamaserif/garminSmartLockApi) | Garmin Smartwatch Widget for Smart Lock with API provided | 2024‑01‑22  | ⭐1 | | [GarminCryptoPrices](https://github.com/YoungChulDK/GarminCryptoPrices) | Garmin - Connect IQ App for Current Price of Top 10 Cryptocurrencies | 2023‑12‑13  | ⭐19 | | [garmin-tesla](https://github.com/srwalter/garmin-tesla) | ConnectIQ widget for Tesla vehicle control | 2023‑11‑07  | ⭐38 | | [LetMeIn](https://github.com/fabrikant/LetMeIn) | Create and display QR codes | 2023‑08‑27  | ⭐1 | | [buttonStroke](https://github.com/elgaard/buttonStroke) | Measure stroke rates in rowing | 2023‑04‑02  | | | [Maya.CryptoFiatPrice](https://github.com/mayaleh/Maya.CryptoFiatPrice) | Explore the exchange rate of some crypto currencies | 2023‑03‑19  | | | [hasscontrol](https://github.com/hasscontrol/hasscontrol) | Simple garmin widget to control home assistant scenes | 2022‑12‑14  | ⭐164 | | [ConnectIQ-LogIt](https://github.com/aleung/ConnectIQ-LogIt) | A ConnectIQ widget to log time | 2022‑11‑23  | ⭐3 | | [OpenWeatherMapWidget](https://github.com/desyat/OpenWeatherMapWidget) | Garmin Widget connecting to Open Weather Map | 2022‑11‑09  | ⭐46 | | [GarminRings](https://github.com/mriscott/GarminRings) | Widget showing activity rings | 2022‑09‑02  | ⭐1 | | [garmin-connect-seed](https://github.com/danielsiwiec/garmin-connect-seed) | This is a seed project for writing Garmin Connect IQ application | 2022‑07‑17  | ⭐133 | | [connectiq-widget-pilotsrss](https://github.com/cedric-dufour/connectiq-widget-pilotsrss) | Pilot SR/SS/Twilight hours for Garmin ConnectIQ devices [GPLv3] | 2022‑07‑15  | | | [connectiq-widget-pilotaltimeter](https://github.com/cedric-dufour/connectiq-widget-pilotaltimeter) | Pilot ICAO/ISA Altimeter for Garmin ConnectIQ devices [GPLv3] | 2022‑07‑15  | ⭐1 | | [TogglIQ](https://github.com/gcaufield/TogglIQ) | ConnectIQ widget for controlling a Toggl Track Timer | 2022‑06‑26  | ⭐19 | | [connectiq-widget-totp](https://github.com/cedric-dufour/connectiq-widget-totp) | TOTP (RFC6238) implementation for Garmin ConnectIQ devices [GPLv3] | 2022‑06‑26  | ⭐2 | | [garmin-birds-around](https://github.com/starryalley/garmin-birds-around) | A Garmin Connect IQ widget showing possible bird species around your location | 2022‑06‑23  | ⭐2 | | [DogecoinToTheMoon](https://github.com/Likenttt/DogecoinToTheMoon) | Garmin widget: get current price of the dogecoin. 佳明widget:获取当前狗狗币价格。https://apps.garmin.com/en-US/apps/c6168ee2-aa5b-42d3-964d-7a891fb8fc12 | 2022‑02‑16  | ⭐5 | | [BetterBatteryWidget](https://github.com/tumb1er/BetterBatteryWidget) | Battery widget for Connect IQ | 2022‑02‑02  | ⭐6 | | [slope-widget](https://github.com/TimZander/slope-widget) | This widget shows the angle of an inclined plane. May be used as a level or to calculate slope angle. Also displays a secondary alpha angle indicator of greater than or less than 18 degrees. | 2022‑01‑26  | ⭐4 | | [dcc-connectiq](https://github.com/geel97/dcc-connectiq) | EU Digital Covid Certificate for Garmin ConnectIQ | 2022‑01‑25  | ⭐4 | | [WebRequestGlance-Widget](https://github.com/aronsommer/WebRequestGlance-Widget) | Modified version of the Garmin IQ Connect WebRequest sample | 2022‑01‑21  | ⭐3 | | [WebRequestMultiple-Widget](https://github.com/aronsommer/WebRequestMultiple-Widget) | Garmin Connect IQ WebRequest sample with multiple WebRequests | 2022‑01‑08  | ⭐3 | | [PregnancyWidget](https://github.com/markwmuller/PregnancyWidget) | | 2021‑10‑31 🗄️ | ⭐1 | | [MagneticDeclination](https://github.com/simonl-ciq/MagneticDeclination) | A Garmin Monkey C widget to show the magnetic declination at the current location and time. | 2021‑10‑29  | ⭐2 | | [SimplyHeightWidget](https://github.com/simonl-ciq/SimplyHeightWidget) | A Garmin Connect IQ widget that shows the current height above a known altitude. | 2021‑10‑28  | ⭐2 | | [AltitudeWidget](https://github.com/simonl-ciq/AltitudeWidget) | A Garmin Connect IQ widget to show the current altitude | 2021‑10‑28  | ⭐1 | | [SimplyDaylightWidget](https://github.com/simonl-ciq/SimplyDaylightWidget) | A Garmin Connect IQ widget providing an easy way to see the times of the next sunrise & sunset. | 2021‑10‑28  | | | [SimplySolar](https://github.com/simonl-ciq/SimplySolar) | A Garmin Connect IQ widget that shows the Solar Azimuth & Elevation at the current time and location. | 2021‑10‑28  | ⭐1 | | [iqbeerpongwidget](https://github.com/dbucher97/iqbeerpongwidget) | A Connect IQ Beer Pong Stats Widget for Garmin Sports Watches | 2021‑05‑18  | ⭐2 | | [activity_view](https://github.com/mettyw/activity_view) | Garmin Forerunner 235 activity view widget | 2021‑04‑10  | ⭐3 | | [Connect-IQ-QR-Code-Viewer](https://github.com/macherel/Connect-IQ-QR-Code-Viewer) | A widget that can display QR Code on Garmin watch | 2021‑02‑16  | ⭐14 | | [WordOfTheDay](https://github.com/pedlarstudios/WordOfTheDay) | A widget for Garmin's Connect IQ mobile platform that displays the "word of the day" from Wordnik.com | 2021‑01‑19  | ⭐1 | | [ForecastLine](https://github.com/miharekar/ForecastLine) | Connect IQ App inspired by Weather Line | 2020‑12‑16  | ⭐9 | | [WeatherWid](https://github.com/valgit/WeatherWid) | Garrmin Connect Weather Widget | 2020‑10‑19  | | | [ConnectIQ](https://github.com/admsteck/ConnectIQ) | Garmin ConnectIQ projects | 2020‑10‑08  | | | [SunCalc](https://github.com/haraldh/SunCalc) | Garmin Connect IQ Widget to calculate Dusk, Dawn, Sunset, Sunrise, Blue Hour, etc. | 2020‑10‑02  | ⭐38 | | [SensorHistoryWidget](https://github.com/fabrikant/SensorHistoryWidget) | Displays sensor history: Heart rate, pressure, altitude, temperature, oxygen saturation | 2020‑09‑23  | ⭐3 | | [ciq-sensorhistory](https://github.com/aleung/ciq-sensorhistory) | Garmin Connect IQ widget - display sensor history diagram | 2020‑08‑20  | ⭐1 | | [ImageNotify](https://github.com/toskaw/ImageNotify) | Garmin ConnectIQ widget ImageNotify | 2020‑07‑03  | ⭐5 | | [FastingWidget](https://github.com/pyrob2142/FastingWidget) | A simple fasting tracker for Garmin devices | 2020‑06‑17  | ⭐7 | | [AllSensors](https://github.com/fabrikant/AllSensors) | Widget with data from multiple sensors | 2020‑03‑05  | | | [CryptoMarket](https://github.com/serhuz/CryptoMarket) | Widget for viewing cryptocurrency tickers | 2020‑02‑09  | ⭐3 | | [criticalmaps-garmin-widget](https://github.com/britiger/criticalmaps-garmin-widget) | ConnectIQ Widget for Garmin Edge to send Position to CriticalMaps | 2020‑02‑03  | ⭐3 | | [septa-rr-garmin](https://github.com/djdevin/septa-rr-garmin) | SEPTA RR widget for Garmin watches | 2020‑01‑26  | | | [Galendar](https://github.com/fabrikant/Galendar) | Google calendar implementation | 2019‑11‑15  | | | [BabyLog-Feed-ConnectIQ](https://github.com/tanstaaflFH/BabyLog-Feed-ConnectIQ) | BabyLog: Feed Widget for Garmin ConnectIQ (currently: VivoActive3) | 2019‑11‑11  | ⭐7 | | [UC-Widget](https://github.com/PlanetTeamSpeakk/UC-Widget) | A widget for Garmin devices that shows today's UC. | 2019‑09‑18  | | | [Connect-IQ-ThingSpeak-Client](https://github.com/hexaguin/Connect-IQ-ThingSpeak-Client) | Displays weather data from a ThingSpeak Channel | 2019‑02‑24  | | | [SensorHistoryWidget](https://github.com/jimmycaille/SensorHistoryWidget) | Garmin widget | 2018‑12‑13  | | | [git-notifications-ciq](https://github.com/eternal-flame-AD/git-notifications-ciq) | Your github notifications on your Garmin(R) watches! | 2018‑12‑01  | ⭐4 | | [Enphase](https://github.com/jonathanburchmore/Enphase) | Connect IQ widget that displays production and consumption information from an Enphase solar installation | 2018‑11‑26  | | | [BabyLog-Sleep-ConnectIQ](https://github.com/tanstaaflFH/BabyLog-Sleep-ConnectIQ) | BabyLog: Feed Widget for Garmin ConnectIQ (currently: VivoActive3) | 2018‑10‑30  | | | [Garmin-BatteryAnalyzer](https://github.com/JuliensLab/Garmin-BatteryAnalyzer) | Battery Analyzer is a Widget for Garmin devices to display battery consumption over time and projection in the future. | 2018‑10‑08  | ⭐2 | | [garmin-nest-camera-control](https://github.com/blaskovicz/garmin-nest-camera-control) | Control and visualize the state of your Nest Cameras from your Garmin Wearable. | 2018‑09‑26  | ⭐4 | | [FertiliQ](https://github.com/natabat/FertiliQ) | Fertility stats for Garmin activity trackers | 2018‑03‑24  | | | [garmin-tally](https://github.com/ascending-edge/garmin-tally) | A counting widget for Garmin Connect IQ devices | 2018‑02‑21  | ⭐2 | | [connectIqIotButton](https://github.com/sigsegvat/connectIqIotButton) | Configurable IoT Button for connectIQ devices | 2018‑01‑21  | ⭐6 | | [garmin-authenticator](https://github.com/chemikadze/garmin-authenticator) | Authenticator app for ConnectIQ | 2017‑12‑22  | ⭐25 | | [garmin-widget-battery](https://github.com/frontdevops/garmin-widget-battery) | Battery Status - Simple beautiful widget for Garmin Watches | 2017‑07‑22  | | | [iqmeteo](https://github.com/antirez/iqmeteo) | Meteo widget for the Garmin Vivoactive HR powered by Yahoo Weather API | 2017‑04‑14  | ⭐20 | | [FootballFixtures](https://github.com/hakonrossebo/FootballFixtures) | Garmin Connect IQ widget to display football (soccer) team fixtures | 2016‑08‑02  | ⭐5 | | [activity-widget](https://github.com/simonmacmullen/activity-widget) | ConnectIQ activity history | 2015‑07‑13  | ⭐8 | | [instrument-panel](https://github.com/simonmacmullen/instrument-panel) | ConnectIQ speedo | 2015‑04‑29  | ⭐5 | | [hr-widget](https://github.com/simonmacmullen/hr-widget) | Connect IQ heart rate widget | 2015‑04‑26  | ⭐27 |
## Device Apps Applications, or [Device Apps], are by far the most robust type of app available. These allow the most flexibility and customization to the app designer. They also provide the most access to the capabilities of the wearable device, such as accessing ANT+ sensors, the accelerometer and reading/recording FIT files. | Name | Description | Last updated | Stars | | ---- | ----------- | ----------------- | ----- | | [mybiketraffic](https://github.com/kartoone/mybiketraffic) | ConnectIQ app for processing Garmin Varia radar data and counting vehicles. | 2026‑04‑27  | ⭐61 | | [Persian-Calendar-for-Garmin-Watch](https://github.com/ariosavi/Persian-Calendar-for-Garmin-Watch) | Persian-Calendar for Garmin Watch | 2026‑04‑23  | ⭐1 | | [TAKWatch-IQ](https://github.com/TDF-PL/TAKWatch-IQ) | TAKWatch-IQ is a Garmin ConnectIQ application that integrates ATAK with Garmin devices | 2026‑04‑17  | ⭐55 | | [SailingTools](https://github.com/pintail105/SailingTools) | A Garmin watch IQ app designed for sailing. | 2026‑04‑17  | ⭐11 | | [GarminHomeAssistant](https://github.com/house-of-abbey/GarminHomeAssistant) | Garmin application to provide a dashboard to control your Home Assistant | 2026‑04‑12  | ⭐307 | | [garmin-padel](https://github.com/pedrorijo91/garmin-padel) | padel scorekeeper garmin watch app | 2026‑03‑31  | ⭐6 | | [Meditate](https://github.com/floriangeigl/Meditate) | Free Meditation & Breathwork app for Garmin watches. Published in Garmin Connect IQ store at https://apps.garmin.com/apps/e6f3f3d2-3ea6-4ec1-81a5-977c708eb75b - reincarnation of the app developed by vtrifonov and dliedke. | 2026‑03‑29  | ⭐8 | | [wayfinder](https://github.com/blackshadev/wayfinder) | Garmin connect app for finding your way on the water | 2026‑03‑29  | ⭐1 | | [garmin-agv-skating](https://github.com/adekkpl/garmin-agv-skating) | Garmin app with aggressive inline skating activity | 2026‑03‑11  | | | [DiscGolf](https://github.com/marvik37/DiscGolf) | Disc golf app | 2026‑03‑01  | ⭐4 | | [garmin-qr](https://github.com/zetxek/garmin-qr) | Garmin IQ application to generate and display QR codes and barcodes | 2026‑02‑23  | ⭐5 | | [wormnav](https://github.com/andan67/wormnav) | Track navigation for Garmin watches | 2026‑02‑07  | ⭐17 | | [badminton](https://github.com/matco/badminton) | Badminton application for Garmin watches | 2026‑02‑03  | ⭐37 | | [Meditate](https://github.com/dliedke/Meditate) | [App no longer mainteined] - Totally free application developed by vtrifonov and compiled/enhanced for newer Garmin watch models by dliedke. Published in Garmin Connect IQ store at https://apps.garmin.com/en-US/apps/c5fc5ea5-7d12-4fb9-be9c-701663a39db7 | 2026‑01‑29  | ⭐4 | | [garmin-pace-calculator](https://github.com/bombsimon/garmin-pace-calculator) | 👟 A Garmin app to convert speed to pace and pace to speed | 2026‑01‑22  | | | [garmin-christchurch-bus-widget](https://github.com/mikeller/garmin-christchurch-bus-widget) | Widget to Show Departures of Buses in Christchurch on Garmin Smart Watches | 2025‑11‑27  | ⭐5 | | [Meditate](https://github.com/Byeongcheol-Kim/Meditate) | Totally free application developed by vtrifonov and compiled/enhanced for newer Garmin watch models by dliedke. Published in Garmin Connect IQ store at https://apps.garmin.com/en-US/apps/c5fc5ea5-7d12-4fb9-be9c-701663a39db7 | 2025‑11‑14  | | | [Moon-App-Simulator](https://github.com/Judex-77/Moon-App-Simulator) | App for Garmin watches to display data of the moon | 2025‑11‑02  | | | [trainasone-connectiq](https://github.com/TrainAsONE/trainasone-connectiq) | TrainAsONE Garmin workout download app (Connect IQ) app | 2025‑10‑27  | ⭐24 | | [IQwprimebal](https://github.com/chanezgr/IQwprimebal) | Garmin Connect IQ Wprime Bal application | 2025‑10‑21  | ⭐21 | | [myvario](https://github.com/ydutertre/myvario) | Fork of GliderSK targeted towards paraglider pilots | 2025‑10‑11  | ⭐32 | | [garmodoro](https://github.com/klimeryk/garmodoro) | Pomodoro for Garmin devices using Connect IQ | 2025‑09‑29  | ⭐102 | | [TempoBPM](https://github.com/xtruan/TempoBPM) | Tempo BPM app for Garmin ConnectIQ | 2025‑09‑26  | ⭐2 | | [ultiCount](https://github.com/K4pes/ultiCount) | Keep track of scores and gender ratios during games of Ultimate Frisbee | 2025‑09‑26  | ⭐5 | | [WorkoutTimer](https://github.com/xtruan/WorkoutTimer) | Workout Timer app for Garmin ConnectIQ | 2025‑09‑20  | ⭐10 | | [MorseCode](https://github.com/xtruan/MorseCode) | Morse Code app for Garmin ConnectIQ | 2025‑09‑20  | ⭐4 | | [GpsPosition](https://github.com/xtruan/GpsPosition) | GPS Position app for Garmin ConnectIQ | 2025‑09‑20  | ⭐10 | | [BPTransport-Garmin](https://github.com/electrofloat/BPTransport-Garmin) | A Garmin Connect IQ app to view realtime public transport data | 2025‑09‑18  | ⭐2 | | [garmin-curling](https://github.com/phil-mitchell/garmin-curling) | A curling activity tracker for Garmin devices | 2025‑09‑13  | ⭐1 | | [winds-mobi-client-garmin](https://github.com/winds-mobi/winds-mobi-client-garmin) | Real-time weather observations: Garmin client | 2025‑09‑10  | ⭐5 | | [WheelDash](https://github.com/blkfribourg/WheelDash) | This is a standalone application that works with Begode, Leaperkim, Kingsong, inmotion V11 & V12 wheels and VESC based PEV | 2025‑09‑04  | ⭐5 | | [low-battery-mode](https://github.com/rexMingla/low-battery-mode) | Garmin Connect Monkey C Application for lower battery mode in longer activities (ie. Ironman) | 2025‑08‑26  | ⭐2 | | [myvariolite](https://github.com/ydutertre/myvariolite) | | 2025‑08‑16  | ⭐2 | | [Garmin_SD](https://github.com/OpenSeizureDetector/Garmin_SD) | Garmin Watch Seizure Detector - A seizure detector data source based on Garmin IQ watches such as Vivoactive HR | 2025‑07‑30  | ⭐15 | | [Garmin-Contrast-Shower](https://github.com/aiMonster/Garmin-Contrast-Shower) | An application for Garmin watches to take a contrast shower | 2025‑07‑23  | ⭐19 | | [garmin-gotchi](https://github.com/Gualor/garmin-gotchi) | Tamagotchi Gen 1 Emulator for Garmin Instinct 3. | 2025‑07‑20  | ⭐11 | | [S2C](https://github.com/flori/S2C) | App for Garmin Edge computing cadence from speed | 2025‑07‑11  | | | [RoseOfWind](https://github.com/fabrikant/RoseOfWind) | Connect iq weather widget | 2025‑07‑03  | ⭐1 | | [Rainy](https://github.com/BleachDev/Rainy) | My Garmin weather app. | 2025‑06‑26  | ⭐31 | | [garmin-otp-authenticator](https://github.com/ch1bo/garmin-otp-authenticator) | Garmin ConnectIQ Widget for One Time Passwords (HOTP / TOTP / Steam Guard) | 2025‑06‑24  | ⭐117 | | [Connect-IQ-App-ChronoGym](https://gitlab.com/ravenfeld/Connect-IQ-App-ChronoGym) | Set count and rest timer | 2025‑06‑23  | | | [hkoradar](https://github.com/chakflying/hkoradar) | Simple Garmin Connect IQ App to view HKO radar images. | 2025‑06‑23  | ⭐2 | | [shotgunsports](https://github.com/mikkosh/shotgunsports) | Shotgun Sports app for Garmin ConnectIQ | 2025‑06‑21  | | | [STRIDE_CIQ_CustomBleProfile](https://github.com/georgefang13/STRIDE_CIQ_CustomBleProfile) | Connect FR265 to your STRIDE hardware | 2025‑04‑28  | ⭐1 | | [connectiq-app-towplanesk](https://github.com/cedric-dufour/connectiq-app-towplanesk) | The Towplane Swiss Knife for Garmin ConnectIQ devices [GPLv3] | 2025‑04‑07  | | | [GarminApps](https://github.com/Sonicious/GarminApps) | My Personal Nice Garmin Apps | 2025‑03‑03  | | | [8-min-abs](https://github.com/toomasr/8-min-abs) | App for Garmin watches to follow the 8 minute abs workout | 2025‑02‑24  | ⭐4 | | [TheStars](https://github.com/BDH-Software/TheStars) | Garmin IQ app show the constellations | 2025‑01‑27  | | | [ThePlanets](https://github.com/bhugh/ThePlanets) | Garmin IQ app to calculate position of sun, moon, & planets | 2025‑01‑21  | | | [Garmin_Yahtzee](https://github.com/kzibart/Garmin_Yahtzee) | Garmin Connect IQ Game Yahtzee | 2024‑12‑02  | | | [Garmin_TriPeaks](https://github.com/kzibart/Garmin_TriPeaks) | Garmin Connect IQ Game TriPeaks | 2024‑12‑02  | | | [Garmin_TileSlider](https://github.com/kzibart/Garmin_TileSlider) | Garmin Connect IQ Game Tile Slider | 2024‑12‑02  | | | [Garmin_SpaceTrek](https://github.com/kzibart/Garmin_SpaceTrek) | Garmin Connect IQ Game Space Trek | 2024‑12‑02  | | | [Garmin_Sokoban](https://github.com/kzibart/Garmin_Sokoban) | Garmin Connect IQ Game Sokoban | 2024‑12‑02  | | | [Garmin_Pyramid](https://github.com/kzibart/Garmin_Pyramid) | Garmin Connect IQ Game Pyramid | 2024‑12‑02  | | | [Garmin_MasterMind](https://github.com/kzibart/Garmin_MasterMind) | Garmin Connect IQ Game MasterMind | 2024‑12‑02  | | | [Garmin_Hangman](https://github.com/kzibart/Garmin_Hangman) | Garmin Connect IQ Game Hangman | 2024‑12‑02  | | | [Garmin_FlappyWatch](https://github.com/kzibart/Garmin_FlappyWatch) | Garmin Connect IQ Game Flappy Watch | 2024‑12‑02  | ⭐1 | | [Garmin_Farkle](https://github.com/kzibart/Garmin_Farkle) | Garmin Connect IQ Game Farkle | 2024‑12‑02  | | | [Garmin_Blackjack](https://github.com/kzibart/Garmin_Blackjack) | Garmin Connect IQ Game Blackjack | 2024‑12‑02  | ⭐2 | | [Garmin_AcesUp](https://github.com/kzibart/Garmin_AcesUp) | Garmin Connect IQ Game Aces Up | 2024‑12‑02  | | | [monky](https://github.com/vladmunteanu/monky) | Virtual Pet Simulation game with built-in minigames for Garmin vivoactive series | 2024‑12‑01  | ⭐5 | | [GarminQ](https://github.com/BleachDev/GarminQ) | Highly customizable Daily Diary app for Garmin watches with a built in data visualizer. | 2024‑11‑25  | ⭐9 | | [Yet-Another-Sailing-App](https://github.com/Laverlin/Yet-Another-Sailing-App) | Sailing application for Garmin smartwatches | 2024‑11‑03  | ⭐24 | | [SnakeIQ](https://github.com/mazefest/SnakeIQ) | Simple snake game created for Garmin Connect IQ capable devices. | 2024‑10‑26  | ⭐2 | | [garmin-football-ref-watch](https://github.com/DaWenning/garmin-football-ref-watch) | Garmin Monkey C Application for Football Referees | 2024‑10‑17  | | | [glidator](https://github.com/gaetanmarti/glidator) | This application - developed for Garmin watches - provides basic and comprehensive flight instruments for gliders. | 2024‑09‑13  | ⭐1 | | [StepGetterWatch](https://github.com/gergo225/StepGetterWatch) | App for Garmin watches to get detailed information about your steps | 2024‑09‑06  | ⭐1 | | [GarminDiscGolf](https://github.com/sdgriggs/GarminDiscGolf) | Attempt to make a Disc Golf app for Garmin Watches | 2024‑08‑15  | ⭐2 | | [iHIIT](https://github.com/adamjakab/iHIIT) | High Intensity Interval Training (HIIT) GarminIQ App | 2024‑07‑07  | ⭐7 | | [Salati](https://github.com/bbary/Salati) | mawaqit | 2024‑07‑04  | | | [ConnectIqSailingApp](https://github.com/zlelik/ConnectIqSailingApp) | Sailing App for Garmin's ConnectIQ system upgraded for latest Garmin Connect IQ SDK 7.2.1 | 2024‑07‑03  | ⭐3 | | [Garmin-Coin-Flip](https://github.com/DylanBarratt/Garmin-Coin-Flip) | A coin flipper for the Garmin Forerunner 945 | 2024‑06‑21  | | | [flight-watcher](https://github.com/chakflying/flight-watcher) | A Garmin Connect IQ application for viewing Flights around you. | 2024‑06‑06  | ⭐4 | | [GarminIQ-CoachCompanion](https://github.com/bderusha/GarminIQ-CoachCompanion) | GarminIQ Data Field app for using the RunWalkRun method with coached workouts. | 2024‑05‑26  | ⭐3 | | [GarminEmergencyContact](https://github.com/pukao/GarminEmergencyContact) | A simple App for Garmin watches which can be used to show up to three emergency contact details. | 2024‑05‑15  | | ### Older resources
Click to expand | Name | Description | Last updated | Stars | | ---- | ----------- | ----------------- | ----- | | [fta-monitor-garmin-watchapp](https://github.com/333fred/fta-monitor-garmin-watchapp) | Port of https://github.com/333fred/fta-monitor-watchapp to my new Garmin Vivoactive HR | 2024‑03‑16  | | | [barbecueboss](https://github.com/arquicanedo/barbecueboss) | Barbecue ConnectIQ App for Garmin Devices | 2024‑03‑14  | ⭐6 | | [Garmoticz](https://github.com/akamming/Garmoticz) | Garmin ConnectIQ Frontend for Domoticz | 2024‑03‑11  | ⭐4 | | [RepCounter](https://github.com/leCapi/RepCounter) | Repetition counter for Garmin | 2024‑02‑28  | ⭐2 | | [worktrail-garmin-connect-iq](https://github.com/worktrail/worktrail-garmin-connect-iq) | Garmin Connect IQ App for WorkTrail | 2024‑02‑08  | | | [Connect-IQ-App-Timer](https://gitlab.com/ravenfeld/Connect-IQ-App-Timer) | Add several timer already registered | 2024‑01‑12  | ⭐2 | | [CryptoPricesGarmin](https://github.com/YoungChulDK/CryptoPricesGarmin) | Garmin - Connect IQ App for Current Price of Top 10 Cryptocurrencies | 2023‑12‑13  | ⭐19 | | [MBO](https://github.com/rjmccann101/MBO) | Garmin Watch Apps for Mountain Bike Orienteering | 2023‑11‑13  | ⭐9 | | [rubik-watch-timer](https://github.com/CernovApps/rubik-watch-timer) | This is a timer for Rubik Cube, with features that makes it similar to the WCA rules. | 2023‑11‑05  | ⭐1 | | [garmin-squash](https://github.com/miss-architect/garmin-squash) | Source code of Squash App for Garmin activity trackers. | 2023‑10‑06  | ⭐18 | | [garmin-podcasts](https://github.com/lucasasselli/garmin-podcasts) | Garmin Podcasts is a Garmin Connect IQ podcast app powered by Podcast Index. No external service or subscription required: all you need is you watch! | 2023‑08‑07 🗄️ | ⭐81 | | [fenix-calculator](https://github.com/csekri/fenix-calculator) | Scientific calculator for Garmin watches | 2023‑06‑03  | ⭐8 | | [waypoints-app](https://github.com/danielsiwiec/waypoints-app) | Easily send waypoints from Google Maps to your device. No registration required! | 2023‑04‑11 🗄️ | ⭐13 | | [CockpitOnlineGarminClient](https://github.com/mrohmer/CockpitOnlineGarminClient) | Garmin Watch Client for Cockpit XP Online via cockpit-online.rohmer.rocks | 2022‑12‑18  | | | [connectiq-app-glidersk](https://github.com/cedric-dufour/connectiq-app-glidersk) | The Glider Swiss Knife for Garmin ConnectIQ devices [GPLv3] | 2022‑12‑07  | ⭐7 | | [ciq-hiit-tracker](https://github.com/werkkrew/ciq-hiit-tracker) | Orange Theory Fitness - Garmin Connect IQ App | 2022‑12‑02  | ⭐9 | | [ciq-orange-theory](https://github.com/werkkrew/ciq-orange-theory) | Orange Theory Fitness - Garmin Connect IQ App | 2022‑12‑02  | ⭐9 | | [Meditate](https://github.com/vtrifonov-esfiddle/Meditate) | Meditation app for Garmin smartwatches | 2022‑11‑15  | ⭐53 | | [SailingTimer](https://github.com/spikyjt/SailingTimer) | Sailing start timer for Garmin Connect IQ | 2022‑08‑31  | ⭐9 | | [GarminSailing](https://github.com/pukao/GarminSailing) | Sailing app for connectIQ Garmin | 2022‑07‑27  | ⭐5 | | [Garmin-SportTimerHR](https://github.com/rxkaminski/Garmin-SportTimerHR) | Application for Garmin sport watches to recording activity for sport. Used: Monkey C language. | 2022‑07‑18  | ⭐3 | | [hassiq](https://github.com/alanfischer/hassiq) | Home Assistant interface for Garmin's Connect IQ Platform | 2022‑06‑11 🗄️ | ⭐114 | | [brandon-garmin](https://github.com/brandon-rhodes/brandon-garmin) | Simple Garmin apps for backcountry navigation | 2022‑05‑11  | ⭐2 | | [virtual_sailing](https://github.com/valgit/virtual_sailing) | virtual sailing garmin app | 2022‑04‑25  | ⭐1 | | [EggTimer](https://github.com/pedlarstudios/EggTimer) | A simple timer application for Garmin devices using the Connect IQ framework | 2022‑03‑26  | ⭐9 | | [Ballistics](https://github.com/mikkosh/Ballistics) | Ballistics is a bullet ballistic calculator application built with Connect IQ for Garmin devices | 2022‑02‑11  | ⭐1 | | [telemeter](https://github.com/fmercado/telemeter) | App for Garmin wearables. Allows you to calculate the distance to an event based on the time difference between seeing the event and hearing it. | 2022‑01‑21  | ⭐1 | | [garmin-intervals](https://github.com/celo-vschi/garmin-intervals) | Intervals applcation for Forerunner® 235, Forerunner ® 245 (Music) and all fēnix® 6 Pro devices. | 2021‑12‑01  | | | [TicTacToe_Garmin_Connect_IQ](https://github.com/capoaira/TicTacToe_Garmin_Connect_IQ) | Play Tic Tac Toe in 1vs1 mode on your Garmin Smartwatch | 2021‑10‑23  | | | [Timer_Garmin_Connect_IQ](https://github.com/capoaira/Timer_Garmin_Connect_IQ) | A timer App for Garmin Smartwatch | 2021‑09‑24  | | | [ConnectIQ-Watch-IoT](https://github.com/davedoesdemos/ConnectIQ-Watch-IoT) | This is a Connect IQ app for Garmin devices. It will send data in realtime to Azure via the Connect Mobile app. | 2021‑09‑23  | ⭐23 | | [Horizontal-speedo-rep](https://github.com/dazey77/Horizontal-speedo-rep) | Garmin 66 Horizontal speedo | 2021‑08‑12  | | | [Connect-IQ-App-Compass](https://gitlab.com/ravenfeld/Connect-IQ-App-Compass) | Compass | 2021‑06‑20  | | | [garmin-myBus-app](https://github.com/kolitiri/garmin-myBus-app) | This is a Garmin watch application that helps you keep track of the bus arrivals on your nearest bus stops | 2021‑06‑06 🗄️ | ⭐8 | | [GarminCallControls](https://github.com/n-lahmi/GarminCallControls) | Allows you to controls ongoing calls from your Garmin smart watch/device | 2021‑03‑10  | ⭐3 | | [MapOfflineGPS](https://github.com/tskf/MapOfflineGPS) | Map around current position - Connect IQ - DataField | 2021‑02‑16  | ⭐4 | | [TestHrv](https://github.com/vtrifonov-esfiddle/TestHrv) | Heart rate variability app for Garmin smartwatches | 2021‑01‑13  | ⭐52 | | [GarMenu_GarminConnectIQApp](https://github.com/KatieXC/GarMenu_GarminConnectIQApp) | | 2020‑12‑24  | ⭐2 | | [ebikeApp](https://github.com/MarkusDatgloi/ebikeApp) | An app allowing Garmin watches to show information about a Shimano STEPS ebike. | 2020‑11‑26  | ⭐4 | | [whats-the-score](https://github.com/KieranDotCo/whats-the-score) | Forerunner 230 app for tracking a simple score. | 2020‑10‑15  | | | [Ticker](https://github.com/filarl/Ticker) | Garmin watch app for simple sail race timing | 2020‑08‑25  | ⭐1 | | [Connect-IQ-Work-Timer](https://github.com/weavercm/Connect-IQ-Work-Timer) | Allows you to keep track of your work time | 2020‑08‑18  | | | [garmin_app](https://github.com/Siratigui/garmin_app) | | 2020‑08‑15  | | | [garmin](https://github.com/Tkadla-GSG/garmin) | Collection of apps for Garmin wearable hardware written in Monkey C | 2020‑08‑13  | ⭐6 | | [SprintPace](https://github.com/jmnorma/SprintPace) | A part of Garmin's 2020 Connect IQ Challenge, SplitPace is a watch app developed to help athletes measure their sprint pace splits while working out alone. [Language: Monkey C] | 2020‑08‑07  | | | [SimonGame](https://github.com/eferreyr/SimonGame) | | 2020‑08‑07  | ⭐1 | | [Garmin-App](https://github.com/ROSENET-BTU/Garmin-App) | Mobile App for Garmin Forerunner 235 | 2020‑08‑02  | | | [GarminWebRequestTest](https://github.com/abs0/GarminWebRequestTest) | Simple app to demonstrate makeWebRequest() regression in Garmin ConnectIQ 2.3.X SDK *nix simulator | 2020‑07‑30  | ⭐11 | | [GarminSailing](https://github.com/valgit/GarminSailing) | Sailing App for Garmin Connect IQ | 2020‑07‑23  | ⭐1 | | [ConnectIQ-LIFX](https://github.com/cfculhane/ConnectIQ-LIFX) | ConnectIQ app to control LIFX smart lights | 2020‑07‑12  | ⭐2 | | [connectiq-bergsteigen-app](https://github.com/rgrellmann/connectiq-bergsteigen-app) | Connect IQ device app for Garmin vivoactive 3 smartwatches intended for mountaineering | 2020‑07‑03  | | | [NotifyApp](https://github.com/toskaw/NotifyApp) | Notify App | 2020‑07‑03  | ⭐2 | | [ConnectIqSailingApp](https://github.com/alexphredorg/ConnectIqSailingApp) | Sailing App for Garmin's ConnectIQ system | 2020‑06‑30  | ⭐15 | | [garmin-vehicle-keyfob](https://github.com/fo2rist/garmin-vehicle-keyfob) | Garmin app that allow to Lock/Unlock a car from watch | 2020‑06‑23  | ⭐6 | | [tabataTimer](https://github.com/danielsiwiec/tabataTimer) | A tabata timer for garmin watches | 2020‑06‑15  | ⭐10 | | [TackingMaster](https://github.com/SverreWisloff/TackingMaster) | A sailing-app for Garmin watch | 2020‑06‑06  | ⭐14 | | [garmin-inline-skating](https://github.com/sw-samuraj/garmin-inline-skating) | Garmin Connect IQ app for tracking of Inline Skating. | 2020‑05‑25  | ⭐1 | | [connectiq-islamic-calendar](https://github.com/slipperybee/connectiq-islamic-calendar) | | 2020‑05‑01  | | | [connectiq-jewish-calendar](https://github.com/slipperybee/connectiq-jewish-calendar) | | 2020‑05‑01  | ⭐3 | | [garmin_tomato_clock](https://github.com/alfonso-orta/garmin_tomato_clock) | Application for Garmin Vivoactive 4 that implement a Pomodoro Clock | 2020‑04‑11  | ⭐2 | | [WeatherApp](https://github.com/valgit/WeatherApp) | Weather Appfor Garmin Watches | 2020‑04‑07  | | | [tea-timer](https://github.com/ldscavo/tea-timer) | A watch app for Garmin vivoactive3 smartwatches to keep track of tea brewing times and temperatures. | 2020‑01‑09  | | | [CPR-Timer](https://github.com/lukasbeckercode/CPR-Timer) | A Garmin Connect App for CPR | 2020‑01‑07  | | | [CatFacts](https://github.com/Tamarpe/CatFacts) | A garmin widget that generates cat facts to your watch | 2019‑10‑23  | | | [uPaddle](https://github.com/quickdk/uPaddle) | Code for the Garmin Connect IQ uPaddle app | 2019‑10‑20  | ⭐1 | | [DogTracker](https://github.com/mikkosh/DogTracker) | Garmin Connect IQ DogTracker application. Enables real time tracking of multiple dogs from a Web interface. | 2019‑07‑11  | ⭐6 | | [ShopListApp](https://github.com/jimmycaille/ShopListApp) | Garmin watch app/activity | 2019‑02‑02  | ⭐1 | | [ManualHR](https://github.com/harknus/ManualHR) | Source code for the ConnectIQ app Manual HR - primarily designed for Fenix 3 | 2018‑12‑24  | | | [garmin-tplink-cloud-control](https://github.com/blaskovicz/garmin-tplink-cloud-control) | Control and visualize the state of your TPLink Cloud / Kasa devices from your Garmin Wearable. | 2018‑12‑21  | | | [sos-now](https://github.com/derjust/sos-now) | ConnectIQ S.O.S. app for Garmin Watches | 2018‑11‑25  | | | [nThlon](https://github.com/danisik/nThlon) | Semestrální práce z předmětu KIV/ZSWI | 2018‑10‑20  | | | [Garmin_pomodoro](https://github.com/sohaeb/Garmin_pomodoro) | SImple Timer app for Garmin Watch Forerunner 235 | 2018‑10‑04  | | | [CIQChecklist](https://github.com/jravey7/CIQChecklist) | Create executable checklists for Garmin smart watches using your phone | 2018‑09‑16  | | | [connect-iq-totp](https://github.com/pchng/connect-iq-totp) | Garmin Connect IQ TOTP App (PoC) | 2018‑08‑21  | ⭐1 | | [rep_track_react_native](https://github.com/anickle060193/rep_track_react_native) | | 2018‑08‑11  | | | [connectiq-ido](https://github.com/IrishMarineInstitute/connectiq-ido) | An Integrated Digital Ocean app on the ConnectIQ platform | 2018‑06‑05  | | | [Garmin_vivoactiveHR](https://github.com/nubissurveying/Garmin_vivoactiveHR) | a garmin app that send accelerometer data to smart phone. Need to work with mobile apps | 2018‑05‑14  | | | [fitnessTimer](https://github.com/danielsiwiec/fitnessTimer) | Fitness timer | 2018‑04‑20  | ⭐2 | | [garmin-otp-generator](https://github.com/simonseo/garmin-otp-generator) | Simple OTP Generator for Garmin watches in Monkey C | 2018‑04‑13  | | | [BitcoinWatcher](https://github.com/iuliux/BitcoinWatcher) | Connect IQ app for Garmin watches | 2018‑02‑28  | ⭐2 | | [Stretch](https://github.com/HerrRiebmann/Stretch) | Timer-App for stretching | 2017‑12‑13  | ⭐6 | | [doughnuts-burnt](https://github.com/noln/doughnuts-burnt) | A simple Garmin Connect IQ app for the Fenix 5X fitness GPS watch that shows the number of doughnuts burnt so far today. | 2017‑12‑03  | ⭐2 | | [commute-tracker](https://github.com/gatkin/commute-tracker) | Source code for the Commute Tracker Garmin Connect IQ wearable app | 2017‑11‑19  | ⭐18 | | [Garmin-Sudoku-Watch-App](https://github.com/tanvir-dhanjal/Garmin-Sudoku-Watch-App) | Sodoku App for Garmin Smart Watch - Published in Connect IQ App store - Monkey C | 2017‑08‑02  | ⭐1 | | [connectiq-watchapps](https://github.com/johnnyw3/connectiq-watchapps) | My Things For Garmin Connect IQ | 2017‑05‑29  | ⭐9 | | [ConnectIQ](https://github.com/hansiglaser/ConnectIQ) | Collection of Garmin Connect IQ apps | 2017‑04‑29  | ⭐17 | | [garmin-checkpoint](https://github.com/eden159/garmin-checkpoint) | For people who want to know when the next checkpoint for a competition is | 2017‑04‑26  | ⭐1 | | [SportMonitor](https://github.com/matmuc/SportMonitor) | Sport Monitor App for Garmin Fenix 3 Watches (Connect IQ) | 2017‑02‑06  | | | [DerbyLaps](https://github.com/sarahemm/DerbyLaps) | App for Garmin ConnectIQ watches to do pacing for roller derby lap skating. | 2016‑12‑10  | ⭐2 | | [garminIQ_HRonly](https://github.com/shprung/garminIQ_HRonly) | vivoActive HR app to show and broadcast HR only | 2016‑11‑18  | ⭐3 | | [FindTreasure](https://github.com/hupei1991/FindTreasure) | Garmin Connect 2014 Coding Showcase project based on Monkey C Programming Language | 2016‑11‑05  | | | [2048-iq](https://github.com/breber/2048-iq) | 2048 for ConnectIQ | 2016‑08‑09  | ⭐9 | | [timebomb](https://github.com/danielsiwiec/timebomb) | Timebomb game for garmin | 2016‑05‑10  | | | [TriathlonDuathlonAquathlon](https://github.com/lucamrod/TriathlonDuathlonAquathlon) | Code for Triathlon, Aquathlon & Duathlon APP for Garmin watches | 2016‑05‑07  | ⭐3 | | [kraken](https://github.com/dkappler/kraken) | garmin forerunner 235 app for heart rate tracking | 2016‑03‑30  | ⭐1 | | [ultitimer](https://github.com/zbraniecki/ultitimer) | Connect IQ app for interval training | 2016‑02‑09  | | | [HRV_iq](https://github.com/sharkbait-au/HRV_iq) | My HRV app for Garmin Connect IQ | 2016‑01‑29  | ⭐23 | | [Fenix3GolfDistance](https://github.com/eriklupander/Fenix3GolfDistance) | App for Garmin Fenix 3 for showing golf distance and hole info | 2015‑06‑28  | ⭐6 | | [connectiq-apps](https://github.com/blackdogit/connectiq-apps) | Connect IQ Apps by Black Dog IQ | 2015‑04‑13  | ⭐15 | | [nest-iq](https://github.com/breber/nest-iq) | ConnectIQ app to control Nest thermostat | 2015‑03‑29  | ⭐2 | | [connectiq-packman](https://github.com/frenchtoast747/connectiq-packman) | Classic arcade style for your running/biking world. | 2014‑12‑30  | ⭐6 | | [Garmin42](https://github.com/igorso/Garmin42) | Garmin Show Down @ UNL | 2014‑11‑17  | | | [GarminApps](https://github.com/sjager/GarminApps) | Apps created for the 11/15/2014 Garmin Programming Competition | 2014‑11‑15  | | | [GolfApp](https://github.com/Cybermite/GolfApp) | Garmin connect iq competition | 2014‑10‑25  | | | [helicopter-iq](https://github.com/breber/helicopter-iq) | Helicopter game for Garmin | 2014‑10‑19  | |
## Audio content providers [Audio content providers]. Garmin media enabled devices are designed for active lifestyle users who want to listen to music without carrying their phone on their rides, runs or other activities. The media player allows the user to listen to their music, podcasts, and audio-books on the go. | Name | Description | Last updated | Stars | | ---- | ----------- | ----------------- | ----- | | [SubMusic](https://github.com/memen45/SubMusic) | Sync music and podcasts to your Garmin watch from your own SubSonic or Ampache server | 2024‑01‑30  | ⭐164 | ## Barrels Developers can create custom Monkey C libraries, called [Monkey Barrels], that contain source code and resource information that are easily shared across Connect IQ Projects. | Name | Description | Last updated | Stars | | ---- | ----------- | ----------------- | ----- | | [ciqtools-cryptography](https://github.com/douglasr/ciqtools-cryptography) | An attempt to streamline the use of the Connect IQ Cryptography library | 2026‑04‑15  | ⭐2 | | [garmin-touch-keypad](https://github.com/bombsimon/garmin-touch-keypad) | A barrel to display a numpad and read user input | 2026‑01‑22  | ⭐2 | | [navutils](https://github.com/bostonrwalker/navutils) | Utilities for building navigation apps in MonkeyC. | 2025‑12‑31  | | | [msgpack-monkeyc](https://github.com/douglasr/msgpack-monkeyc) | MessagePack for MonkeyC (Connect IQ) / msgpack.org[Monkey C] | 2025‑11‑04  | ⭐5 | | [ciqtools-number-picker](https://github.com/douglasr/ciqtools-number-picker) | Number picker barrel | 2025‑06‑17  | ⭐7 | | [ANTPlusHeartStrap](https://github.com/mannyray/ANTPlusHeartStrap) | Code for connecting your ANT+ heart strap to your garmin watch | 2025‑03‑11  | | | [GarminBytePacking](https://github.com/mannyray/GarminBytePacking) | Garmin library that adds functions for manipulating ByteArrays, Floats, Doubles and Longs | 2025‑02‑27  | | | [OPN-MonkeyC](https://gitlab.com/waterkip/opn-monkeyc) | A MonkeyC Barrel for OPN / Waterkip projects | 2025‑01‑31  | ⭐1 | | [ciqtools-graphing](https://github.com/douglasr/ciqtools-graphing) | A clone of the graphing functionality present within Garmin devices natively | 2024‑05‑09  | ⭐5 | | [AntAssetTracker](https://github.com/mikkosh/AntAssetTracker) | AntAssetTracker ConnectIQ module for communicating with devices supporting Ant Asset Tracker profile such as Garmin Astro or other Dog trackers. | 2023‑12‑09  | ⭐1 | | [WidgetBarrel](https://github.com/hurenkam/WidgetBarrel) | Widgets and drawing primitives library for Garmin Connect IQ Watch Faces | 2023‑10‑27  | ⭐10 | | [garmin-ciq-page-indicator](https://github.com/Likenttt/garmin-ciq-page-indicator) | Garmin CIQ Page Indicator(Native-like)Base on sample Primates | 2023‑07‑25  | ⭐2 | | [CriticalMapsAPIBarrel](https://github.com/britiger/CriticalMapsAPIBarrel) | CriticalMapsAPI Monkey C Barrel for ConnectIQ | 2020‑10‑24  | ⭐2 | | [ConnectIqDataPickers](https://github.com/vtrifonov-esfiddle/ConnectIqDataPickers) | Garmin Connect IQ data picker barrels | 2018‑03‑17  | ⭐11 | ## Companion apps | Name | Description | Last updated | Stars | | ---- | ----------- | ----------------- | ----- | | [gimporter](https://github.com/gimportexportdevs/gimporter) | Garmin Connect App to import GPX and FIT files | 2026‑03‑24  | ⭐29 | | [Handsfree](https://github.com/grigorye/Handsfree) | Make your phone calls from Garmin watch | 2026‑02‑05  | ⭐12 | | [gexporter](https://github.com/gimportexportdevs/gexporter) | Android App to export GPX and FIT to garmin devices | 2026‑02‑01  | ⭐29 | | [garmin](https://github.com/buessow/garmin) | Glucose displays for Garmin devices. | 2025‑08‑28  | ⭐9 | | [Sleep-as-Android-Garmin-Addon](https://github.com/urbandroid-team/Sleep-as-Android-Garmin-Addon) | Code for both Android part and Garmin part of the Sleep as Android Garmin smartwatch integration | 2025‑06‑27  | ⭐56 | | [ios-connect-iq-comms](https://github.com/MatyasKriz/ios-connect-iq-comms) | An example of a two way communication between an iOS companion app and a ConnectIQ app on a Garmin device. | 2025‑02‑22  | ⭐17 | | [Unquestionify-android](https://github.com/starryalley/Unquestionify-android) | Android companion app for Garmin Connect IQ watchapp: Unquestionify | 2023‑11‑23  | ⭐4 | | [Garmin-ExampleApp-Swift](https://github.com/dougw/Garmin-ExampleApp-Swift) | A Swift 3 version of Garmin's Connect IQ iOS Example App, demonstrating use of the Connect IQ iOS SDK. | 2022‑07‑27  | ⭐21 | | [Companion.Garmin](https://github.com/Wheellog/Companion.Garmin) | A WheelLog companion for Garmin smartwatches | 2022‑02‑14 🗄️ | ⭐4 | | [Onewheel2Garmin](https://github.com/kite247/Onewheel2Garmin) | See the battery status of your Onewheel on a Garmin watch | 2020‑07‑04  | ⭐15 | | [mHealth-Project](https://github.com/AldoSusanto/mHealth-Project) | Development of Android app with Garmin Smartwatch that helps researchers track subject activity | 2019‑06‑23  | ⭐1 | | [SensorTriggerIQ](https://github.com/Cougargriff/SensorTriggerIQ) | Companion watch app for Sensor Triggers | 2019‑03‑24  | | | [OBD2Reader](https://github.com/robertmpowell/OBD2Reader) | Hack ISU fall 2017 OBD2 reader Android and Garmin Connect IQ app. | 2017‑10‑22  | ⭐1 | ## Tools | Name | Description | Last updated | Stars | | ---- | ----------- | ----------------- | ----- | | [ble-scale-sync](https://github.com/KristianP26/ble-scale-sync) | Universal BLE Smart Scale bridge. Captures body composition from Renpho, Xiaomi & 20+ others, syncs to Garmin Connect, Strava, MQTT (Home Assistant), InfluxDB, Webhooks, Ntfy & local files (CSV/JSONL). Headless CLI for Raspberry Pi, Linux, macOS & Windows. | 2026‑05‑01  | ⭐66 | | [rules_ciq](https://github.com/semolina-solutions/rules_ciq) | A Bazel module for Garmin Connect IQ development tools. | 2026‑05‑01  | | | [FitFileViewer](https://github.com/Nick2bad4u/FitFileViewer) | Fit File Viewer - Cross-Platform application to analyze Fit files. Builds available for Windows, Mac, and Linux in a variety of formats. | 2026‑05‑01  | ⭐43 | | [fitparse-rs](https://github.com/stadelmanma/fitparse-rs) | Rust library to parse FIT formatted files | 2026‑05‑01  | ⭐72 | | [garmin-grafana](https://github.com/arpanghosh8453/garmin-grafana) | A Dockerized python Script to fetch Garmin health data and populate that in a InfluxDB Database, for visualization long term health trends with Grafana | 2026‑04‑29  | ⭐3148 | | [fit](https://github.com/muktihari/fit) | A FIT SDK for decoding and encoding Garmin FIT files in Go supporting FIT Protocol V2. | 2026‑04‑27  | ⭐154 | | [fit](https://github.com/lindig/fit) | Minimal OCaml library to parse Garmin FIT files | 2026‑04‑25  | ⭐9 | | [garmin-dev-tools](https://github.com/flocsy/garmin-dev-tools) | Tools for Garmin CIQ developers | 2026‑04‑15  | ⭐20 | | [garth](https://github.com/matin/garth) | [DEPRECATED] Garmin SSO auth + Connect Python client | 2026‑04‑14  | ⭐811 | | [garmin-connectiq-release-action](https://github.com/blackshadev/garmin-connectiq-release-action) | Github action to release / export a garmin ConnectIQ app | 2026‑03‑29  | ⭐3 | | [prettier-extension-monkeyc](https://github.com/markw65/prettier-extension-monkeyc) | A VSCode extension for Garmin MonkeyC | 2026‑03‑16  | ⭐19 | | [monkeyc-optimizer](https://github.com/markw65/monkeyc-optimizer) | Utilities for optimizing monkeyc projects | 2026‑03‑16  | ⭐16 | | [GarminSportsDev](https://github.com/flocsy/GarminSportsDev) | App for CIQ developers to examine SPORT and SUB_SPORT values | 2026‑03‑15  | ⭐2 | | [connectiq-sdk-manager](https://github.com/pcolby/connectiq-sdk-manager) | Garmin's Connect IQ SDK Manager as an AppImage | 2026‑03‑12  | ⭐27 | | [GarminDB](https://github.com/tcgoetz/GarminDB) | Download and parse data from Garmin Connect or a Garmin watch, FitBit CSV, and MS Health CSV files into and analyze data in Sqlite serverless databases with Jupyter notebooks. | 2026‑03‑11  | ⭐3063 | | [share-your-garmin-workout](https://github.com/fulippo/share-your-garmin-workout) | Chrome extension to share your Garmin Connect workout with your friends | 2026‑03‑09  | ⭐22 | | [prettier-plugin-monkeyc](https://github.com/markw65/prettier-plugin-monkeyc) | A prettier plugin for Garmin monkey-c | 2026‑02‑26  | ⭐16 | | [export2garmin](https://github.com/RobertWojtowicz/export2garmin) | Export Mi - Xiaomi scale & Omron data to Garmin Connect | 2026‑02‑01  | ⭐259 | | [fit-rust](https://github.com/zzyandzzy/fit-rust) | fit-rust is a Rust library designed for reading, writing, and merging FIT protocol files. | 2026‑01‑15  | ⭐12 | | [openivity.github.io](https://github.com/openivity/openivity.github.io) | An open-source fitness analytic platform offering data visualization (with OpenStreetMap), edit, convert, and combine multiple FIT, GPX, and TCX activity files. 100% client-side power! (WebAssembly) | 2026‑01‑05  | ⭐33 | | [connectiq-tester](https://github.com/matco/connectiq-tester) | Docker image that can be used to run the tests "Run No Evil" of a ConnectIQ application | 2025‑12‑27  | ⭐8 | | [flowfit](https://github.com/hacdias/flowfit) | Turn FIT files generated by Bosch's eBike Flow app into a valid FIT file that can be imported by other tools. | 2025‑12‑13  | ⭐4 | | [connectiq-tester](https://github.com/DavidBaddeley/connectiq-tester) | Fork of `connectiq-tester` with screenshot support | 2025‑06‑25  | ⭐5 | | [react-native-connect-iq-mobile-sdk](https://github.com/cjsmith/react-native-connect-iq-mobile-sdk) | This package provides a React Native wrapper around the Android and iOS Garmin Connect IQ Mobile SDKs | 2025‑05‑13  | ⭐7 | | [GarminMonkeyCBoilerPlate](https://github.com/cyberang3l/GarminMonkeyCBoilerPlate) | Boilerplate with makefile to quickly start new projects | 2025‑03‑20  | ⭐1 | | [GarminSettingsFileParser](https://github.com/cyberang3l/GarminSettingsFileParser) | A script to read/write GARMIN.SET files | 2025‑03‑15  | | | [dithering-converter](https://github.com/himanushi/dithering-converter) | Garmin AMOLED to MIP Image Conversion Tool | 2025‑03‑05  | ⭐1 | | [vim-monkey-c](https://github.com/cyberang3l/vim-monkey-c) | Vim syntax for Monkey C language. | 2025‑01‑23  | | | [garmin-linux-development-environment](https://github.com/cyberang3l/garmin-linux-development-environment) | Simple set of scripts to download the required libraries and setup the Garmin development environment | 2024‑12‑18  | ⭐3 | | [garmin-screenshot](https://github.com/bombsimon/garmin-screenshot) | Build your project for all configured devices, fire it up in the Connect IQ Simulator and take a screenshot | 2024‑08‑10  | | | [connectiq-app-rawlogger](https://github.com/cedric-dufour/connectiq-app-rawlogger) | RawLogger (Garmin ConnectIQ) App [GPLv3] | 2024‑05‑30  | ⭐10 | | [action-connectiq-tester](https://github.com/matco/action-connectiq-tester) | GitHub action for `connectiq-tester` | 2024‑05‑13  | ⭐7 | | [ciqdb](https://github.com/pzl/ciqdb) | Connect IQ (PRG) parser and debugger | 2024‑04‑20  | ⭐38 | | [garmin-tilemapper](https://github.com/sunpazed/garmin-tilemapper) | A command line tool that helps developers build tile-mapped anti-aliased graphics for Garmin wearables. | 2023‑10‑03  | ⭐47 | | [docker-connectiq](https://github.com/kalemena/docker-connectiq) | Garmin Tools - Connect IQ SDK and Eclipse IDE plugins as a Docker container | 2023‑04‑20  | ⭐35 | | [MonkeyInject](https://github.com/gcaufield/MonkeyInject) | A dependency injection framework for Connect IQ | 2023‑04‑04 🗄️ | ⭐1 | | [directive-preprocessor](https://github.com/maca88/directive-preprocessor) | A preprocessor for basic directives written in Node.js | 2022‑01‑14  | ⭐1 | | [kumitateru](https://github.com/voltangle/kumitateru) | Build system for Garmin ConnectIQ. Simple, fast, powerful! | 2022‑01‑03 🗄️ | ⭐10 | | [MonkeyPack](https://github.com/gcaufield/MonkeyPack) | A github release driven ConnectIQ Package Manager | 2020‑11‑03  | ⭐1 | | [MonkeyTest](https://github.com/gcaufield/MonkeyTest) | A ConnectIQ Testing and Mocking framework. | 2020‑10‑18  | | | [MonkeyContainer](https://github.com/gcaufield/MonkeyContainer) | A Docker Image for headless Connect IQ Development | 2020‑10‑02  | ⭐4 | | [garminfit](https://github.com/jmackie/garminfit) | 🏃 Rust library for working with ANT/Garmin .FIT files | 2018‑11‑28  | ⭐8 | | [connectiq-monkeyc](https://github.com/blackdogit/connectiq-monkeyc) | Various tools for Garmin Connect IQ | 2015‑03‑28  | ⭐14 | | [BM Font](https://www.angelcode.com/products/bmfont) | This program will allow you to generate bitmap fonts from TrueType fonts |   | | [VS Code Monkey C](https://marketplace.visualstudio.com/items?itemName=garmin.monkey-c) | Official VS Code extension for Monkey C |   | ## Miscellaneous | Name | Description | Last updated | Stars | | ---- | ----------- | ----------------- | ----- | | [home-assistant-garmin_connect](https://github.com/cyberjunky/home-assistant-garmin_connect) | This Garmin Connect integration allows you to expose and upload data from and to Garmin Connect to Home Assistant. | 2026‑05‑02  | ⭐487 | | [garmin-workouts](https://github.com/mkuthan/garmin-workouts) | Command line tool for managing Garmin workouts. | 2026‑04‑16  | ⭐119 | | [open-location-code](https://github.com/google/open-location-code) | Open Location Code is a library to generate short codes, called "plus codes", that can be used as digital addresses where street addresses don't exist. | 2026‑03‑30  | ⭐4317 | | [VibraTest](https://github.com/flocsy/VibraTest) | vibration and tone tester for Garmin developers | 2026‑03‑15  | ⭐1 | | [Insta360-Remote-CIQ](https://github.com/arsfabula/Insta360-Remote-CIQ) | Garmin Connect IQ Remote for Insta360 Cameras | 2025‑09‑09  | ⭐9 | | [Inreach-Mapshare](https://github.com/OpenGIS/Inreach-Mapshare) | Display your live inReach MapShare data on your WordPress Site | 2025‑08‑20  | ⭐10 | | [garmin](https://github.com/acrossthekyle/garmin) | Collection of projects created over the years for Garmin watches. | 2025‑08‑19  | ⭐7 | | [garmin-monkey-c-neovim-language-server](https://github.com/cyberang3l/garmin-monkey-c-neovim-language-server) | Neovim LSP configuration for the Garmin MonkeyC language server | 2025‑03‑22  | ⭐5 | | [workspace-ConnectIQ](https://github.com/rbsexton/workspace-ConnectIQ) | Garmin Connect IQ Apps | 2025‑02‑11  | ⭐6 | | [connectiq-apps](https://github.com/garmin/connectiq-apps) | A collection of Connect IQ apps. | 2025‑01‑08  | ⭐572 | | [MonkeyAOC](https://github.com/YAWNICK/MonkeyAOC) | [Advent of Code](https://adventofcode.com) in Monkey C | 2024‑12‑03  | ⭐4 | | [connect-iq](https://github.com/AndrewKhassapov/connect-iq) | Creating a Garmin watch-face 101 | 2024‑11‑14  | ⭐67 | | [NextMatchReminder](https://github.com/ZachXu/NextMatchReminder) | Garmin Application including WatchFace project ,Widget project and a share lib which synchronizing data | 2024‑10‑14  | ⭐1 | | [garmin-complicate-circle](https://github.com/sunpazed/garmin-complicate-circle) | An example application that demonstrates system6 complications | 2024‑08‑30  | ⭐5 | | [garmin-complicate](https://github.com/sunpazed/garmin-complicate) | An example application that demonstrates system6 complications | 2024‑07‑12  | ⭐9 | | [connectiq-samples](https://github.com/douglasr/connectiq-samples) | Connect IQ sample apps, libraries and code snippets | 2024‑03‑12  | ⭐80 | | [garmin-games](https://github.com/Likenttt/garmin-games) | folked games | 2023‑08‑29  | ⭐3 | | [Garmin-Connect-Workout-and-Schedule-creator](https://github.com/sydspost/Garmin-Connect-Workout-and-Schedule-creator) | Create Garmin Connect workouts with a "turbo language" and schedule them. | 2023‑06‑22  | ⭐26 | | [CIQTest](https://github.com/ekutter/CIQTest) | Garmin CIQ test projects | 2023‑03‑13  | ⭐4 | | [connectiq-sdk-docker](https://github.com/waterkip/connectiq-sdk-docker) | Containerized ConnectIQ Development Environment for Linux [free] | 2023‑03‑08  | ⭐7 | | [GarminApps](https://github.com/ferranlala/GarminApps) | A data field for Garmin devices that displays three pieces of information. | 2023‑02‑07  | ⭐1 | | [garmin-waketest](https://github.com/sunpazed/garmin-waketest) | Watchface to verify timings, and poll frequency of `onUpdate()` | 2022‑12‑01  | ⭐6 | | [GridReference](https://github.com/simonl-ciq/GridReference) | Three Garmin Connect IQ apps to show the GB OS Grid Reference of the current GPS position | 2021‑10‑28  | ⭐2 | | [ConnectIQ](https://github.com/fagalto/ConnectIQ) | Collection of ConnectIQ apps | 2021‑09‑03  | ⭐1 | | [garmin-connectiq](https://github.com/jstringer1/garmin-connectiq) | Bits a pieces of monkeyc written for my garmin fenix 5 plus. | 2020‑12‑31  | ⭐5 | | [CIQ-Comm-failure-sample](https://github.com/Artaud/CIQ-Comm-failure-sample) | This repo is made for QA team @ Garmin CIQ dept. as a counterpart to bug report, showing excessive FAILURE_DURING_TRANSFER clog | 2020‑08‑18  | ⭐3 | | [garmin-conect](https://github.com/iperformance/garmin-conect) | A collection of Connect IQ apps and libraries | 2019‑10‑10  | ⭐1 | | [connectiq](https://github.com/Peterdedecker/connectiq) | Garmin Connect IQ Sample Projects | 2019‑03‑26  | ⭐44 | | [connectiq-PowerFieldTests](https://github.com/creacominc/connectiq-PowerFieldTests) | unit tests for connectiq-PowerField | 2017‑10‑22  | | | [garmin-ciqsummit17](https://github.com/sunpazed/garmin-ciqsummit17) | A basic widget that displays tweets from #ciqsummit17 | 2017‑04‑23  | ⭐2 | | [vim-monkey-c](https://github.com/klimeryk/vim-monkey-c) | Vim syntax for Monkey C language. | 2017‑04‑09  | ⭐7 | | [garmin-public](https://github.com/Shmuma/garmin-public) | Opensource for Garmin devices | 2015‑05‑13  | ⭐5 | | [Connect IQ developer forum](https://forums.garmin.com/developer/connect-iq) | Forum to talk anything Connect IQ related |   | | [Official Garmin developer site](https://developer.garmin.com/connect-iq/overview) | Information about Garmin development and the Monkey C language |   | | [Watch Face Builder](https://garmin.watchfacebuilder.com) | Build (or download) watch faces in the browser |   | [awesome-toml]: ./awesome-generator/awesome.toml [Watch faces]: https://developer.garmin.com/connect-iq/connect-iq-basics/app-types/#watchfaces [Monkey C]: https://developer.garmin.com/connect-iq/monkey-c/ [Data fields]: https://developer.garmin.com/connect-iq/connect-iq-basics/app-types/#datafields [Widgets]: https://developer.garmin.com/connect-iq/connect-iq-basics/app-types/#widgets [Device Apps]: https://developer.garmin.com/connect-iq/connect-iq-basics/app-types/#deviceapps [Audio content providers]: https://developer.garmin.com/connect-iq/connect-iq-basics/app-types/#audiocontentproviders [Monkey Barrels]: https://developer.garmin.com/connect-iq/core-topics/shareable-libraries/ ================================================ FILE: awesome-generator/.gitignore ================================================ # Created by https://www.toptal.com/developers/gitignore/api/rust # Edit at https://www.toptal.com/developers/gitignore?templates=rust ### Rust ### # Generated by Cargo # will have compiled files and executables debug/ target/ # Remove Cargo.lock from gitignore if creating an executable, leave it for libraries # More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html Cargo.lock # These are backup files generated by rustfmt **/*.rs.bk # MSVC Windows builds of rustc generate these, which store debugging information *.pdb # End of https://www.toptal.com/developers/gitignore/api/rust # Generated during README generation, used by CI to create fix PRs toml-fixes.json ================================================ FILE: awesome-generator/Cargo.toml ================================================ [package] name = "awesome-generator" version = "0.1.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] anyhow = "1" chrono = "0.4" clap = { version = "4.5", features = ["derive"] } futures = "0.3" gitlab = "0.1708.1" handlebars = "6.3" octocrab = "0.43" pin-project = "1.1" prettytable-rs = "0.10" reqwest = "0.12" serde = { version = "1", features = ["derive"] } serde_json = "1" serde_with = { version = "3.12", features = ["chrono_0_4"] } tokio = { version = "1", features = ["full"] } toml = "0.8" url = "2.5" ================================================ FILE: awesome-generator/README.md ================================================ # awesome-generator Tool to integrate with GitHub, GitLab and Connect IQ. It is currently helping automate the process of updating the README but finding, adding or removing resources is still a manual process. ## Generate README The main purpose of this tool is to generate the [`README.md`] by reading [`awesome.toml`] and fetching description, last activity and more from GitHub or GitLab. ## Search The tool supports searching the [Connect IQ app library] and print any application that has a website URL linked which usually points to the source code. ```sh › cargo run search sailing Change date | Type | URL -------------------------+-----------+------------------------------------------------------------- 2024-06-08 22:04:10 UTC | DeviceApp | https://github.com/pintail105/SailingTools 2018-12-05 15:09:37 UTC | DeviceApp | https://github.com/antgoldbloom/VMG-Connect-IQ-App 2023-10-25 07:04:22 UTC | DeviceApp | https://github.com/AlexanderLJX/Sailing-Windsurfing-Foiling 2024-09-02 12:43:09 UTC | DeviceApp | https://github.com/dmrrlc/connectiq-sailing 2018-12-05 15:28:10 UTC | DeviceApp | https://github.com/spikyjt/SailingTimer 2024-11-04 08:04:27 UTC | DeviceApp | https://github.com/Laverlin/Yet-Another-Sailing-App 2021-04-16 09:25:18 UTC | DeviceApp | https://github.com/alexphredorg/ConnectIqSailingApp 2023-10-25 07:37:00 UTC | DeviceApp | https://github.com/pukao/GarminSailing 2024-02-14 00:30:24 UTC | DataField | https://github.com/Fra-Sti/Sailing-Instrument 2023-12-04 06:43:39 UTC | DeviceApp | https://seatouch.dev/#/foilstart 2024-07-11 05:05:21 UTC | DeviceApp | https://github.com/zlelik/ConnectIqSailingApp ``` ## Compare To make it easy to maintain and discover new resources the tool can compare a search result with the `awesome.toml` and print any diff in their respective category. ```sh › cargo run compare gitlab Found 8 URLs not in list [watch_faces] "https://gitlab.com/knusprjg/wherearemyglasses" = {} "https://gitlab.com/HankG/GarminConnectIQ" = {} "https://gitlab.com/aleixq/connect-iq-analog-red" = {} [data_fields] "https://gitlab.com/nz_brian/garmin.pacer" = {} "https://gitlab.com/nz_brian/garmin.datafield.timeanddistance" = {} "https://gitlab.com/twk3/currento2" = {} [device_apps] "https://gitlab.com/ApnoeMax/apnoe-statik-timer" = {} "https://gitlab.com/btpv/zermeloforgarmin/" = {} ``` [`README.md`]: ../README.md [`awesome.toml`]: ./awesome.toml [Connect IQ app library]: https://apps.garmin.com ================================================ FILE: awesome-generator/awesome.toml ================================================ [watch_faces] "https://github.com/30Wedge/SwagginNumerals" = {} "https://github.com/ATGH15102AFMLD/Watchface-Cuphead" = {} "https://github.com/AYCHPlus/AYCHFace" = {} "https://github.com/AmitPandya007/GarminSampleWatch" = {} "https://github.com/Anemosx/aion" = {} "https://github.com/BDH-Software/ThePlanets-Watchface" = {} "https://github.com/BodyFatControl/garmin_watchface" = {} "https://github.com/Chemaclass/BinaryWatchFace" = {} "https://github.com/Chiocciola/Graphomatic" = {} "https://github.com/ChrisWeldon/GarminMinimalVenuWatchface" = {} "https://github.com/CodyJung/connectiq-apps" = {} "https://github.com/Cutwell/garmin-celestial-watchface" = {} "https://github.com/DRG-developer/DRG-Clutterless" = {} "https://github.com/DRG-developer/DRG-Essential" = {} "https://github.com/DRG-developer/DRG-Nathos" = {} "https://github.com/DRG-developer/DRG_SNT_3" = {} "https://github.com/DeCaPa/MyBigDate" = {} "https://github.com/DenysTT/Garmin_BackToTheFuture_WatchFace" = {} "https://github.com/Gumix/garmin-watchfaces" = {} "https://github.com/HanSolo/digital" = {} "https://github.com/HanSolo/digital5" = {} "https://github.com/HikiQ/DistanceFace" = {} "https://github.com/Holger-L/EasyDisplay" = {} "https://github.com/HookyQR/TidyWatch" = {} "https://github.com/IanGrainger/philippe-watchface" = {} "https://github.com/JoopVerdoorn/DR4c0" = {} "https://github.com/JoopVerdoorn/DR4c1" = {} "https://github.com/JoopVerdoorn/DR4c2" = {} "https://github.com/JoopVerdoorn/DR5c2" = {} "https://github.com/JoopVerdoorn/DR6c0" = {} "https://github.com/JoopVerdoorn/DR6c1" = {} "https://github.com/JoopVerdoorn/DR6c2" = {} "https://github.com/JoopVerdoorn/DR7c0" = {} "https://github.com/JoopVerdoorn/DR7c2" = {} "https://github.com/JoopVerdoorn/DR8-10c0" = {} "https://github.com/JoopVerdoorn/DU8-10c3" = {} "https://github.com/JoshuaTheMiller/Multivision-Watch" = {} "https://github.com/KWottrich/TimelyFenix" = {} "https://github.com/Korimsoft/ConnectIQ-ProgbarWatchFace" = {} "https://github.com/Laverlin/Yet-Another-WatchFace" = {} "https://github.com/MrJacquers/GarminBlendWatchFace" = {} "https://github.com/NickSteen/BYOD-Watchface" = {} "https://github.com/OliverHannover/Aviatorlike" = {} "https://github.com/OliverHannover/Aviatorlike_1Hz" = {} "https://github.com/OliverHannover/Formula_1" = {} "https://github.com/Peterdedecker/kudos" = {} "https://github.com/Prime1Code/OnAGlimpse" = {} "https://github.com/RyanDam/Infocal" = {} "https://github.com/SarahBass/BanjoGarmin" = {} "https://github.com/SarahBass/BeachKittyGarmin" = {} "https://github.com/SarahBass/BeetleJuice" = {} "https://github.com/SarahBass/CandyAdventure" = {} "https://github.com/SarahBass/Cycle-View-Garmin-Watch-Pig" = {} "https://github.com/SarahBass/Data-Heavy-Garmin-Watchface" = {} "https://github.com/SarahBass/GarminKirby" = {} "https://github.com/SarahBass/HalloweenCat" = {} "https://github.com/SarahBass/Ocean" = {} "https://github.com/SarahBass/PocketAsh" = {} "https://github.com/SarahBass/PocketPika" = {} "https://github.com/SarahBass/PokemonFishing" = {} "https://github.com/SarahBass/PokemonGarmin" = {} "https://github.com/SarahBass/PoolPanda" = {} "https://github.com/SarahBass/Rainforest" = {} "https://github.com/SarahBass/Virtual-Garmin-Pet" = {} "https://github.com/SarahBass/VirtualPetMonkey" = {} "https://github.com/SarahBass/VirtualStarPetGarmin" = {} "https://github.com/SarahBass/VirtualStarWatchGARMIN" = {} "https://github.com/SarahBass/YoshiGarmin" = {} "https://github.com/SarahBass/blackcatGarmin" = {} "https://github.com/StefanStefanoff/VivoactiveAtreliosWatchFace" = {} "https://github.com/SylvainGa/crystal-face" = {} "https://github.com/ToryStark/connect-iq" = {} "https://github.com/WHalford/WHatch4Me" = {} "https://github.com/adamdanielczyk/garmin-mini-chrono" = {} "https://github.com/ahuggel/SwissRailwayClock" = {} "https://github.com/akendrick451/AKInstinctQuotesStatsMoveBar" = {} "https://github.com/aklarl/BavarianWatchFace" = {} "https://github.com/alni/AlniLargeTimeWatchFace" = {} "https://github.com/andriijas/connectiq-apps" = {} "https://github.com/ankineri/gweatherwatch" = {} "https://github.com/antonioasaro/GARMIN-AMD_Watchface" = {} "https://github.com/ayaromenok/WatchFaceMonospace" = {} "https://github.com/backface/AnalogSeed" = {} "https://github.com/berryk/ConnectIQ-WorldTime-Face" = {} "https://github.com/bhugh/ElegantAnalog-Watchface" = {} "https://github.com/blotspot/garmin-watchface-protomolecule" = {} "https://github.com/bodnar13/JBWatch" = {} "https://github.com/bodyazn/COVID19WF" = {} "https://github.com/bombsimon/garmin-seaside" = {} "https://github.com/cekeller6121/Garmin-Watchface" = {} "https://github.com/chakflying/tactix-fenix" = {} "https://github.com/cizi/Sundance" = {} "https://github.com/claudiocandio/Garmin-WatchCLC" = {} "https://github.com/cy384/copernicus" = {} "https://github.com/darrencroton/Snapshot" = {} "https://github.com/darrencroton/SnapshotHR" = {} "https://github.com/darrencroton/SnapshotRHR" = {} "https://github.com/darrencroton/SnapshotWatch" = {} "https://github.com/dbanno/ConnectIQ-8-BitWatch" = {} "https://github.com/dbcm/KISSFace" = {} "https://github.com/dennybiasiolli/garmin-connect-iq" = {} "https://github.com/derbartigelady/Tac" = {} "https://github.com/dev-whiterice/Essence" = {} "https://github.com/deviammx/dexli-watchface" = {} "https://github.com/dimasmith/binary-clock" = {} "https://github.com/dmllr/vaguetime-watch-face" = {} "https://github.com/domosia/Retro-Quartz-Digital-Watch" = {} "https://github.com/douglasr/connectiq-logo-analog" = {} "https://github.com/dryotta/garmin-watchface-40d-mip-power" = {} "https://github.com/eiveiv/erock20" = {} "https://github.com/eldes/presbyopia-watch-face" = {} "https://github.com/elp87/elp87GarminWatchFace" = {} "https://github.com/erikvb/Digital5Reloaded" = {} "https://github.com/fabrikant/FontLessFace" = {} "https://github.com/fabrikant/LowEnergyFace" = {} "https://github.com/fabrikant/LowEnergyFace2" = {} "https://github.com/fabrikant/WWF" = {} "https://github.com/fabrikant/WWF4" = {} "https://github.com/fabrikant/WWF5" = {} "https://github.com/fevieira27/MoveToBeActive" = {} "https://github.com/fjbenitog/digital-watch-cas10" = {} "https://github.com/fuebaer/connect-iq" = {} "https://github.com/funix83/Funix-Watch" = {} "https://github.com/groovc/connectiq-watch-faces" = {} "https://github.com/hiddewie/garmin-watch-face" = {} "https://github.com/hurenkam/AnalogExplorerWatchFace" = {} "https://github.com/jchabsi/RunnerAttitude" = {} "https://github.com/jchen1/ripoff-watch-face" = { description = "Shows how to use custom fonts. https://jeffchen.dev/posts/Garmin-Watch-Faces-Custom-Fonts-On-MacOS/ " } "https://github.com/jeffwyeh/Infocal" = {} "https://github.com/jensws80/JSClock" = {} "https://github.com/jm355/wf" = {} "https://github.com/joakim-ribier/ftw-garmin" = {} "https://github.com/johndifini/cryptocurrency-watchface" = {} "https://github.com/jonasbcdk/CleanSteps" = {} "https://github.com/jonathan-beebe/garmin-offset-watch-face" = {} "https://github.com/jonathandaliva/Fenix5" = {} "https://github.com/jpg63/crystal-face-jpg63" = {} "https://github.com/jrhahn/daytimeWatchFace" = {} "https://github.com/kelnage/digital-simplicity" = {} "https://github.com/kevin940726/shy-watch-face" = {} "https://github.com/kevinboone/BAWF" = {} "https://github.com/krasimir/kago" = {} "https://github.com/kromar/garmin_fenix3" = {} "https://github.com/lanker/wf01" = {} "https://github.com/laurencee9/Watch-Face-Garmin" = {} "https://github.com/lcj2/ciq_binarywatch" = {} "https://github.com/ldscavo/fitface" = {} "https://github.com/le-cds/connectiq-faceymcwatchface" = {} "https://github.com/ledouxe/Slanted280" = {} "https://github.com/ludw/Segment34" = {} "https://github.com/ludw/Segment34mkII" = {} "https://github.com/lukaszgruca/SilverWatchFace" = {} "https://github.com/macherel/DaylightWF" = {} "https://github.com/mannyray/StressWatchFace" = {} "https://github.com/markdotai/m1" = {} "https://github.com/markdotai/m2" = {} "https://github.com/matei-tm/garmin-m8m" = {} "https://github.com/mcvnh/ximpo" = {} "https://github.com/miamo/batman" = {} "https://github.com/micooke/LetsGetDigital" = {} "https://github.com/modus75/RaVel-GarminDigitalWatchFace" = {} "https://github.com/mpl75/anyaWatches" = {} "https://github.com/mrmarbury/garmin_mnmlst_watchface" = {} "https://github.com/myneur/late" = {} "https://github.com/nicolas-gte/RetroFace" = {} "https://github.com/nldroid/Spotlight" = {} "https://github.com/okdar/smartarcs" = {} "https://github.com/okdar/smartarcsactive" = {} "https://github.com/okdar/smartarcstrip" = {} "https://github.com/onryou/framework245" = {} "https://github.com/oyvindse/Anker" = {} "https://github.com/patrickpl/WatchOfTheRings" = {} "https://github.com/pencilitin/orbit-face" = {} "https://github.com/pierre-muth/HandAvoidance" = {} "https://github.com/plaets/connectiq-xclock" = {} "https://github.com/psjo/arcsin" = {} "https://github.com/psjo/darktimes" = {} "https://github.com/psjo/dotter" = {} "https://github.com/psjo/felt" = {} "https://github.com/rain-dl/DayRound" = {} "https://github.com/samuelmr/garmin-abouttime" = {} "https://github.com/sarahemm/LimitFace" = {} "https://github.com/shbumba/SimplePixels" = {} "https://github.com/shortattentionspan/Aviatorlike" = {} "https://github.com/shortattentionspan/garmin-watchface" = {} "https://github.com/shurupyan/stValentineFace" = {} "https://github.com/simllll/garmin-pedro-watchface" = {} "https://github.com/sixtop/Watch-Face-Garmin" = {} "https://github.com/slakhani1231/Triforce-Watch-Face" = {} "https://github.com/slyoldfox/slyface" = {} "https://github.com/sparksp/Analog24" = {} "https://github.com/springle/sleepy_monkey" = {} "https://github.com/starryalley/eleven-forty-five" = {} "https://github.com/ste616/garmin-sidereal-watchface" = {} "https://github.com/sudarsanyes/thirdface" = {} "https://github.com/sunpazed/garmin-djcat" = {} "https://github.com/sunpazed/garmin-drawaa" = {} "https://github.com/sunpazed/garmin-flags" = {} "https://github.com/sunpazed/garmin-hedgetime" = {} "https://github.com/sunpazed/garmin-mickey" = {} "https://github.com/sunpazed/garmin-nyan-cat" = {} "https://github.com/sunpazed/garmin-oz" = {} "https://github.com/sunpazed/garmin-pollock" = {} "https://github.com/sunpazed/garmin-vangogh" = {} "https://github.com/sura0111/GarminWatchFaceSuccessCircle" = {} "https://github.com/thekr1s/garmin_wordclock" = {} "https://github.com/tomfogg/garmin-roundedtext" = {} "https://github.com/tumb1er/ElPrimero" = {} "https://github.com/usernzb/ActiAnalog3" = {} "https://github.com/victorpaul/garmin-watchFace" = {} "https://github.com/vmaywood/Garmin-Watch-Faces" = {} "https://github.com/voseldop/timeless" = {} "https://github.com/warmsound/crystal-face" = {} "https://github.com/willful-it/cara-one" = {} "https://github.com/wolffshots/snout" = {} "https://github.com/worksasdesigned/z1_watchface" = {} "https://github.com/wwarby/iconic" = {} "https://github.com/yarmatr/BGConnectUI" = {} "https://github.com/zRenard/zRenardWatch" = {} "https://github.com/zRenard/zRenardWatch2" = {} "https://github.com/zetxek/aface-garmin-watchface" = {} "https://gitlab.com/jsteinkamp/Simplog" = {} "https://gitlab.com/keithwberry/worldtime-crystal" = {} "https://gitlab.com/knusprjg/plotty-mcclockface" = {} "https://gitlab.com/nz_brian/garmin.watch.analogplus" = {} "https://gitlab.com/ravenfeld/Connect-IQ-WatchFace" = {} [data_fields] "https://github.com/ActiveLook/Garmin-Datafield-sample-code" = {} "https://github.com/AlexBarinov/GarminHikeDifficulty" = { description = "Calculates your real time Shenandoah's Hiking Difficulty as defined on National Park Service site" } "https://github.com/Bimtino/ActivityMonitor" = {} "https://github.com/Fra-Sti/Sailing-Instrument" = {} "https://github.com/Likenttt/GRun-Chinese" = {} "https://github.com/ViktorStagge/ZoneTraining" = { description = "A Zone Training app for Garmin Watches." } "https://github.com/adamml/tempo-trainer" = {} "https://github.com/axl13/PowerAdjuster" = {} "https://github.com/britiger/PauseTimer-connectiq" = {} "https://github.com/britiger/PauseTimer-connectiq-cm" = {} "https://github.com/bugjam/garmin-eta" = {} "https://github.com/bunnyhu/GarminDashboardBlock" = {} "https://github.com/bunnyhu/GarminSpeedBar" = {} "https://github.com/chfr/garmin-avg-speed-plus" = {} "https://github.com/christoph-lucas/garmin-minutes-per-powerkilometer-field" = { description = "A data field for Garmin devices that displays the minutes per power kilometer" } "https://github.com/clementbarthes/GarminCogDisplay" = {} "https://github.com/creacominc/connectiq-PowerField" = {} "https://github.com/danielmitd/datafields" = {} "https://github.com/danipindado/Lap-average-vertical-speed" = { description = "Average vertical lap speed" } "https://github.com/davisben/edgecycle" = {} "https://github.com/der-Dod/jumps" = {} "https://github.com/dhague/bt-ats-ciq-datafield" = {} "https://github.com/djs2014/whatpower" = { description = "What app power" } "https://github.com/djs2014/whatspeed" = { description = "What app speed" } "https://github.com/dmuino/HMFields" = {} "https://github.com/dodor84/data-field" = { description = "Test data field" } "https://github.com/dyuri/garmin-repafield" = {} "https://github.com/ebolefeysot/CIQ_InstantPcMAS" = {} "https://github.com/ebolefeysot/CIQ_PcvVo2max" = {} "https://github.com/ebottacin/OmniBikeField" = {} "https://github.com/evilwombat/HikeFieldv2" = {} "https://github.com/evilwombat/HikeFieldv2-forked" = {} "https://github.com/fabiobaltieri/ciq-battery-field" = {} "https://github.com/fabiobaltieri/ciq-nrf-blinky" = {} "https://github.com/fabiobaltieri/spotlight" = {} "https://github.com/fellrnr/Fellrnrs-Datafield-ActiveLook" = {} "https://github.com/flocsy/BodyBatteryDF" = {} "https://github.com/flocsy/DFDetector" = {} "https://github.com/flocsy/FitFieldWasterDF" = {} "https://github.com/flowstatedev/ciq-runpower" = {} "https://github.com/gcormier9/GRun" = {} "https://github.com/grafstrom/ORun" = {} "https://github.com/guibber/4caster" = {} "https://github.com/holubp/Connect-IQ-lap-max-speed" = {} "https://github.com/imgrant/AuxHR" = {} "https://github.com/imgrant/EnergyExpenditureField" = {} "https://github.com/imgrant/FlexiRunner" = {} "https://github.com/imgrant/RunningEconomyField" = {} "https://github.com/ithiel01/CombiSpeed" = {} "https://github.com/janverley/405HR" = {} "https://github.com/jimmyspets/HCU" = {} "https://github.com/kolyuchii/TravelCalc" = {} "https://github.com/kopa/BikersField" = {} "https://github.com/kopa/RunnersField" = {} "https://github.com/landnavapp/LandNavApp" = {} "https://github.com/larspnw/larsBikeDatafields" = {} "https://github.com/lcj2/ciq_monkeyfuel" = {} "https://github.com/maca88/E-Bike-Edge-MultiField" = { description = "Displays up to 10 data fields from an ANT+ LEV (Light Electronic Vehicle) device" } "https://github.com/maca88/SmartBikeLights" = {} "https://github.com/maca88/TempeField" = {} "https://github.com/markdotai/emtb" = {} "https://github.com/markwmuller/GRun" = {} "https://github.com/matthiasmullie/connect-iq-datafield-accurate-pace" = {} "https://github.com/matthiasmullie/connect-iq-datafield-calories-equivalent" = {} "https://github.com/mattv23v/UVIndexDataField" = { description = "DataField to show UV index" } "https://github.com/mirko77/PBike" = { description = "Configurable Garmin FR645M datafield" } "https://github.com/mirko77/PRun" = { description = "Configurable Garmin FR645M datafield" } "https://github.com/mizamae/GarminSlopeDatafield" = {} "https://github.com/mpl75/anyaBike" = { description = "Data field for cyclists who have their watch attached to their handlebars" } "https://github.com/nickmacias/Garmin-AvgGrade" = {} "https://github.com/nickmacias/Garmin-ClimbRate" = {} "https://github.com/nickmacias/Garmin-LSGrade" = {} "https://github.com/pauljohnston2025/breadcrumb-garmin" = {} "https://github.com/peregin/connectiq-hr-zones" = {} "https://github.com/peregin/connectiq-time-battery" = {} "https://github.com/pinselimo/BackAtDaylight" = {} "https://github.com/prenard/DF_RoadBook" = { description = "This data field allows display of a rolling roadbook on your Garmin Edge 820/1000" } "https://github.com/prenard/DF_TorqueAVG" = { description = "Display average torque value in N-m during your training" } "https://github.com/ray0711/BTHomeIQ" = {} "https://github.com/rconradharris/DaylightLeft" = {} "https://github.com/rgergely/polesteps" = {} "https://github.com/rgergely/steps2fit" = {} "https://github.com/roelofk/HeartRateRunner" = {} "https://github.com/sam-dumont/GarminGoProDatafield" = { description = "Control your GoPro camera from a Datafield" } "https://github.com/sam-dumont/RaceWithPower" = {} "https://github.com/sam-dumont/RunPowerWorkoutNG" = {} "https://github.com/sam-dumont/connectiq-workout-datafields" = {} "https://github.com/seajay/ColourHR" = {} "https://github.com/simonl-ciq/RollingAverage" = {} "https://github.com/simonl-ciq/SimplyTime" = {} "https://github.com/simonl-ciq/SunTimes" = {} "https://github.com/simonmacmullen/chart-datafields" = {} "https://github.com/snorrehu/Connect-iQ-CGM-datafield" = {} "https://github.com/stirnim/garmin-andytimer" = {} "https://github.com/stirnim/garmin-lastsplit" = {} "https://github.com/stirnim/garmin-swissgrid" = {} "https://github.com/tao-j/Keiser2Garmin" = {} "https://github.com/thisdougb/SinceStopped" = {} "https://github.com/to-ko/EveryTile" = {} "https://github.com/tobiaslj/TrendPace" = { description = "This data field shows the average pace for the past 30 seconds together with a trend indication" } "https://github.com/tommyvdz/RunPowerWorkout" = {} "https://github.com/torhovland/garmin-endurance-in-zone" = {} "https://github.com/travisvitek/connectiq_laps_datafield" = {} "https://github.com/tymmej/HikeField" = {} "https://github.com/victornottat/garmin-trimp" = {} "https://github.com/victornottat/garmin-trimp-perhour" = {} "https://github.com/vinzenzs/garmin-fartlek4fun" = { description = "Play some fun Fartleks" } "https://github.com/vovan-/cyclist-datafiled-garmin" = {} "https://github.com/vovan-/swimmer-datafiled-garmin" = {} "https://github.com/wubbl0rz/DataChampGarmin" = { description = "More than one data field for bike computers" } "https://github.com/wwarby/walker" = {} "https://gitlab.com/harryonline/smart-cadence" = {} "https://gitlab.com/nz_brian/HiVisRunField" = { description = "Easy to read data field" } "https://gitlab.com/ravenfeld/Connect-IQ-DataField-BackHome" = { description = "Indicates the distance and direction to be taken from the starting point of your activity" } "https://gitlab.com/ravenfeld/Connect-IQ-DataField-Battery" = {} "https://gitlab.com/ravenfeld/Connect-IQ-DataField-GPS" = {} "https://gitlab.com/ravenfeld/Connect-IQ-DataField-OC" = {} "https://gitlab.com/ravenfeld/Connect-IQ-DataField-Speed" = { description = "Colorized speed gauge" } "https://gitlab.com/ravenfeld/Connect-IQ-DataField-VirtualPartner" = { description = "Virtual race partner" } "https://gitlab.com/ravenfeld/connect-iq-datafield-runner" = { description = "Fields of data that can correct the distance course by pressing lap" } [widgets] "https://github.com/11samype/CIQBitcoinWidget" = {} "https://github.com/BDH-Software/ThePlanets-Widget" = {} "https://github.com/ChelsWin/Tasker-Trigger" = {} "https://github.com/GuMiner/garmin-JustOneButton" = {} "https://github.com/JuliensLab/Garmin-BatteryAnalyzer" = {} "https://github.com/Likenttt/DogecoinToTheMoon" = {} "https://github.com/METIQ-Solutions/evccg" = {} "https://github.com/Marios007/WoP" = { description = "Pregnancy Widget for Garmin Watches" } "https://github.com/PlanetTeamSpeakk/UC-Widget" = {} "https://github.com/SylvainGa/BatteryMonitor" = {} "https://github.com/SylvainGa/Calculator" = {} "https://github.com/SylvainGa/Flashlight" = {} "https://github.com/SylvainGa/Garmin-WeeWX" = {} "https://github.com/SylvainGa/Tesla-Link" = {} "https://github.com/TimZander/slope-widget" = {} "https://github.com/Vertumnus/garmin-ioBrokerVis" = {} "https://github.com/YoungChulDK/GarminCryptoPrices" = {} "https://github.com/ad220/gopro-remote-connectiq" = {} "https://github.com/admsteck/ConnectIQ" = {} "https://github.com/aleung/ConnectIQ-LogIt" = {} "https://github.com/aleung/ciq-sensorhistory" = {} "https://github.com/antirez/iqmeteo" = {} "https://github.com/aronsommer/WebRequestGlance-Widget" = { description = "Modified version of the Garmin IQ Connect WebRequest sample" } "https://github.com/aronsommer/WebRequestMultiple-Widget" = {} "https://github.com/ascending-edge/garmin-tally" = {} "https://github.com/bbary/Jokes" = {} "https://github.com/bbary/book_read_counters" = { description = "Basic counter widget with 3 different counters to keep track of book reading or memorization" } "https://github.com/bbary/counters" = {} "https://github.com/bhugh/slope-widget" = {} "https://github.com/blaskovicz/garmin-nest-camera-control" = {} "https://github.com/bombsimon/garmin-swish-qr" = {} "https://github.com/britiger/criticalmaps-garmin-widget" = {} "https://github.com/bunburya/LPTG" = {} "https://github.com/cedric-dufour/connectiq-widget-pilotaltimeter" = {} "https://github.com/cedric-dufour/connectiq-widget-pilotsrss" = {} "https://github.com/cedric-dufour/connectiq-widget-totp" = {} "https://github.com/chemikadze/garmin-authenticator" = {} "https://github.com/dabastynator/GarminSmartHome" = {} "https://github.com/danielsiwiec/garmin-connect-seed" = { description = "This is a seed project for writing Garmin Connect IQ application" } "https://github.com/dbucher97/iqbeerpongwidget" = {} "https://github.com/desyat/OpenWeatherMapWidget" = { description = "Garmin Widget connecting to Open Weather Map" } "https://github.com/dividebysandwich/SolarStatus-Garmin" = {} "https://github.com/djdevin/septa-rr-garmin" = {} "https://github.com/elgaard/buttonStroke" = {} "https://github.com/eternal-flame-AD/git-notifications-ciq" = {} "https://github.com/fabrikant/AllSensors" = { description = "Widget with data from multiple sensors" } "https://github.com/fabrikant/DonnerWetter" = { description = "Widget for openweatrmap.org service" } "https://github.com/fabrikant/Galendar" = { description = "Google calendar implementation" } "https://github.com/fabrikant/LetMeIn" = { description = "Create and display QR codes" } "https://github.com/fabrikant/SensorHistoryWidget" = { description = "Displays sensor history: Heart rate, pressure, altitude, temperature, oxygen saturation" } "https://github.com/felwal/avganar" = {} "https://github.com/fhdeutschmann/ZuluTime" = {} "https://github.com/frontdevops/garmin-widget-battery" = {} "https://github.com/gcaufield/TogglIQ" = {} "https://github.com/geel97/dcc-connectiq" = {} "https://github.com/hakonrossebo/FootballFixtures" = {} "https://github.com/haraldh/SunCalc" = {} "https://github.com/hasscontrol/hasscontrol" = {} "https://github.com/hatl/hasscontrol" = {} "https://github.com/hexaguin/Connect-IQ-ThingSpeak-Client" = {} "https://github.com/individual-it/BatteryGuesstimate" = {} "https://github.com/jctim/otp-ciq" = {} "https://github.com/jimmycaille/SensorHistoryWidget" = {} "https://github.com/jonathanburchmore/Enphase" = {} "https://github.com/jurask/authentificator" = {} "https://github.com/lkjh654/HabitTree" = { description = "Garmin widget that supports resisting bad habits by growing a tree" } "https://github.com/maca88/BikeLightsControl" = {} "https://github.com/macherel/Barcode-Wallet" = { description = "Display various type of barcodes (Simple barcode or 2D barcodes like QR code or Aztec code)" } "https://github.com/macherel/Connect-IQ-QR-Code-Viewer" = { description = "A widget that can display QR Code on Garmin watch" } "https://github.com/madskonradsen/garmin-iq-shortsweather" = {} "https://github.com/markwmuller/PregnancyWidget" = {} "https://github.com/mayaleh/Maya.CryptoFiatPrice" = { description = "Explore the exchange rate of some crypto currencies" } "https://github.com/mettyw/activity_view" = {} "https://github.com/miharekar/ForecastLine" = {} "https://github.com/mikeller/garmin-divesite-weather-widget" = {} "https://github.com/mriscott/GarminRings" = {} "https://github.com/natabat/FertiliQ" = {} "https://github.com/okdar/lostandfound" = {} "https://github.com/openhab/openhab-garmin" = {} "https://github.com/pedlarstudios/WordOfTheDay" = {} "https://github.com/pyrob2142/FastingWidget" = {} "https://github.com/serhuz/CryptoMarket" = {} "https://github.com/sigsegvat/connectIqIotButton" = {} "https://github.com/simonl-ciq/AltitudeWidget" = {} "https://github.com/simonl-ciq/MagneticDeclination" = {} "https://github.com/simonl-ciq/SimplyDaylightWidget" = {} "https://github.com/simonl-ciq/SimplyHeightWidget" = {} "https://github.com/simonl-ciq/SimplyLunar" = {} "https://github.com/simonl-ciq/SimplySolar" = {} "https://github.com/simonl-ciq/SimplyWeather" = {} "https://github.com/simonmacmullen/activity-widget" = {} "https://github.com/simonmacmullen/hr-widget" = {} "https://github.com/simonmacmullen/instrument-panel" = {} "https://github.com/srwalter/garmin-tesla" = {} "https://github.com/starryalley/Unquestionify" = {} "https://github.com/starryalley/garmin-birds-around" = {} "https://github.com/tanstaaflFH/BabyLog-Feed-ConnectIQ" = {} "https://github.com/tanstaaflFH/BabyLog-Sleep-ConnectIQ" = {} "https://github.com/tanvir-dhanjal/Garmin-NBA-Widget" = {} "https://github.com/toskaw/ImageNotify" = {} "https://github.com/tumb1er/BetterBatteryWidget" = {} "https://github.com/uaraven/otpauth-ciq" = {} "https://github.com/valgit/WeatherWid" = {} "https://github.com/yamaserif/garminSmartLockApi" = { description = "Garmin Smartwatch Widget for Smart Lock with API provided" } "https://github.com/zivke/SimpTemp" = {} "https://github.com/zmullett/connectiq-sonos" = {} "https://gitlab.com/harryonline/emergencyinfo" = {} "https://gitlab.com/harryonline/fortune-quote" = { description = "This widget show a random quote from the Gigaset Fortune collection" } "https://gitlab.com/harryonline/timerwidget" = {} [device_apps] "https://github.com/333fred/fta-monitor-garmin-watchapp" = {} "https://github.com/BDH-Software/TheStars" = {} "https://github.com/BleachDev/GarminQ" = {} "https://github.com/BleachDev/Rainy" = {} "https://github.com/Byeongcheol-Kim/Meditate" = {} "https://github.com/CernovApps/rubik-watch-timer" = { description = "This is a timer for Rubik Cube, with features that makes it similar to the WCA rules." } "https://github.com/Cybermite/GolfApp" = {} "https://github.com/DaWenning/garmin-football-ref-watch" = {} "https://github.com/DylanBarratt/Garmin-Coin-Flip" = {} "https://github.com/Gualor/garmin-gotchi" = {} "https://github.com/HerrRiebmann/Stretch" = {} "https://github.com/IrishMarineInstitute/connectiq-ido" = {} "https://github.com/Judex-77/Moon-App-Simulator" = {} "https://github.com/K4pes/ultiCount" = { name = "UltiCount", description = "Keep track of scores and gender ratios during games of Ultimate Frisbee" } "https://github.com/KatieXC/GarMenu_GarminConnectIQApp" = {} "https://github.com/KieranDotCo/whats-the-score" = {} "https://github.com/Laverlin/Yet-Another-Sailing-App" = {} "https://github.com/MarkusDatgloi/ebikeApp" = {} "https://github.com/OpenSeizureDetector/Garmin_SD" = {} "https://github.com/ROSENET-BTU/Garmin-App" = {} "https://github.com/Siratigui/garmin_app" = {} "https://github.com/Sonicious/GarminApps" = {} "https://github.com/SverreWisloff/TackingMaster" = {} "https://github.com/TDF-PL/TAKWatch-IQ" = {} "https://github.com/Tamarpe/CatFacts" = {} "https://github.com/Tkadla-GSG/garmin" = { description = "Collection of apps for Garmin wearable hardware written in Monkey C" } "https://github.com/TrainAsONE/trainasone-connectiq" = {} "https://github.com/YoungChulDK/CryptoPricesGarmin" = {} "https://github.com/abs0/GarminWebRequestTest" = {} "https://github.com/adamjakab/iHIIT" = {} "https://github.com/adekkpl/garmin-agv-skating" = {} "https://github.com/aiMonster/Garmin-Contrast-Shower" = {} "https://github.com/akamming/Garmoticz" = {} "https://github.com/alanfischer/hassiq" = {} "https://github.com/alexphredorg/ConnectIqSailingApp" = {} "https://github.com/alfonso-orta/garmin_tomato_clock" = {} "https://github.com/andan67/wormnav" = {} "https://github.com/anickle060193/rep_track_react_native" = {} "https://github.com/ariosavi/Persian-Calendar-for-Garmin-Watch" = {} "https://github.com/arquicanedo/barbecueboss" = {} "https://github.com/bbary/Salati" = {} "https://github.com/bderusha/GarminIQ-CoachCompanion" = {} "https://github.com/bhugh/ThePlanets" = {} "https://github.com/blackdogit/connectiq-apps" = {} "https://github.com/blackshadev/wayfinder" = {} "https://github.com/blaskovicz/garmin-tplink-cloud-control" = {} "https://github.com/blkfribourg/WheelDash" = { description = "This is a standalone application that works with Begode, Leaperkim, Kingsong, inmotion V11 & V12 wheels and VESC based PEV" } "https://github.com/bombsimon/garmin-pace-calculator" = {} "https://github.com/brandon-rhodes/brandon-garmin" = {} "https://github.com/breber/2048-iq" = {} "https://github.com/breber/helicopter-iq" = { description = "Helicopter game for Garmin" } "https://github.com/breber/nest-iq" = {} "https://github.com/capoaira/TicTacToe_Garmin_Connect_IQ" = {} "https://github.com/capoaira/Timer_Garmin_Connect_IQ" = {} "https://github.com/cedric-dufour/connectiq-app-glidersk" = {} "https://github.com/cedric-dufour/connectiq-app-towplanesk" = {} "https://github.com/celo-vschi/garmin-intervals" = { description = "Intervals applcation for Forerunner® 235, Forerunner ® 245 (Music) and all fēnix® 6 Pro devices." } "https://github.com/cfculhane/ConnectIQ-LIFX" = {} "https://github.com/ch1bo/garmin-otp-authenticator" = {} "https://github.com/chakflying/flight-watcher" = {} "https://github.com/chakflying/hkoradar" = {} "https://github.com/chanezgr/IQwprimebal" = {} "https://github.com/csekri/fenix-calculator" = {} "https://github.com/danielsiwiec/fitnessTimer" = { description = "Fitness timer" } "https://github.com/danielsiwiec/tabataTimer" = {} "https://github.com/danielsiwiec/timebomb" = {} "https://github.com/danielsiwiec/waypoints-app" = { description = "Easily send waypoints from Google Maps to your device. No registration required!" } "https://github.com/danisik/nThlon" = {} "https://github.com/davedoesdemos/ConnectIQ-Watch-IoT" = {} "https://github.com/dazey77/Horizontal-speedo-rep" = {} "https://github.com/derjust/sos-now" = {} "https://github.com/dkappler/kraken" = {} "https://github.com/dliedke/Meditate" = {} "https://github.com/eden159/garmin-checkpoint" = { description = "For people who want to know when the next checkpoint for a competition is" } "https://github.com/eferreyr/SimonGame" = {} "https://github.com/electrofloat/BPTransport-Garmin" = { description = "A Garmin Connect IQ app to view realtime public transport data" } "https://github.com/eriklupander/Fenix3GolfDistance" = {} "https://github.com/fabrikant/RoseOfWind" = {} "https://github.com/filarl/Ticker" = {} "https://github.com/flori/S2C" = {} "https://github.com/floriangeigl/Meditate" = {} "https://github.com/fmercado/telemeter" = {} "https://github.com/fo2rist/garmin-vehicle-keyfob" = {} "https://github.com/frenchtoast747/connectiq-packman" = {} "https://github.com/gaetanmarti/glidator" = {} "https://github.com/gatkin/commute-tracker" = {} "https://github.com/georgefang13/STRIDE_CIQ_CustomBleProfile" = { description = "Connect FR265 to your STRIDE hardware" } "https://github.com/gergo225/StepGetterWatch" = {} "https://github.com/hansiglaser/ConnectIQ" = {} "https://github.com/harknus/ManualHR" = {} "https://github.com/house-of-abbey/GarminHomeAssistant" = {} "https://github.com/hupei1991/FindTreasure" = {} "https://github.com/igorso/Garmin42" = {} "https://github.com/iuliux/BitcoinWatcher" = {} "https://github.com/jimmycaille/ShopListApp" = {} "https://github.com/jmnorma/SprintPace" = {} "https://github.com/johnnyw3/connectiq-watchapps" = {} "https://github.com/jravey7/CIQChecklist" = {} "https://github.com/kartoone/mybiketraffic" = {} "https://github.com/klimeryk/garmodoro" = {} "https://github.com/kolitiri/garmin-myBus-app" = {} "https://github.com/kzibart/Garmin_AcesUp" = {} "https://github.com/kzibart/Garmin_Blackjack" = {} "https://github.com/kzibart/Garmin_Farkle" = {} "https://github.com/kzibart/Garmin_FlappyWatch" = {} "https://github.com/kzibart/Garmin_Hangman" = {} "https://github.com/kzibart/Garmin_MasterMind" = {} "https://github.com/kzibart/Garmin_Pyramid" = {} "https://github.com/kzibart/Garmin_Sokoban" = {} "https://github.com/kzibart/Garmin_SpaceTrek" = {} "https://github.com/kzibart/Garmin_TileSlider" = {} "https://github.com/kzibart/Garmin_TriPeaks" = {} "https://github.com/kzibart/Garmin_Yahtzee" = {} "https://github.com/ldscavo/tea-timer" = {} "https://github.com/leCapi/RepCounter" = { description = "Repetition counter for Garmin" } "https://github.com/lucamrod/TriathlonDuathlonAquathlon" = {} "https://github.com/lucasasselli/garmin-podcasts" = {} "https://github.com/lukasbeckercode/CPR-Timer" = {} "https://github.com/marvik37/DiscGolf" = { description = "Disc golf app" } "https://github.com/matco/badminton" = {} "https://github.com/matmuc/SportMonitor" = {} "https://github.com/mazefest/SnakeIQ" = {} "https://github.com/mikeller/garmin-christchurch-bus-widget" = {} "https://github.com/mikkosh/Ballistics" = {} "https://github.com/mikkosh/DogTracker" = {} "https://github.com/mikkosh/shotgunsports" = {} "https://github.com/miss-architect/garmin-squash" = {} "https://github.com/mrohmer/CockpitOnlineGarminClient" = { description = "Garmin Watch Client for Cockpit XP Online via cockpit-online.rohmer.rocks" } "https://github.com/n-lahmi/GarminCallControls" = {} "https://github.com/noln/doughnuts-burnt" = {} "https://github.com/nubissurveying/Garmin_vivoactiveHR" = {} "https://github.com/pchng/connect-iq-totp" = {} "https://github.com/pedlarstudios/EggTimer" = {} "https://github.com/pedrorijo91/garmin-padel" = {} "https://github.com/phil-mitchell/garmin-curling" = {} "https://github.com/pintail105/SailingTools" = {} "https://github.com/pukao/GarminEmergencyContact" = {} "https://github.com/pukao/GarminSailing" = { description = "Sailing app for connectIQ Garmin" } "https://github.com/quickdk/uPaddle" = {} "https://github.com/rexMingla/low-battery-mode" = {} "https://github.com/rgrellmann/connectiq-bergsteigen-app" = {} "https://github.com/rjmccann101/MBO" = {} "https://github.com/rxkaminski/Garmin-SportTimerHR" = {} "https://github.com/sarahemm/DerbyLaps" = {} "https://github.com/sdgriggs/GarminDiscGolf" = {} "https://github.com/sharkbait-au/HRV_iq" = {} "https://github.com/shprung/garminIQ_HRonly" = {} "https://github.com/simonseo/garmin-otp-generator" = {} "https://github.com/sjager/GarminApps" = {} "https://github.com/slipperybee/connectiq-islamic-calendar" = {} "https://github.com/slipperybee/connectiq-jewish-calendar" = {} "https://github.com/sohaeb/Garmin_pomodoro" = {} "https://github.com/spikyjt/SailingTimer" = {} "https://github.com/sw-samuraj/garmin-inline-skating" = {} "https://github.com/tanvir-dhanjal/Garmin-Sudoku-Watch-App" = {} "https://github.com/toomasr/8-min-abs" = {} "https://github.com/toskaw/NotifyApp" = {} "https://github.com/tskf/MapOfflineGPS" = {} "https://github.com/valgit/GarminSailing" = {} "https://github.com/valgit/WeatherApp" = {} "https://github.com/valgit/virtual_sailing" = {} "https://github.com/vladmunteanu/monky" = {} "https://github.com/vtrifonov-esfiddle/Meditate" = {} "https://github.com/vtrifonov-esfiddle/TestHrv" = {} "https://github.com/weavercm/Connect-IQ-Work-Timer" = { description = "Allows you to keep track of your work time" } "https://github.com/werkkrew/ciq-hiit-tracker" = {} "https://github.com/werkkrew/ciq-orange-theory" = {} "https://github.com/winds-mobi/winds-mobi-client-garmin" = {} "https://github.com/worktrail/worktrail-garmin-connect-iq" = {} "https://github.com/xtruan/GpsPosition" = {} "https://github.com/xtruan/MorseCode" = {} "https://github.com/xtruan/TempoBPM" = {} "https://github.com/xtruan/WorkoutTimer" = {} "https://github.com/ydutertre/myvario" = {} "https://github.com/ydutertre/myvariolite" = {} "https://github.com/zbraniecki/ultitimer" = {} "https://github.com/zetxek/garmin-qr" = {} "https://github.com/zlelik/ConnectIqSailingApp" = {} "https://gitlab.com/ravenfeld/Connect-IQ-App-ChronoGym" = { name = "Chrono Gym", description = "Set count and rest timer" } "https://gitlab.com/ravenfeld/Connect-IQ-App-Compass" = { name = "Compass App", description = "Compass" } "https://gitlab.com/ravenfeld/Connect-IQ-App-Timer" = { name = "Timer", description = "Add several timer already registered" } [audio_content_providers] "https://github.com/memen45/SubMusic" = {} [barrels] "https://github.com/Likenttt/garmin-ciq-page-indicator" = {} "https://github.com/bombsimon/garmin-touch-keypad" = {} "https://github.com/bostonrwalker/navutils" = {} "https://github.com/britiger/CriticalMapsAPIBarrel" = {} "https://github.com/douglasr/ciqtools-cryptography" = { description = "An attempt to streamline the use of the Connect IQ Cryptography library" } "https://github.com/douglasr/ciqtools-graphing" = { description = "A clone of the graphing functionality present within Garmin devices natively" } "https://github.com/douglasr/ciqtools-number-picker" = { description = "Number picker barrel" } "https://github.com/douglasr/msgpack-monkeyc" = {} "https://github.com/hurenkam/WidgetBarrel" = {} "https://github.com/mannyray/ANTPlusHeartStrap" = { description = "Code for connecting your ANT+ heart strap to your garmin watch" } "https://github.com/mannyray/GarminBytePacking" = { description = "Garmin library that adds functions for manipulating ByteArrays, Floats, Doubles and Longs" } "https://github.com/mikkosh/AntAssetTracker" = {} "https://github.com/vtrifonov-esfiddle/ConnectIqDataPickers" = {} "https://gitlab.com/waterkip/opn-monkeyc" = {} [companion_apps] "https://github.com/AldoSusanto/mHealth-Project" = {} "https://github.com/Cougargriff/SensorTriggerIQ" = {} "https://github.com/MatyasKriz/ios-connect-iq-comms" = {} "https://github.com/Wheellog/Companion.Garmin" = {} "https://github.com/buessow/garmin" = {} "https://github.com/dougw/Garmin-ExampleApp-Swift" = {} "https://github.com/gimportexportdevs/gexporter" = {} "https://github.com/gimportexportdevs/gimporter" = {} "https://github.com/grigorye/Handsfree" = {} "https://github.com/kite247/Onewheel2Garmin" = {} "https://github.com/robertmpowell/OBD2Reader" = {} "https://github.com/starryalley/Unquestionify-android" = {} "https://github.com/urbandroid-team/Sleep-as-Android-Garmin-Addon" = {} [tools] "https://github.com/DavidBaddeley/connectiq-tester" = { description = "Fork of `connectiq-tester` with screenshot support"} "https://github.com/KristianP26/ble-scale-sync" = {} "https://github.com/Nick2bad4u/FitFileViewer" = {} "https://github.com/RobertWojtowicz/export2garmin" = {} "https://github.com/arpanghosh8453/garmin-grafana" = {} "https://github.com/blackdogit/connectiq-monkeyc" = {} "https://github.com/blackshadev/garmin-connectiq-release-action" = {} "https://github.com/bombsimon/garmin-screenshot" = {} "https://github.com/cedric-dufour/connectiq-app-rawlogger" = {} "https://github.com/cjsmith/react-native-connect-iq-mobile-sdk" = {} "https://github.com/cyberang3l/GarminMonkeyCBoilerPlate" = {} "https://github.com/cyberang3l/GarminSettingsFileParser" = {} "https://github.com/cyberang3l/garmin-linux-development-environment" = {} "https://github.com/cyberang3l/vim-monkey-c" = {} "https://github.com/flocsy/GarminSportsDev" = {} "https://github.com/flocsy/garmin-dev-tools" = {} "https://github.com/fulippo/share-your-garmin-workout" = {} "https://github.com/gcaufield/MonkeyContainer" = {} "https://github.com/gcaufield/MonkeyInject" = {} "https://github.com/gcaufield/MonkeyPack" = {} "https://github.com/gcaufield/MonkeyTest" = {} "https://github.com/hacdias/flowfit" = {} "https://github.com/himanushi/dithering-converter" = {} "https://github.com/jmackie/garminfit" = {} "https://github.com/kalemena/docker-connectiq" = {} "https://github.com/lindig/fit" = {} "https://github.com/maca88/directive-preprocessor" = {} "https://github.com/markw65/monkeyc-optimizer" = {} "https://github.com/markw65/prettier-extension-monkeyc" = {} "https://github.com/markw65/prettier-plugin-monkeyc" = {} "https://github.com/matco/action-connectiq-tester" = { description = "GitHub action for `connectiq-tester`"} "https://github.com/matco/connectiq-tester" = { description = "Docker image that can be used to run the tests \"Run No Evil\" of a ConnectIQ application" } "https://github.com/matin/garth" = {} "https://github.com/muktihari/fit" = {} "https://github.com/openivity/openivity.github.io" = {} "https://github.com/pcolby/connectiq-sdk-manager" = {} "https://github.com/pzl/ciqdb" = {} "https://github.com/semolina-solutions/rules_ciq" = {} "https://github.com/stadelmanma/fitparse-rs" = {} "https://github.com/sunpazed/garmin-tilemapper" = {} "https://github.com/tcgoetz/GarminDB" = {} "https://github.com/voltangle/kumitateru" = {} "https://github.com/zzyandzzy/fit-rust" = {} "https://marketplace.visualstudio.com/items?itemName=garmin.monkey-c" = { name = "VS Code Monkey C", description = "Official VS Code extension for Monkey C"} "https://www.angelcode.com/products/bmfont" = { name = "BM Font", description = "This program will allow you to generate bitmap fonts from TrueType fonts" } [miscellaneous] "https://developer.garmin.com/connect-iq/overview" = { name = "Official Garmin developer site", description = "Information about Garmin development and the Monkey C language" } "https://forums.garmin.com/developer/connect-iq" = { name = "Connect IQ developer forum", description = "Forum to talk anything Connect IQ related" } "https://garmin.watchfacebuilder.com" = { name = "Watch Face Builder", description = "Build (or download) watch faces in the browser" } "https://github.com/AndrewKhassapov/connect-iq" = {} "https://github.com/Artaud/CIQ-Comm-failure-sample" = {} "https://github.com/Likenttt/garmin-games" = {} "https://github.com/OpenGIS/Inreach-Mapshare" = { name = "inReach MapShare for WordPress", description = "Display your live inReach MapShare data on your WordPress Site" } "https://github.com/Peterdedecker/connectiq" = {} "https://github.com/Shmuma/garmin-public" = {} "https://github.com/YAWNICK/MonkeyAOC" = { description = "[Advent of Code](https://adventofcode.com) in Monkey C" } "https://github.com/ZachXu/NextMatchReminder" = {} "https://github.com/acrossthekyle/garmin" = { description = "Collection of projects created over the years for Garmin watches." } "https://github.com/arsfabula/Insta360-Remote-CIQ" = {} "https://github.com/creacominc/connectiq-PowerFieldTests" = {} "https://github.com/cyberang3l/garmin-monkey-c-neovim-language-server" = {} "https://github.com/cyberjunky/home-assistant-garmin_connect" = {} "https://github.com/douglasr/connectiq-samples" = {} "https://github.com/ekutter/CIQTest" = {} "https://github.com/fagalto/ConnectIQ" = { description = "Collection of ConnectIQ apps" } "https://github.com/ferranlala/GarminApps" = {} "https://github.com/flocsy/VibraTest" = {} "https://github.com/garmin/connectiq-apps" = {} "https://github.com/google/open-location-code" = {} "https://github.com/iperformance/garmin-conect" = { description = "A collection of Connect IQ apps and libraries" } "https://github.com/jstringer1/garmin-connectiq" = {} "https://github.com/klimeryk/vim-monkey-c" = {} "https://github.com/mkuthan/garmin-workouts" = {} "https://github.com/rbsexton/workspace-ConnectIQ" = {} "https://github.com/simonl-ciq/GridReference" = {} "https://github.com/sunpazed/garmin-ciqsummit17" = { description = "A basic widget that displays tweets from #ciqsummit17" } "https://github.com/sunpazed/garmin-complicate" = { description = "An example application that demonstrates system6 complications" } "https://github.com/sunpazed/garmin-complicate-circle" = { description = "An example application that demonstrates system6 complications" } "https://github.com/sunpazed/garmin-waketest" = { description = "Watchface to verify timings, and poll frequency of `onUpdate()`" } "https://github.com/sydspost/Garmin-Connect-Workout-and-Schedule-creator" = {} "https://github.com/waterkip/connectiq-sdk-docker" = {} ================================================ FILE: awesome-generator/src/bin/main.rs ================================================ use clap::Parser; #[derive(Parser)] #[command(name = "garmin")] #[command(bin_name = "garmin")] enum AwesomeGarminCli { /// Generate the README from `awesome.toml`. GenerateReadme, /// Compare what's in `awesome.toml` with a search result from Connect IQ apps. Compare(SearchArgs), /// Search Connect IQ for a keyword and print resources with source code. Search(SearchArgs), } #[derive(clap::Args)] #[command(about, long_about = "Search for keywords")] struct SearchArgs { /// Keyword to search for, e.g. `tennis`. keyword: String, } #[tokio::main] async fn main() { match AwesomeGarminCli::parse() { AwesomeGarminCli::GenerateReadme => awesome_generator::generate_readme().await.unwrap(), AwesomeGarminCli::Compare(args) => awesome_generator::compare(&args.keyword).await.unwrap(), AwesomeGarminCli::Search(args) => { awesome_generator::search::print_resource_urls(&args.keyword) .await .unwrap() } } } ================================================ FILE: awesome-generator/src/lib.rs ================================================ use futures::StreamExt; use gitlab::{api::AsyncQuery, AsyncGitlab}; use handlebars::{no_escape, Context, Handlebars, Helper, HelperResult, Output, RenderContext}; use octocrab::{models::Author, Octocrab}; use serde::{Deserialize, Serialize}; use serde_with::{serde_as, NoneAsEmptyString}; use std::{ collections::{BTreeMap, HashMap, HashSet}, io::Read, sync::{Arc, Mutex}, }; pub mod search; /// The template that will be used to render the README. const TEMPLATE: &str = include_str!("readme.md.hbs"); /// We do concurrent requests to GitHub and GitLab to speed up the process but we don't want to /// hammer too hard so we limit the concurrent requests. const MAX_CONCURRENT_REQUESTS: usize = 20; /// If a repository has been inactive for more than 2 years we consider it to be inactive. These /// might still be useful for reference but are put away under a separate menu to reduce noise. const MAX_AGE_BEFORE_OLD: std::time::Duration = std::time::Duration::from_secs(86400 * 365 * 2); /// Represents an owner fix that needs to be applied to the toml file. #[derive(Debug, Serialize)] struct OwnerFix { old_url: String, new_url: String, } /// Collects all issues found during README generation that can be auto-fixed. #[derive(Debug, Default, Serialize)] struct TomlFixes { /// URLs where the owner in the toml doesn't match the actual repo owner owner_mismatches: Vec, /// URLs that returned "Not Found" and should be removed not_found: Vec, } /// [`GarminResources`] is a nested [`BTreeMap`] that contains each resource type and for each type /// one active and one inactive key with a list of resources. The content looks something like /// this: /// /// ```json /// { /// "watch_face": { /// "active": [ resource_1, resource_2, resource_3 ], /// "inactive": [ resource_4 ] /// }, /// "device_app": { /// "active": [ resource_5, resource_6 ], /// "inactive": [] /// } /// } /// ``` type GarminResources = BTreeMap>>; /// A resource type is the type a resource can have mapped to the Garmin ecosystem. This also /// includes some extra types for those projects not related to device app development. /// https://developer.garmin.com/connect-iq/connect-iq-basics/app-types/ #[derive(Clone, Debug)] enum ResourceType { WatchFace, DataField, Widget, DeviceApp, AudioContentProvider, Barrel, Tool, CompanionApp, Miscellaneous, } impl TryFrom for ResourceType { type Error = anyhow::Error; fn try_from(value: String) -> Result { match value.as_str() { "1" => Ok(Self::WatchFace), "2" => Ok(Self::DeviceApp), "3" => Ok(Self::Widget), "4" => Ok(Self::DataField), "5" => Ok(Self::AudioContentProvider), id => Err(anyhow::anyhow!("invalid type id: {}", id)), } } } impl ResourceType { /// The status key will be based on the cut-off date for some resource types but not all. For /// the specified resource types we never put them in the `inactive` key since we always want /// to display them. fn status_key(&self, is_old: bool) -> String { let inactive = match self { ResourceType::AudioContentProvider | ResourceType::Barrel | ResourceType::Tool | ResourceType::CompanionApp | ResourceType::Miscellaneous => false, _ => is_old, }; String::from(if inactive { "inactive" } else { "active" }) } } impl std::fmt::Display for ResourceType { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { Self::WatchFace => write!(f, "watch_face"), Self::DataField => write!(f, "data_field"), Self::Widget => write!(f, "widget"), Self::DeviceApp => write!(f, "device_app"), Self::AudioContentProvider => write!(f, "audio_content_provider"), Self::Barrel => write!(f, "barrel"), Self::Tool => write!(f, "tool"), Self::CompanionApp => write!(f, "companion_app"), Self::Miscellaneous => write!(f, "miscellaneous"), } } } /// The TomlFileItem represents a single row in the TOML file that is used to define resources. /// Currently it only contains support for a custom name and a description. This is mostly useful /// if the resource is not a GitHub or GitLab repository. #[serde_as] #[derive(Debug, Serialize, Deserialize)] struct TomlFileItem { #[serde_as(as = "NoneAsEmptyString")] #[serde(default)] name: Option, #[serde_as(as = "NoneAsEmptyString")] #[serde(default)] description: Option, } /// The TOML file holds all resources that should be generated in the final README. #[derive(Debug, Deserialize)] struct TomlFile { watch_faces: HashMap, data_fields: HashMap, widgets: HashMap, device_apps: HashMap, audio_content_providers: HashMap, barrels: HashMap, tools: HashMap, companion_apps: HashMap, miscellaneous: HashMap, } /// A [`GarminResource`] is the resource that is populated after resolving the TOML file contents /// and fetching additional information from an API. It holds all the data used to render the /// README items. #[derive(Debug, Serialize, Deserialize)] struct GarminResource { name: String, description: Option, url: String, #[serde(with = "ymd_date")] last_updated: Option>, is_archived: bool, star_count: Option, } /// The data that is passed to render the template. It contains all the resolved Garmin resources /// grouped by type and a timestamp to set when the file was generated. #[derive(Serialize, Deserialize)] struct Template { resources: GarminResources, updated_at: String, } /// The GitLab client does not come with pre-defined types, instead it will deserialize to whatever /// type the user define. This is the only data we're currently interested in. #[derive(Debug, Deserialize)] struct GitLabProject { name: String, description: Option, last_activity_at: chrono::DateTime, archived: bool, star_count: u32, } /// Generate the README based on all the contents in `awesome.toml`. If the element is a link to /// GitHub or GitLab their API will be called to fetch description and information about last /// activity. pub async fn generate_readme() -> anyhow::Result<()> { let resources = read_toml_file()?; let octocrab = Arc::new( octocrab::OctocrabBuilder::new() .personal_token(std::env::var("GITHUB_TOKEN")?) .build()?, ); let glab = Arc::new( gitlab::GitlabBuilder::new("gitlab.com", std::env::var("GITLAB_TOKEN")?) .build_async() .await?, ); let data: Arc> = Arc::new(Mutex::new(BTreeMap::new())); let fixes: Arc> = Arc::new(Mutex::new(TomlFixes::default())); let resource_types = vec![ (ResourceType::WatchFace, resources.watch_faces), (ResourceType::DataField, resources.data_fields), (ResourceType::Widget, resources.widgets), (ResourceType::DeviceApp, resources.device_apps), ( ResourceType::AudioContentProvider, resources.audio_content_providers, ), (ResourceType::Barrel, resources.barrels), (ResourceType::Tool, resources.tools), (ResourceType::CompanionApp, resources.companion_apps), (ResourceType::Miscellaneous, resources.miscellaneous), ]; let mut futures = Vec::new(); for (resource_type, resources) in resource_types { for (resource_url, resource) in resources { futures.push(update_resource( resource_type.clone(), resource_url, resource, octocrab.clone(), glab.clone(), data.clone(), fixes.clone(), )); } } let stream = futures::stream::iter(futures).buffer_unordered(MAX_CONCURRENT_REQUESTS); stream.collect::>().await; let mut hb = Handlebars::new(); hb.register_escape_fn(no_escape); hb.register_template_string("readme", TEMPLATE).unwrap(); hb.register_helper("resourceList", Box::new(resource_list_helper)); hb.register_helper("resourceCount", Box::new(resource_count_helper)); { let mut d = data.lock().unwrap(); for (_, v) in d.iter_mut() { for (_, i) in v.iter_mut() { sorted_resources(i); } } } let template = Template { resources: Arc::try_unwrap(data).unwrap().into_inner()?, updated_at: chrono::Utc::now().format("%Y-%m-%d").to_string(), }; println!("{}", hb.render("readme", &template)?); // Write fixes file if there are any issues to fix let fixes = Arc::try_unwrap(fixes).unwrap().into_inner()?; if !fixes.owner_mismatches.is_empty() || !fixes.not_found.is_empty() { let fixes_json = serde_json::to_string_pretty(&fixes)?; std::fs::write("toml-fixes.json", fixes_json)?; eprintln!( "\n📝 Found {} owner mismatch(es) and {} not-found resource(s). Written to toml-fixes.json", fixes.owner_mismatches.len(), fixes.not_found.len() ); } Ok(()) } fn resource_count_helper( h: &Helper, _: &Handlebars, _: &Context, _: &mut RenderContext, out: &mut dyn Output, ) -> HelperResult { let mut count = 0; if let Some(active) = h.param(0) { if let Some(arr) = active.value().as_array() { count += arr.len(); } } if let Some(inactive) = h.param(1) { if let Some(arr) = inactive.value().as_array() { count += arr.len(); } } out.write(&count.to_string())?; Ok(()) } fn resource_list_helper( h: &Helper, _: &Handlebars, _: &Context, _: &mut RenderContext, out: &mut dyn Output, ) -> HelperResult { let mut output = String::new(); let show_description = h .param(2) .is_none_or(|p| p.value().as_bool().unwrap_or(true)); let active = h.param(0).unwrap().value(); output.push_str(&resources_to_str(active, show_description)); if let Some(inactive_list) = h.param(1) { let inactive = resources_to_str(inactive_list.value(), show_description); if !inactive.is_empty() { output.push_str(&format!( r#" ### Older resources
Click to expand {inactive}
"# )); } } out.write(output.as_str())?; Ok(()) } fn resources_to_str(resources: &serde_json::Value, show_description: bool) -> String { let mut output = String::new(); if let Some(active_list) = resources.as_array() { if show_description { output.push_str("| Name | Description | Last updated | Stars |\n"); output.push_str("| ---- | ----------- | ----------------- | ----- |\n"); } else { output.push_str("| Name | Last updated | Stars |\n"); output.push_str("| ---- | ----------------- | ----- |\n"); } for resource in active_list { if let Some(name) = resource.get("name").and_then(|n| n.as_str()) { let url = resource.get("url").and_then(|u| u.as_str()).unwrap_or("#"); let description = resource .get("description") .and_then(|d| d.as_str().map(|v| v.replace("|", "-"))); let star_count = resource.get("star_count").and_then(|s| s.as_u64()); let last_updated = resource.get("last_updated").and_then(|l| l.as_str()); let is_archived = resource.get("is_archived").and_then(|a| a.as_bool()); output.push_str(&format!("| [{name}]({url}) ")); if show_description { if let Some(description) = description { output.push_str(&format!("| {description} ")); } else { output.push_str("| "); } } let is_archived = if let Some(true) = is_archived { "🗄️" } else { "" }; if let Some(date) = last_updated { output.push_str(&format!("| {date} {is_archived} ")); } else { output.push_str("| {is_archived} "); } if let Some(stars) = star_count { output.push_str("| "); if stars > 0 { output.push_str(&format!("⭐{stars} ")); } } output.push_str("|\n"); } } } output } /// Read the toml file and return the prased file as a [`TomlFile`]. fn read_toml_file() -> anyhow::Result { let mut toml_content = String::new(); std::fs::File::open("awesome.toml") .expect("Failed to open awesome.toml") .read_to_string(&mut toml_content) .expect("Failed to read awesome.toml"); Ok(toml::from_str(&toml_content)?) } /// The resources will be sorted by date - if they have any, and then by name. fn sorted_resources(resources: &mut [GarminResource]) { resources.sort_by(|a, b| match (a.last_updated, b.last_updated) { (None, None) => a.name.cmp(&b.name), (Some(u1), Some(u2)) => u2.cmp(&u1).then(a.name.cmp(&b.name)), (None, Some(_)) => std::cmp::Ordering::Greater, (Some(_), None) => std::cmp::Ordering::Less, }); } /// A single resources is updated based on the URL. It will be added to the `GarminResources` once /// resolved and not return any data. async fn update_resource( resource_type: ResourceType, resource_url: String, resource: TomlFileItem, octocrab: Arc, glab: Arc, data: Arc>, fixes: Arc>, ) { eprintln!("Updating {}", resource_url); let (resource, is_old) = if resource_url.contains("github.com") { update_github_resource(resource_url, &resource, octocrab, fixes).await } else if resource_url.contains("gitlab.com") { update_gitlab_resource(resource_url, &resource, glab).await } else if let Some(name) = resource.name { ( Some(GarminResource { name, description: resource.description, url: resource_url, last_updated: None, is_archived: false, star_count: None, }), true, ) } else { return; }; if let Some(resource) = resource { let resource_type_name = resource_type.to_string(); let resource_status_key = resource_type.status_key(is_old); let mut resource_type = data.lock().unwrap(); let resources = resource_type.entry(resource_type_name).or_default(); let resource_list = resources.entry(resource_status_key).or_default(); resource_list.push(resource) } } /// Will poll the GitHub API and fetch information about the repo. async fn update_github_resource( resource_url: String, resource: &TomlFileItem, octocrab: Arc, fixes: Arc>, ) -> (Option, bool) { let u = url::Url::parse(&resource_url).unwrap(); let mut owner_repo = u.path().strip_prefix('/').unwrap().split('/'); let owner = owner_repo.next().unwrap(); let repo = owner_repo.next().unwrap(); let result = match octocrab.repos(owner, repo).get().await { Ok(result) => result, Err(octocrab::Error::GitHub { source, .. }) => { eprintln!("⚠️ Could not get {resource_url}: {}", source.message); if source.message.contains("Not Found") { fixes.lock().unwrap().not_found.push(resource_url); } return (None, false); } Err(err) => { eprintln!("⚠️ Could not get {resource_url}: {err}"); return (None, false); } }; if let Some(Author { login, .. }) = result.owner { if owner.to_lowercase() != login.to_lowercase() { eprintln!("⚠️ Owner in toml file ({owner}) does not match the repo ({login})"); let new_url = resource_url.replace( &format!("github.com/{owner}"), &format!("github.com/{login}"), ); fixes.lock().unwrap().owner_mismatches.push(OwnerFix { old_url: resource_url.clone(), new_url, }); } }; let garmin_resource = GarminResource { name: repo.to_string(), description: Some( resource .description .clone() .unwrap_or(result.description.unwrap_or_default()), ), url: resource_url.to_string(), last_updated: result.pushed_at, is_archived: result.archived.unwrap_or_default(), star_count: result.stargazers_count, }; let is_old = if let Some(pushed_at) = result.pushed_at { pushed_at < chrono::Utc::now() - MAX_AGE_BEFORE_OLD } else { false }; (Some(garmin_resource), is_old) } /// Will poll the GitLab API and fetch information about the repo. async fn update_gitlab_resource( resource_url: String, resource: &TomlFileItem, glab: Arc, ) -> (Option, bool) { let u = url::Url::parse(&resource_url).unwrap(); let owner_repo = u.path().strip_prefix('/').unwrap(); let endpoint = gitlab::api::projects::Project::builder() .project(owner_repo) .build() .unwrap(); let result: GitLabProject = match endpoint.query_async(glab.as_ref()).await { Ok(result) => result, Err(err) => { eprintln!("⚠️ Could not get {}: {err}", resource_url); return (None, false); } }; let garmin_resource = GarminResource { name: result.name, description: Some( resource .description .clone() .unwrap_or(result.description.unwrap_or_default()), ), url: resource_url.to_string(), last_updated: Some(result.last_activity_at), is_archived: result.archived, star_count: Some(result.star_count), }; ( Some(garmin_resource), result.last_activity_at < chrono::Utc::now() - MAX_AGE_BEFORE_OLD, ) } /// Compare what's in the `awesome.toml` file with all the found search results based on the given /// `keyword`. This is a manual but easy way to see which resources are not listed yet. /// /// The output will look just like the toml file to make it easy to compare or copy/paste. pub async fn compare(keyword: &str) -> anyhow::Result<()> { let resources = read_toml_file()?; let toml_file_keys = vec![ resources.watch_faces.keys().collect::>(), resources.data_fields.keys().collect::>(), resources.widgets.keys().collect::>(), resources.device_apps.keys().collect::>(), resources .audio_content_providers .keys() .collect::>(), resources.barrels.keys().collect::>(), resources.tools.keys().collect::>(), resources.companion_apps.keys().collect::>(), resources.miscellaneous.keys().collect::>(), ]; let tomle_file_urls = toml_file_keys .into_iter() .flatten() .map(|i| i.to_owned()) .collect::>(); // Store each app type in a separate `HashSet` so we can print it properly. let mut watch_faces = HashSet::new(); let mut data_fields = HashSet::new(); let mut widgets = HashSet::new(); let mut device_apps = HashSet::new(); let mut audio_content_providers = HashSet::new(); let mut s = crate::search::ConnectIQSearch::new(keyword.to_string()); while let Some(app) = s.next().await { if app.website_url.is_empty() { continue; } if !app.website_url.starts_with("https://github") && !app.website_url.starts_with("https://gitlab") { continue; } // A lot of URLs goes to paths in a multi repo or have a trailing slash. This list only // contains full repos so we only care about the repo base URL. let parsed_url = url::Url::parse(&app.website_url)?; let repo_base_url = format!( "{}://{}{}", parsed_url.scheme(), parsed_url.host_str().unwrap(), parsed_url .path() .split('/') .take(3) .collect::>() .join("/") ); if tomle_file_urls.contains(&repo_base_url) { continue; } let resource_type = ResourceType::try_from(app.type_id)?; match resource_type { ResourceType::WatchFace => watch_faces.insert(app.website_url), ResourceType::DataField => data_fields.insert(app.website_url.clone()), ResourceType::Widget => widgets.insert(app.website_url.clone()), ResourceType::DeviceApp => device_apps.insert(app.website_url.clone()), ResourceType::AudioContentProvider => { audio_content_providers.insert(app.website_url.clone()) } _ => unreachable!(), }; } println!( "Found {} URLs not in list\n", watch_faces.len() + data_fields.len() + widgets.len() + device_apps.len() + audio_content_providers.len() ); for (app_set, header) in [ (watch_faces, "watch_faces"), (data_fields, "data_fields"), (widgets, "widgets"), (device_apps, "device_apps"), (audio_content_providers, "audio_content_providers"), ] { if !app_set.is_empty() { println!("[{header}]"); for u in app_set { println!("\"{u}\" = {{}}"); } println!(); } } Ok(()) } /// [`ymd_date`] implements a serializer to show a more condensed date in the README. It will only /// show YYYY-MM-DD. mod ymd_date { use serde::{self, Deserialize, Deserializer, Serializer}; const FORMAT: &str = "%Y‑%m‑%d"; pub fn serialize( date: &Option>, serializer: S, ) -> Result where S: Serializer, { match date { Some(date) => { let s = format!("{}", date.format(FORMAT)); serializer.serialize_str(&s) } None => serializer.serialize_str(""), } } pub fn deserialize<'de, D>( deserializer: D, ) -> Result>, D::Error> where D: Deserializer<'de>, { let s: Option = Option::deserialize(deserializer)?; match s { Some(s) if s.is_empty() => Ok(None), Some(s) => s .parse::>() .map(Some) .map_err(serde::de::Error::custom), None => Ok(None), } } } #[cfg(test)] mod test { use std::sync::{Arc, Mutex}; use crate::{sorted_resources, GarminResource, TomlFileItem, TomlFixes}; #[test] fn same_updated_should_sort_on_name() { let t0 = chrono::Utc::now(); let t1 = t0 - std::time::Duration::from_secs(5); let mut r = vec![ GarminResource { name: "Name A".to_string(), last_updated: Some(t1), description: None, url: "#".to_string(), is_archived: false, star_count: None, }, GarminResource { name: "Name C".to_string(), last_updated: Some(t0), description: None, url: "#".to_string(), is_archived: false, star_count: None, }, GarminResource { name: "Name B".to_string(), last_updated: Some(t0), description: None, url: "#".to_string(), is_archived: false, star_count: None, }, ]; sorted_resources(&mut r); let names = r.into_iter().map(|n| n.name).collect::>(); assert_eq!( names, vec![ "Name B".to_string(), "Name C".to_string(), "Name A".to_string() ] ); } #[tokio::test] async fn test_github() { let empy_toml = TomlFileItem { name: None, description: None, }; let octocrab = Arc::new( octocrab::OctocrabBuilder::new() .personal_token(std::env::var("GITHUB_TOKEN").unwrap()) .build() .unwrap(), ); let url = "https://github.com/bombsimon/garmin-seaside"; let fixes = Arc::new(Mutex::new(TomlFixes::default())); let (resource, _) = super::update_github_resource(url.to_string(), &empy_toml, octocrab.clone(), fixes) .await; assert!(resource.is_some()); let resource_data = resource.unwrap(); assert!(resource_data.star_count.unwrap_or(0) >= 1); assert!(resource_data.description.is_some()); assert_eq!(resource_data.name, "garmin-seaside".to_string()); assert_eq!(resource_data.url, url.to_string()); assert!(!resource_data.is_archived); } #[tokio::test] async fn test_gitlab() { let empy_toml = TomlFileItem { name: None, description: None, }; let glab = Arc::new( gitlab::GitlabBuilder::new("gitlab.com", std::env::var("GITLAB_TOKEN").unwrap()) .build_async() .await .unwrap(), ); let url = "https://gitlab.com/knusprjg/plotty-mcclockface"; let (resource, _) = super::update_gitlab_resource(url.to_string(), &empy_toml, glab.clone()).await; assert!(resource.is_some()); let resource_data = resource.unwrap(); assert!(resource_data.star_count.unwrap_or(0) >= 1); assert!(resource_data.description.is_some()); assert_eq!(resource_data.name, "Plotty McClockface".to_string()); assert_eq!(resource_data.url, url.to_string()); assert!(!resource_data.is_archived); } #[test] fn test_readme_template_rendering() { use crate::{resource_count_helper, resource_list_helper, Template, TEMPLATE}; use handlebars::{no_escape, Handlebars}; use serde_json::json; let template: Template = serde_json::from_value(json!({ "updated_at": "2025-01-15", "resources": { "watch_face": { "active": [ { "name": "ActiveFace", "url": "https://github.com/test/active-face", "description": "An active watch face", "last_updated": "2025-01-01T00:00:00Z", "is_archived": false, "star_count": 42 } ], "inactive": [ { "name": "OldFace", "url": "https://github.com/test/old-face", "description": "An old watch face", "last_updated": "2020-01-01T00:00:00Z", "is_archived": true, "star_count": 5 } ] }, "data_field": { "active": [ { "name": "SpeedField", "url": "https://github.com/test/speed", "description": "Shows speed", "last_updated": "2024-06-01T00:00:00Z", "is_archived": false, "star_count": 10 } ], "inactive": [] }, "widget": { "active": [], "inactive": [] }, "device_app": { "active": [], "inactive": [] }, "audio_content_provider": { "active": [], "inactive": [] }, "barrel": { "active": [], "inactive": [] }, "companion_app": { "active": [], "inactive": [] }, "tool": { "active": [], "inactive": [] }, "miscellaneous": { "active": [], "inactive": [] } } })) .expect("Failed to deserialize template"); let mut hb = Handlebars::new(); hb.register_escape_fn(no_escape); hb.register_template_string("readme", TEMPLATE).unwrap(); hb.register_helper("resourceList", Box::new(resource_list_helper)); hb.register_helper("resourceCount", Box::new(resource_count_helper)); let output = hb.render("readme", &template).expect("Failed to render"); println!("{}", output); } } ================================================ FILE: awesome-generator/src/readme.md.hbs ================================================ # Awesome Garmin [![Awesome](https://awesome.re/badge.svg)](https://awesome.re) An extensive list of Garmin apps, both for Garmin devices written in [Monkey C] and tools that integrate with the Garmin ecosystem and services. > [!NOTE] > This README is generated! > To help exploring relevant resources the items in each segmented are _sorted > by last activity_ if available. > > _This README was last generated at {{ updated_at }}_. Contributions are always welcome! To add a new resource, **do not edit this file**. Instead, add it to [`awesome.toml`][awesome-toml]. If the resource is a GitHub or GitLab repository with a description, just include the URL. To customize the name, set name, and to add a missing description, set description. Since many resources in this list are outdated, watch faces, widgets, data fields, and device apps with no activity in the past two years (from the file's generation date) will be placed in a collapsible section to reduce clutter. ## Contents - [Watch faces](#watch-faces) ({{resourceCount resources.watch_face.active resources.watch_face.inactive}}) - [Data fields](#data-fields) ({{resourceCount resources.data_field.active resources.data_field.inactive}}) - [Widgets](#widgets) ({{resourceCount resources.widget.active resources.widget.inactive}}) - [Device Apps](#device-apps) ({{resourceCount resources.device_app.active resources.device_app.inactive}}) - [Audio Content Providers](#audio-content-providers) ({{resourceCount resources.audio_content_provider.active resources.audio_content_provider.inactive}}) - [Barrels](#barrels) ({{resourceCount resources.barrel.active resources.barrel.inactive}}) - [Companion apps](#companion-apps) ({{resourceCount resources.companion_app.active resources.companion_app.inactive}}) - [Tools](#tools) ({{resourceCount resources.tool.active resources.tool.inactive}}) - [Miscellaneous](#miscellaneous) ({{resourceCount resources.miscellaneous.active resources.miscellaneous.inactive}}) ## Watch faces [Watch faces] are a special application type that display on the main screen of Garmin’s wearable devices. These application types are limited some ways to allow them to have minimal impact on the device’s battery life. {{{resourceList resources.watch_face.active resources.watch_face.inactive false}}} ## Data fields [Data fields] allow customers and third party developers to write additional metrics and data that will display with Garmin activities. The goal is to create a system that not only makes it easy for a user to make a quick data field based off our workout data, but also gives the developer the the ability to customize the presentation. {{{resourceList resources.data_field.active resources.data_field.inactive}}} ## Widgets [Widgets] are mini-apps that allow developers to provide glanceable views of information. The information may be from a cloud service, from the onboard sensors, or from other Connect IQ APIs. Widgets are launchable from a rotating carousel of pages accessible from the main screen of wearables, or from a side view on bike computers and outdoor handhelds. Unlike apps, Widgets time out after a period of inactivity and are not allowed to record activities, but they are also launchable at any time. {{{resourceList resources.widget.active resources.widget.inactive}}} ## Device Apps Applications, or [Device Apps], are by far the most robust type of app available. These allow the most flexibility and customization to the app designer. They also provide the most access to the capabilities of the wearable device, such as accessing ANT+ sensors, the accelerometer and reading/recording FIT files. {{{resourceList resources.device_app.active resources.device_app.inactive}}} ## Audio content providers [Audio content providers]. Garmin media enabled devices are designed for active lifestyle users who want to listen to music without carrying their phone on their rides, runs or other activities. The media player allows the user to listen to their music, podcasts, and audio-books on the go. {{{resourceList resources.audio_content_provider.active}}} ## Barrels Developers can create custom Monkey C libraries, called [Monkey Barrels], that contain source code and resource information that are easily shared across Connect IQ Projects. {{{resourceList resources.barrel.active}}} ## Companion apps {{{resourceList resources.companion_app.active}}} ## Tools {{{resourceList resources.tool.active}}} ## Miscellaneous {{{resourceList resources.miscellaneous.active}}} [awesome-toml]: ./awesome-generator/awesome.toml [Watch faces]: https://developer.garmin.com/connect-iq/connect-iq-basics/app-types/#watchfaces [Monkey C]: https://developer.garmin.com/connect-iq/monkey-c/ [Data fields]: https://developer.garmin.com/connect-iq/connect-iq-basics/app-types/#datafields [Widgets]: https://developer.garmin.com/connect-iq/connect-iq-basics/app-types/#widgets [Device Apps]: https://developer.garmin.com/connect-iq/connect-iq-basics/app-types/#deviceapps [Audio content providers]: https://developer.garmin.com/connect-iq/connect-iq-basics/app-types/#audiocontentproviders [Monkey Barrels]: https://developer.garmin.com/connect-iq/core-topics/shareable-libraries/ ================================================ FILE: awesome-generator/src/search.rs ================================================ //! The search module holds all types returned from and supports //! searching their app catalog by keyword. use std::collections::{HashMap, VecDeque}; use std::future::Future; use std::pin::Pin; use std::task::{ready, Poll}; use futures::StreamExt; use pin_project::pin_project; use prettytable::{row, Table}; use serde_with::{formats::Flexible, serde_as, TimestampMilliSeconds}; use url::Url; #[derive(Debug, Default, serde::Deserialize)] #[serde(default, rename_all = "camelCase")] pub struct ConnectIQLocale { pub locale: String, pub name: String, pub description: String, pub whats_new: String, } #[derive(Debug, Default, serde::Deserialize)] #[serde(default, rename_all = "camelCase")] pub struct ConnectIQDeveloper { pub full_name: Option, pub developer_display_name: String, pub logo_url: Option, pub logo_url_dark: Option, pub trusted_developer: bool, } #[derive(Debug, Default, serde::Deserialize)] #[serde(default, rename_all = "camelCase")] pub struct ConnectIQFileSize { pub internal_version_number: i64, pub byte_count_by_device_type_id: HashMap, } #[derive(Debug, Default, serde::Deserialize)] #[serde(default, rename_all = "camelCase")] pub struct ConnecTIQSettingsAvailability { pub internal_version_number: i64, pub availability_by_device_type_id: HashMap, } #[serde_as] #[derive(Debug, Default, serde::Deserialize)] #[serde(default, rename_all = "camelCase")] pub struct ConnectIQApp { pub id: String, pub developer_id: String, pub type_id: String, pub website_url: String, pub video_url: String, pub privacy_policy_url: String, pub support_email_address: String, pub app_localizations: Vec, pub status: String, pub ios_app_url: String, pub android_app_url: String, pub icon_file_id: String, pub latest_external_version: String, pub latest_internal_version: i64, pub download_count: i64, #[serde_as(as = "TimestampMilliSeconds")] pub changed_date: chrono::DateTime, pub average_rating: f32, pub review_count: i64, pub category_id: String, pub compatible_device_type_ids: Vec, pub has_trial_mode: bool, pub auth_flow_support: i64, pub permissions: Vec, pub latest_version_auto_migrated: bool, pub screenshot_file_ids: Vec, pub developer: ConnectIQDeveloper, pub payment_model: i64, pub file_size_info: ConnectIQFileSize, pub settings_availability_info: ConnecTIQSettingsAvailability, } #[derive(Debug, Default, serde::Deserialize)] #[serde(default, rename_all = "camelCase")] pub struct ConnectIQ { pub total_count: usize, pub apps: Vec, } #[derive(Debug, Default, serde::Deserialize)] #[serde(default, rename_all = "camelCase")] pub struct ConnectIQDeviceType { pub additional_names: Vec, pub id: String, pub image_url: String, pub name: String, pub part_number: String, pub url_name: String, } #[pin_project] pub struct ConnectIQSearch { client: std::sync::Arc, keyword: String, apps: VecDeque, start_page_index: usize, has_more_pages: bool, future: Option>>>>, } impl ConnectIQSearch { const PAGE_SIZE: usize = 30; pub fn new(keyword: String) -> Self { Self { client: std::sync::Arc::new(reqwest::Client::new()), apps: VecDeque::new(), start_page_index: 0, has_more_pages: true, keyword, future: None, } } pub fn fetch_next_page(mut self: Pin<&mut Self>, cx: &mut std::task::Context<'_>) -> Poll<()> { if self.future.is_none() { let fut = fetch_page( self.client.clone(), self.keyword.clone(), Self::PAGE_SIZE, self.start_page_index, ); self.future = Some(Box::pin(fut)); } let p = self.project(); let Some(fut) = (*p.future).as_mut() else { return Poll::Ready(()); }; match fut.as_mut().poll(cx) { Poll::Ready(Ok(page)) => { p.apps.extend(page.apps); *p.has_more_pages = *p.start_page_index + Self::PAGE_SIZE < page.total_count; *p.start_page_index += Self::PAGE_SIZE; *p.future = None; Poll::Ready(()) } Poll::Ready(_) => { *p.has_more_pages = false; Poll::Ready(()) } Poll::Pending => Poll::Pending, } } pub async fn device_types(&self) -> anyhow::Result> { let u = Url::parse( "https://apps.garmin.com/api/appsLibraryExternalServices/api/asw/deviceTypes", )?; Ok(self.client.get(u.as_str()).send().await?.json().await?) } } async fn fetch_page( client: std::sync::Arc, keyword: String, page_size: usize, start_page_index: usize, ) -> anyhow::Result { let mut u = Url::parse( "https://apps.garmin.com/api/appsLibraryExternalServices/api/asw/apps/keywords", )?; let pairs = [ ("keywords", keyword.as_str()), ("pageSize", &page_size.to_string()), ("sortType", "mostPopular"), ]; u.query_pairs_mut() .clear() .extend_pairs(pairs) .append_pair("startPageIndex", start_page_index.to_string().as_str()); Ok(client.get(u.as_str()).send().await?.json().await?) } impl futures::Stream for ConnectIQSearch { type Item = ConnectIQApp; fn poll_next( mut self: Pin<&mut Self>, cx: &mut std::task::Context<'_>, ) -> Poll> { loop { if let Some(item) = self.as_mut().apps.pop_front() { return Poll::Ready(Some(item)); } if !self.has_more_pages { return Poll::Ready(None); } ready!(self.as_mut().fetch_next_page(cx)) } } } pub async fn print_resource_urls(keyword: &str) -> anyhow::Result<()> { let mut s = ConnectIQSearch::new(keyword.to_string()); let mut table = Table::new(); table.set_format(*prettytable::format::consts::FORMAT_NO_BORDER_LINE_SEPARATOR); table.set_titles(row!["Change date", "Type", "URL"]); while let Some(app) = s.next().await { if !app.website_url.is_empty() { let resource_type = format!("{:?}", crate::ResourceType::try_from(app.type_id)?); table.add_row(row![app.changed_date, resource_type, app.website_url]); } } table.printstd(); Ok(()) }