├── .github └── workflows │ ├── pr.yaml │ ├── sort_toml.sh │ ├── check_sorting.sh │ └── update_readme.yaml ├── LICENSE ├── awesome-generator ├── Cargo.toml ├── .gitignore ├── src │ ├── bin │ │ └── main.rs │ ├── readme.md.hbs │ ├── search.rs │ └── lib.rs ├── README.md └── awesome.toml └── README.md /.github/workflows/pr.yaml: -------------------------------------------------------------------------------- 1 | name: Validate `awesome.toml` 2 | 3 | on: 4 | workflow_dispatch: 5 | push: 6 | branches: 7 | - main 8 | pull_request: 9 | 10 | jobs: 11 | validate: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - name: Checkout code 15 | uses: actions/checkout@v4 16 | 17 | - name: Check sorting 18 | id: validate 19 | run: bash .github/workflows/check_sorting.sh 20 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE 2 | Version 2, December 2004 3 | 4 | Copyright (C) 2024 Simon Sawert 5 | 6 | Everyone is permitted to copy and distribute verbatim or modified 7 | copies of this license document, and changing it is allowed as long 8 | as the name is changed. 9 | 10 | DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE 11 | TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 12 | 13 | 0. You just DO WHAT THE FUCK YOU WANT TO. 14 | -------------------------------------------------------------------------------- /awesome-generator/Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "awesome-generator" 3 | version = "0.1.0" 4 | edition = "2021" 5 | 6 | # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html 7 | 8 | [dependencies] 9 | anyhow = "1" 10 | chrono = "0.4" 11 | clap = { version = "4.5", features = ["derive"] } 12 | futures = "0.3" 13 | gitlab = "0.1708.1" 14 | handlebars = "6.3" 15 | octocrab = "0.43" 16 | pin-project = "1.1" 17 | prettytable-rs = "0.10" 18 | reqwest = "0.12" 19 | serde = { version = "1", features = ["derive"] } 20 | serde_json = "1" 21 | serde_with = { version = "3.12", features = ["chrono_0_4"] } 22 | tokio = { version = "1", features = ["full"] } 23 | toml = "0.8" 24 | url = "2.5" 25 | -------------------------------------------------------------------------------- /awesome-generator/.gitignore: -------------------------------------------------------------------------------- 1 | # Created by https://www.toptal.com/developers/gitignore/api/rust 2 | # Edit at https://www.toptal.com/developers/gitignore?templates=rust 3 | 4 | ### Rust ### 5 | # Generated by Cargo 6 | # will have compiled files and executables 7 | debug/ 8 | target/ 9 | 10 | # Remove Cargo.lock from gitignore if creating an executable, leave it for libraries 11 | # More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html 12 | Cargo.lock 13 | 14 | # These are backup files generated by rustfmt 15 | **/*.rs.bk 16 | 17 | # MSVC Windows builds of rustc generate these, which store debugging information 18 | *.pdb 19 | 20 | # End of https://www.toptal.com/developers/gitignore/api/rust 21 | 22 | # Generated during README generation, used by CI to create fix PRs 23 | toml-fixes.json 24 | -------------------------------------------------------------------------------- /awesome-generator/src/bin/main.rs: -------------------------------------------------------------------------------- 1 | use clap::Parser; 2 | 3 | #[derive(Parser)] 4 | #[command(name = "garmin")] 5 | #[command(bin_name = "garmin")] 6 | enum AwesomeGarminCli { 7 | /// Generate the README from `awesome.toml`. 8 | GenerateReadme, 9 | /// Compare what's in `awesome.toml` with a search result from Connect IQ apps. 10 | Compare(SearchArgs), 11 | /// Search Connect IQ for a keyword and print resources with source code. 12 | Search(SearchArgs), 13 | } 14 | 15 | #[derive(clap::Args)] 16 | #[command(about, long_about = "Search for keywords")] 17 | struct SearchArgs { 18 | /// Keyword to search for, e.g. `tennis`. 19 | keyword: String, 20 | } 21 | 22 | #[tokio::main] 23 | async fn main() { 24 | match AwesomeGarminCli::parse() { 25 | AwesomeGarminCli::GenerateReadme => awesome_generator::generate_readme().await.unwrap(), 26 | AwesomeGarminCli::Compare(args) => awesome_generator::compare(&args.keyword).await.unwrap(), 27 | AwesomeGarminCli::Search(args) => { 28 | awesome_generator::search::print_resource_urls(&args.keyword) 29 | .await 30 | .unwrap() 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /.github/workflows/sort_toml.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # Sorts each section of awesome.toml alphanumerically 4 | # This is needed after applying URL fixes that might break the sort order 5 | 6 | file="awesome-generator/awesome.toml" 7 | temp_file=$(mktemp) 8 | 9 | # Process the file section by section 10 | current_header="" 11 | current_lines="" 12 | 13 | while IFS= read -r line || [[ -n "$line" ]]; do 14 | # Check if this is a section header 15 | if [[ "$line" =~ ^\[.*\]$ ]]; then 16 | # If we have a previous section, write it out sorted 17 | if [ -n "$current_header" ]; then 18 | { 19 | echo "$current_header" 20 | echo "$current_lines" | LC_ALL=C sort 21 | echo "" 22 | } >>"$temp_file" 23 | fi 24 | 25 | current_header="$line" 26 | current_lines="" 27 | elif [ -n "$line" ]; then 28 | # Add non-empty lines to current section 29 | if [ -n "$current_lines" ]; then 30 | current_lines="$current_lines"$'\n'"$line" 31 | else 32 | current_lines="$line" 33 | fi 34 | fi 35 | done <"$file" 36 | 37 | # Don't forget the last section 38 | if [ -n "$current_header" ]; then 39 | { 40 | echo "$current_header" 41 | echo "$current_lines" | LC_ALL=C sort 42 | } >>"$temp_file" 43 | fi 44 | 45 | mv "$temp_file" "$file" 46 | echo "Sorted all sections in $file" 47 | -------------------------------------------------------------------------------- /.github/workflows/check_sorting.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | file="awesome-generator/awesome.toml" 4 | exit_code=0 5 | 6 | IFS=";" 7 | 8 | # shellcheck disable=SC2207 9 | # This just feels like the easiest to understand. I don't know how to split the 10 | # file on multiple newlines any better way. 11 | # Ref: https://stackoverflow.com/a/62608718/2274551 12 | sections=($(awk -v RS= -v ORS=";" '{print}' "$file")) 13 | 14 | for section in "${sections[@]}"; do 15 | header=$(echo "$section" | head -n 1) 16 | rows=$(echo "$section" | tail -n +2) 17 | sorted=$(echo "$rows" | LC_ALL=C sort) 18 | 19 | if [ "$rows" != "$sorted" ]; then 20 | invalid_sections+=("$header") 21 | exit_code=1 22 | fi 23 | done 24 | 25 | if [ $exit_code -ne 0 ]; then 26 | cat <<-EOF 27 | Thank you for adding new resources to this project! 28 | 29 | To ensure consistency and easier maintenance (e.g., spotting duplicates), the 30 | items in each section are sorted alphanumerically. 31 | 32 | Your recent changes don't follow this convention, so please ensure the 33 | section(s) you've edited are properly sorted. 34 | 35 | **NOTE** Sorting is case sensitive and since all uppercase letters comes before 36 | lowercase letters, ensure the whole section is sorted. This means that 'B' comes 37 | before 'a' and 'b' comes after 'C'. 38 | 39 | The following sections are currently not sorted: 40 | 41 | EOF 42 | 43 | for s in "${invalid_sections[@]}"; do 44 | echo " - $s" | tr -d "[]" 45 | done 46 | fi 47 | 48 | exit $exit_code 49 | -------------------------------------------------------------------------------- /awesome-generator/README.md: -------------------------------------------------------------------------------- 1 | # awesome-generator 2 | 3 | Tool to integrate with GitHub, GitLab and Connect IQ. It is currently helping 4 | automate the process of updating the README but finding, adding or removing 5 | resources is still a manual process. 6 | 7 | ## Generate README 8 | 9 | The main purpose of this tool is to generate the [`README.md`] by reading 10 | [`awesome.toml`] and fetching description, last activity and more from GitHub or 11 | GitLab. 12 | 13 | ## Search 14 | 15 | The tool supports searching the [Connect IQ app library] and print any 16 | application that has a website URL linked which usually points to the source 17 | code. 18 | 19 | ```sh 20 | › cargo run search sailing 21 | 22 | Change date | Type | URL 23 | -------------------------+-----------+------------------------------------------------------------- 24 | 2024-06-08 22:04:10 UTC | DeviceApp | https://github.com/pintail105/SailingTools 25 | 2018-12-05 15:09:37 UTC | DeviceApp | https://github.com/antgoldbloom/VMG-Connect-IQ-App 26 | 2023-10-25 07:04:22 UTC | DeviceApp | https://github.com/AlexanderLJX/Sailing-Windsurfing-Foiling 27 | 2024-09-02 12:43:09 UTC | DeviceApp | https://github.com/dmrrlc/connectiq-sailing 28 | 2018-12-05 15:28:10 UTC | DeviceApp | https://github.com/spikyjt/SailingTimer 29 | 2024-11-04 08:04:27 UTC | DeviceApp | https://github.com/Laverlin/Yet-Another-Sailing-App 30 | 2021-04-16 09:25:18 UTC | DeviceApp | https://github.com/alexphredorg/ConnectIqSailingApp 31 | 2023-10-25 07:37:00 UTC | DeviceApp | https://github.com/pukao/GarminSailing 32 | 2024-02-14 00:30:24 UTC | DataField | https://github.com/Fra-Sti/Sailing-Instrument 33 | 2023-12-04 06:43:39 UTC | DeviceApp | https://seatouch.dev/#/foilstart 34 | 2024-07-11 05:05:21 UTC | DeviceApp | https://github.com/zlelik/ConnectIqSailingApp 35 | ``` 36 | 37 | ## Compare 38 | 39 | To make it easy to maintain and discover new resources the tool can compare a 40 | search result with the `awesome.toml` and print any diff in their respective 41 | category. 42 | 43 | ```sh 44 | › cargo run compare gitlab 45 | 46 | Found 8 URLs not in list 47 | 48 | [watch_faces] 49 | "https://gitlab.com/knusprjg/wherearemyglasses" = {} 50 | "https://gitlab.com/HankG/GarminConnectIQ" = {} 51 | "https://gitlab.com/aleixq/connect-iq-analog-red" = {} 52 | 53 | [data_fields] 54 | "https://gitlab.com/nz_brian/garmin.pacer" = {} 55 | "https://gitlab.com/nz_brian/garmin.datafield.timeanddistance" = {} 56 | "https://gitlab.com/twk3/currento2" = {} 57 | 58 | [device_apps] 59 | "https://gitlab.com/ApnoeMax/apnoe-statik-timer" = {} 60 | "https://gitlab.com/btpv/zermeloforgarmin/" = {} 61 | ``` 62 | 63 | [`README.md`]: ../README.md 64 | [`awesome.toml`]: ./awesome.toml 65 | [Connect IQ app library]: https://apps.garmin.com 66 | -------------------------------------------------------------------------------- /.github/workflows/update_readme.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | name: Update README 3 | 4 | on: 5 | schedule: 6 | # Re-generate every Monday 7 | - cron: "0 0 * * 1" 8 | 9 | workflow_dispatch: 10 | 11 | env: 12 | CARGO_TERM_COLOR: always 13 | 14 | jobs: 15 | generate: 16 | permissions: 17 | contents: write 18 | pull-requests: write 19 | 20 | runs-on: ubuntu-latest 21 | 22 | steps: 23 | - uses: actions/checkout@v4 24 | 25 | - name: Generate README 26 | working-directory: ./awesome-generator 27 | run: cargo run generate-readme > ../README.md 28 | env: 29 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 30 | GITLAB_TOKEN: ${{ secrets.GITLAB_TOKEN }} 31 | 32 | - name: Commit updated README 33 | uses: stefanzweifel/git-auto-commit-action@v5 34 | with: 35 | commit_message: "Re-generate README" 36 | 37 | - name: Check for toml fixes 38 | id: check-fixes 39 | working-directory: ./awesome-generator 40 | run: | 41 | if [ -f toml-fixes.json ]; then 42 | echo "has_fixes=true" >> "$GITHUB_OUTPUT" 43 | else 44 | echo "has_fixes=false" >> "$GITHUB_OUTPUT" 45 | fi 46 | 47 | - name: Apply fixes to awesome.toml 48 | if: steps.check-fixes.outputs.has_fixes == 'true' 49 | working-directory: ./awesome-generator 50 | run: | 51 | # Apply owner mismatch fixes (replace old URLs with new URLs) 52 | jq -r '.owner_mismatches[] | "\(.old_url)|\(.new_url)"' toml-fixes.json | while IFS='|' read -r old_url new_url; do 53 | echo "Fixing owner: $old_url -> $new_url" 54 | sed -i "s|\"$old_url\"|\"$new_url\"|g" awesome.toml 55 | done 56 | 57 | # Remove not-found URLs (use # as delimiter since URLs contain /) 58 | jq -r '.not_found[]' toml-fixes.json | while read -r url; do 59 | echo "Removing not-found: $url" 60 | sed -i "\#\"$url\"#d" awesome.toml 61 | done 62 | 63 | # Clean up 64 | rm toml-fixes.json 65 | 66 | - name: Sort toml sections 67 | if: steps.check-fixes.outputs.has_fixes == 'true' 68 | run: bash .github/workflows/sort_toml.sh 69 | 70 | - name: Create PR for toml fixes 71 | if: steps.check-fixes.outputs.has_fixes == 'true' 72 | env: 73 | GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} 74 | run: | 75 | # Check if there are actual changes 76 | if git diff --quiet awesome-generator/awesome.toml; then 77 | echo "No changes to awesome.toml" 78 | exit 0 79 | fi 80 | 81 | BRANCH_NAME="auto-fix/toml-updates-$(date +%Y%m%d)" 82 | 83 | # Configure git 84 | git config user.name "github-actions[bot]" 85 | git config user.email "github-actions[bot]@users.noreply.github.com" 86 | 87 | # Create branch and commit 88 | git checkout -b "$BRANCH_NAME" 89 | git add awesome-generator/awesome.toml 90 | git commit -m "Fix owner mismatches and remove not-found repos" 91 | 92 | # Force push (branch may exist from previous run) 93 | git push --force origin "$BRANCH_NAME" 94 | 95 | # Check if PR already exists for this branch 96 | if gh pr view "$BRANCH_NAME" &>/dev/null; then 97 | echo "PR already exists for $BRANCH_NAME" 98 | exit 0 99 | fi 100 | 101 | gh pr create \ 102 | --title "Auto-fix: Update awesome.toml URLs" \ 103 | --body "$(cat <<'EOF' 104 | ## Summary 105 | 106 | This PR was automatically generated to fix issues found during README generation: 107 | 108 | - **Owner mismatches**: Repository URLs where the owner in the toml file doesn't match the actual repository owner 109 | - **Not found**: Repository URLs that returned 404 (deleted or made private) 110 | 111 | Please review the changes before merging. 112 | 113 | 🤖 Generated automatically by CI 114 | EOF 115 | )" \ 116 | --base main 117 | -------------------------------------------------------------------------------- /awesome-generator/src/readme.md.hbs: -------------------------------------------------------------------------------- 1 | # Awesome Garmin 2 | 3 | [![Awesome](https://awesome.re/badge.svg)](https://awesome.re) 4 | 5 | An extensive list of Garmin apps, both for Garmin devices written in [Monkey C] 6 | and tools that integrate with the Garmin ecosystem and services. 7 | 8 | > [!NOTE] 9 | > This README is generated! 10 | > To help exploring relevant resources the items in each segmented are _sorted 11 | > by last activity_ if available. 12 | > 13 | > _This README was last generated at {{ updated_at }}_. 14 | 15 | Contributions are always welcome! To add a new resource, **do not edit this 16 | file**. Instead, add it to [`awesome.toml`][awesome-toml]. If the resource is a 17 | GitHub or GitLab repository with a description, just include the URL. To 18 | customize the name, set name, and to add a missing description, set description. 19 | 20 | Since many resources in this list are outdated, watch faces, widgets, data 21 | fields, and device apps with no activity in the past two years (from the file's 22 | generation date) will be placed in a collapsible section to reduce clutter. 23 | 24 | ## Contents 25 | 26 | - [Watch faces](#watch-faces) 27 | - [Data fields](#data-fields) 28 | - [Widgets](#widgets) 29 | - [Device Apps](#device-apps) 30 | - [Audio Content Providers](#audio-content-providers) 31 | - [Barrels](#barrels) 32 | - [Companion apps](#companion-apps) 33 | - [Tools](#tools) 34 | - [Miscellaneous](#miscellaneous) 35 | 36 | ## Watch faces 37 | 38 | [Watch faces] are a special application type that display on the main screen of 39 | Garmin’s wearable devices. These application types are limited some ways to 40 | allow them to have minimal impact on the device’s battery life. 41 | 42 | {{{resourceList resources.watch_face.active resources.watch_face.inactive false}}} 43 | 44 | ## Data fields 45 | 46 | [Data fields] allow customers and third party developers to write additional 47 | metrics and data that will display with Garmin activities. The goal is to create 48 | a system that not only makes it easy for a user to make a quick data field based 49 | off our workout data, but also gives the developer the the ability to customize 50 | the presentation. 51 | 52 | {{{resourceList resources.data_field.active resources.data_field.inactive}}} 53 | 54 | ## Widgets 55 | 56 | [Widgets] are mini-apps that allow developers to provide glanceable views of 57 | information. The information may be from a cloud service, from the onboard 58 | sensors, or from other Connect IQ APIs. Widgets are launchable from a rotating 59 | carousel of pages accessible from the main screen of wearables, or from a side 60 | view on bike computers and outdoor handhelds. Unlike apps, Widgets time out 61 | after a period of inactivity and are not allowed to record activities, but they 62 | are also launchable at any time. 63 | 64 | {{{resourceList resources.widget.active resources.widget.inactive}}} 65 | 66 | ## Device Apps 67 | 68 | Applications, or [Device Apps], are by far the most robust type of app 69 | available. These allow the most flexibility and customization to the app 70 | designer. They also provide the most access to the capabilities of the wearable 71 | device, such as accessing ANT+ sensors, the accelerometer and reading/recording 72 | FIT files. 73 | 74 | {{{resourceList resources.device_app.active resources.device_app.inactive}}} 75 | 76 | ## Audio content providers 77 | 78 | [Audio content providers]. Garmin media enabled devices are designed for active 79 | lifestyle users who want to listen to music without carrying their phone on 80 | their rides, runs or other activities. The media player allows the user to 81 | listen to their music, podcasts, and audio-books on the go. 82 | 83 | {{{resourceList resources.audio_content_provider.active}}} 84 | 85 | ## Barrels 86 | 87 | Developers can create custom Monkey C libraries, called [Monkey Barrels], that 88 | contain source code and resource information that are easily shared across 89 | Connect IQ Projects. 90 | 91 | {{{resourceList resources.barrel.active}}} 92 | 93 | ## Companion apps 94 | 95 | {{{resourceList resources.companion_app.active}}} 96 | 97 | ## Tools 98 | 99 | {{{resourceList resources.tool.active}}} 100 | 101 | ## Miscellaneous 102 | 103 | {{{resourceList resources.miscellaneous.active}}} 104 | 105 | [awesome-toml]: ./awesome-generator/awesome.toml 106 | [Watch faces]: https://developer.garmin.com/connect-iq/connect-iq-basics/app-types/#watchfaces 107 | [Monkey C]: https://developer.garmin.com/connect-iq/monkey-c/ 108 | [Data fields]: https://developer.garmin.com/connect-iq/connect-iq-basics/app-types/#datafields 109 | [Widgets]: https://developer.garmin.com/connect-iq/connect-iq-basics/app-types/#widgets 110 | [Device Apps]: https://developer.garmin.com/connect-iq/connect-iq-basics/app-types/#deviceapps 111 | [Audio content providers]: https://developer.garmin.com/connect-iq/connect-iq-basics/app-types/#audiocontentproviders 112 | [Monkey Barrels]: https://developer.garmin.com/connect-iq/core-topics/shareable-libraries/ 113 | -------------------------------------------------------------------------------- /awesome-generator/src/search.rs: -------------------------------------------------------------------------------- 1 | //! The search module holds all types returned from and supports 2 | //! searching their app catalog by keyword. 3 | use std::collections::{HashMap, VecDeque}; 4 | use std::future::Future; 5 | use std::pin::Pin; 6 | use std::task::{ready, Poll}; 7 | 8 | use futures::StreamExt; 9 | use pin_project::pin_project; 10 | use prettytable::{row, Table}; 11 | use serde_with::{formats::Flexible, serde_as, TimestampMilliSeconds}; 12 | use url::Url; 13 | 14 | #[derive(Debug, Default, serde::Deserialize)] 15 | #[serde(default, rename_all = "camelCase")] 16 | pub struct ConnectIQLocale { 17 | pub locale: String, 18 | pub name: String, 19 | pub description: String, 20 | pub whats_new: String, 21 | } 22 | 23 | #[derive(Debug, Default, serde::Deserialize)] 24 | #[serde(default, rename_all = "camelCase")] 25 | pub struct ConnectIQDeveloper { 26 | pub full_name: Option, 27 | pub developer_display_name: String, 28 | pub logo_url: Option, 29 | pub logo_url_dark: Option, 30 | pub trusted_developer: bool, 31 | } 32 | 33 | #[derive(Debug, Default, serde::Deserialize)] 34 | #[serde(default, rename_all = "camelCase")] 35 | pub struct ConnectIQFileSize { 36 | pub internal_version_number: i64, 37 | pub byte_count_by_device_type_id: HashMap, 38 | } 39 | 40 | #[derive(Debug, Default, serde::Deserialize)] 41 | #[serde(default, rename_all = "camelCase")] 42 | pub struct ConnecTIQSettingsAvailability { 43 | pub internal_version_number: i64, 44 | pub availability_by_device_type_id: HashMap, 45 | } 46 | 47 | #[serde_as] 48 | #[derive(Debug, Default, serde::Deserialize)] 49 | #[serde(default, rename_all = "camelCase")] 50 | pub struct ConnectIQApp { 51 | pub id: String, 52 | pub developer_id: String, 53 | pub type_id: String, 54 | pub website_url: String, 55 | pub video_url: String, 56 | pub privacy_policy_url: String, 57 | pub support_email_address: String, 58 | pub app_localizations: Vec, 59 | pub status: String, 60 | pub ios_app_url: String, 61 | pub android_app_url: String, 62 | pub icon_file_id: String, 63 | pub latest_external_version: String, 64 | pub latest_internal_version: i64, 65 | pub download_count: i64, 66 | #[serde_as(as = "TimestampMilliSeconds")] 67 | pub changed_date: chrono::DateTime, 68 | pub average_rating: f32, 69 | pub review_count: i64, 70 | pub category_id: String, 71 | pub compatible_device_type_ids: Vec, 72 | pub has_trial_mode: bool, 73 | pub auth_flow_support: i64, 74 | pub permissions: Vec, 75 | pub latest_version_auto_migrated: bool, 76 | pub screenshot_file_ids: Vec, 77 | pub developer: ConnectIQDeveloper, 78 | pub payment_model: i64, 79 | pub file_size_info: ConnectIQFileSize, 80 | pub settings_availability_info: ConnecTIQSettingsAvailability, 81 | } 82 | 83 | #[derive(Debug, Default, serde::Deserialize)] 84 | #[serde(default, rename_all = "camelCase")] 85 | pub struct ConnectIQ { 86 | pub total_count: usize, 87 | pub apps: Vec, 88 | } 89 | 90 | #[derive(Debug, Default, serde::Deserialize)] 91 | #[serde(default, rename_all = "camelCase")] 92 | pub struct ConnectIQDeviceType { 93 | pub additional_names: Vec, 94 | pub id: String, 95 | pub image_url: String, 96 | pub name: String, 97 | pub part_number: String, 98 | pub url_name: String, 99 | } 100 | 101 | #[pin_project] 102 | pub struct ConnectIQSearch { 103 | client: std::sync::Arc, 104 | keyword: String, 105 | apps: VecDeque, 106 | start_page_index: usize, 107 | has_more_pages: bool, 108 | 109 | future: Option>>>>, 110 | } 111 | 112 | impl ConnectIQSearch { 113 | const PAGE_SIZE: usize = 30; 114 | 115 | pub fn new(keyword: String) -> Self { 116 | Self { 117 | client: std::sync::Arc::new(reqwest::Client::new()), 118 | apps: VecDeque::new(), 119 | start_page_index: 0, 120 | has_more_pages: true, 121 | keyword, 122 | future: None, 123 | } 124 | } 125 | 126 | pub fn fetch_next_page(mut self: Pin<&mut Self>, cx: &mut std::task::Context<'_>) -> Poll<()> { 127 | if self.future.is_none() { 128 | let fut = fetch_page( 129 | self.client.clone(), 130 | self.keyword.clone(), 131 | Self::PAGE_SIZE, 132 | self.start_page_index, 133 | ); 134 | 135 | self.future = Some(Box::pin(fut)); 136 | } 137 | 138 | let p = self.project(); 139 | let Some(fut) = (*p.future).as_mut() else { 140 | return Poll::Ready(()); 141 | }; 142 | 143 | match fut.as_mut().poll(cx) { 144 | Poll::Ready(Ok(page)) => { 145 | p.apps.extend(page.apps); 146 | 147 | *p.has_more_pages = *p.start_page_index + Self::PAGE_SIZE < page.total_count; 148 | *p.start_page_index += Self::PAGE_SIZE; 149 | *p.future = None; 150 | 151 | Poll::Ready(()) 152 | } 153 | Poll::Ready(_) => { 154 | *p.has_more_pages = false; 155 | Poll::Ready(()) 156 | } 157 | Poll::Pending => Poll::Pending, 158 | } 159 | } 160 | 161 | pub async fn device_types(&self) -> anyhow::Result> { 162 | let u = Url::parse( 163 | "https://apps.garmin.com/api/appsLibraryExternalServices/api/asw/deviceTypes", 164 | )?; 165 | 166 | Ok(self.client.get(u.as_str()).send().await?.json().await?) 167 | } 168 | } 169 | async fn fetch_page( 170 | client: std::sync::Arc, 171 | keyword: String, 172 | page_size: usize, 173 | start_page_index: usize, 174 | ) -> anyhow::Result { 175 | let mut u = Url::parse( 176 | "https://apps.garmin.com/api/appsLibraryExternalServices/api/asw/apps/keywords", 177 | )?; 178 | 179 | let pairs = [ 180 | ("keywords", keyword.as_str()), 181 | ("pageSize", &page_size.to_string()), 182 | ("sortType", "mostPopular"), 183 | ]; 184 | 185 | u.query_pairs_mut() 186 | .clear() 187 | .extend_pairs(pairs) 188 | .append_pair("startPageIndex", start_page_index.to_string().as_str()); 189 | 190 | Ok(client.get(u.as_str()).send().await?.json().await?) 191 | } 192 | 193 | impl futures::Stream for ConnectIQSearch { 194 | type Item = ConnectIQApp; 195 | 196 | fn poll_next( 197 | mut self: Pin<&mut Self>, 198 | cx: &mut std::task::Context<'_>, 199 | ) -> Poll> { 200 | loop { 201 | if let Some(item) = self.as_mut().apps.pop_front() { 202 | return Poll::Ready(Some(item)); 203 | } 204 | 205 | if !self.has_more_pages { 206 | return Poll::Ready(None); 207 | } 208 | 209 | ready!(self.as_mut().fetch_next_page(cx)) 210 | } 211 | } 212 | } 213 | 214 | pub async fn print_resource_urls(keyword: &str) -> anyhow::Result<()> { 215 | let mut s = ConnectIQSearch::new(keyword.to_string()); 216 | 217 | let mut table = Table::new(); 218 | table.set_format(*prettytable::format::consts::FORMAT_NO_BORDER_LINE_SEPARATOR); 219 | table.set_titles(row!["Change date", "Type", "URL"]); 220 | 221 | while let Some(app) = s.next().await { 222 | if !app.website_url.is_empty() { 223 | let resource_type = format!("{:?}", crate::ResourceType::try_from(app.type_id)?); 224 | table.add_row(row![app.changed_date, resource_type, app.website_url]); 225 | } 226 | } 227 | 228 | table.printstd(); 229 | 230 | Ok(()) 231 | } 232 | -------------------------------------------------------------------------------- /awesome-generator/src/lib.rs: -------------------------------------------------------------------------------- 1 | use futures::StreamExt; 2 | use gitlab::{api::AsyncQuery, AsyncGitlab}; 3 | use handlebars::{no_escape, Context, Handlebars, Helper, HelperResult, Output, RenderContext}; 4 | use octocrab::{models::Author, Octocrab}; 5 | use serde::{Deserialize, Serialize}; 6 | use serde_with::{serde_as, NoneAsEmptyString}; 7 | use std::{ 8 | collections::{BTreeMap, HashMap, HashSet}, 9 | io::Read, 10 | sync::{Arc, Mutex}, 11 | }; 12 | 13 | pub mod search; 14 | 15 | /// The template that will be used to render the README. 16 | const TEMPLATE: &str = include_str!("readme.md.hbs"); 17 | 18 | /// We do concurrent requests to GitHub and GitLab to speed up the process but we don't want to 19 | /// hammer too hard so we limit the concurrent requests. 20 | const MAX_CONCURRENT_REQUESTS: usize = 20; 21 | 22 | /// If a repository has been inactive for more than 2 years we consider it to be inactive. These 23 | /// might still be useful for reference but are put away under a separate menu to reduce noise. 24 | const MAX_AGE_BEFORE_OLD: std::time::Duration = std::time::Duration::from_secs(86400 * 365 * 2); 25 | 26 | /// Represents an owner fix that needs to be applied to the toml file. 27 | #[derive(Debug, Serialize)] 28 | struct OwnerFix { 29 | old_url: String, 30 | new_url: String, 31 | } 32 | 33 | /// Collects all issues found during README generation that can be auto-fixed. 34 | #[derive(Debug, Default, Serialize)] 35 | struct TomlFixes { 36 | /// URLs where the owner in the toml doesn't match the actual repo owner 37 | owner_mismatches: Vec, 38 | /// URLs that returned "Not Found" and should be removed 39 | not_found: Vec, 40 | } 41 | 42 | /// [`GarminResources`] is a nested [`BTreeMap`] that contains each resource type and for each type 43 | /// one active and one inactive key with a list of resources. The content looks something like 44 | /// this: 45 | /// 46 | /// ```json 47 | /// { 48 | /// "watch_face": { 49 | /// "active": [ resource_1, resource_2, resource_3 ], 50 | /// "inactive": [ resource_4 ] 51 | /// }, 52 | /// "device_app": { 53 | /// "active": [ resource_5, resource_6 ], 54 | /// "inactive": [] 55 | /// } 56 | /// } 57 | /// ``` 58 | type GarminResources = BTreeMap>>; 59 | 60 | /// A resource type is the type a resource can have mapped to the Garmin ecosystem. This also 61 | /// includes some extra types for those projects not related to device app development. 62 | /// https://developer.garmin.com/connect-iq/connect-iq-basics/app-types/ 63 | #[derive(Clone, Debug)] 64 | enum ResourceType { 65 | WatchFace, 66 | DataField, 67 | Widget, 68 | DeviceApp, 69 | AudioContentProvider, 70 | Barrel, 71 | Tool, 72 | CompanionApp, 73 | Miscellaneous, 74 | } 75 | 76 | impl TryFrom for ResourceType { 77 | type Error = anyhow::Error; 78 | 79 | fn try_from(value: String) -> Result { 80 | match value.as_str() { 81 | "1" => Ok(Self::WatchFace), 82 | "2" => Ok(Self::DeviceApp), 83 | "3" => Ok(Self::Widget), 84 | "4" => Ok(Self::DataField), 85 | "5" => Ok(Self::AudioContentProvider), 86 | id => Err(anyhow::anyhow!("invalid type id: {}", id)), 87 | } 88 | } 89 | } 90 | 91 | impl ResourceType { 92 | /// The status key will be based on the cut-off date for some resource types but not all. For 93 | /// the specified resource types we never put them in the `inactive` key since we always want 94 | /// to display them. 95 | fn status_key(&self, is_old: bool) -> String { 96 | let inactive = match self { 97 | ResourceType::AudioContentProvider 98 | | ResourceType::Barrel 99 | | ResourceType::Tool 100 | | ResourceType::CompanionApp 101 | | ResourceType::Miscellaneous => false, 102 | _ => is_old, 103 | }; 104 | 105 | String::from(if inactive { "inactive" } else { "active" }) 106 | } 107 | } 108 | 109 | impl std::fmt::Display for ResourceType { 110 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { 111 | match self { 112 | Self::WatchFace => write!(f, "watch_face"), 113 | Self::DataField => write!(f, "data_field"), 114 | Self::Widget => write!(f, "widget"), 115 | Self::DeviceApp => write!(f, "device_app"), 116 | Self::AudioContentProvider => write!(f, "audio_content_provider"), 117 | Self::Barrel => write!(f, "barrel"), 118 | Self::Tool => write!(f, "tool"), 119 | Self::CompanionApp => write!(f, "companion_app"), 120 | Self::Miscellaneous => write!(f, "miscellaneous"), 121 | } 122 | } 123 | } 124 | 125 | /// The TomlFileItem represents a single row in the TOML file that is used to define resources. 126 | /// Currently it only contains support for a custom name and a description. This is mostly useful 127 | /// if the resource is not a GitHub or GitLab repository. 128 | #[serde_as] 129 | #[derive(Debug, Serialize, Deserialize)] 130 | struct TomlFileItem { 131 | #[serde_as(as = "NoneAsEmptyString")] 132 | #[serde(default)] 133 | name: Option, 134 | #[serde_as(as = "NoneAsEmptyString")] 135 | #[serde(default)] 136 | description: Option, 137 | } 138 | 139 | /// The TOML file holds all resources that should be generated in the final README. 140 | #[derive(Debug, Deserialize)] 141 | struct TomlFile { 142 | watch_faces: HashMap, 143 | data_fields: HashMap, 144 | widgets: HashMap, 145 | device_apps: HashMap, 146 | audio_content_providers: HashMap, 147 | barrels: HashMap, 148 | tools: HashMap, 149 | companion_apps: HashMap, 150 | miscellaneous: HashMap, 151 | } 152 | 153 | /// A [`GarminResource`] is the resource that is populated after resolving the TOML file contents 154 | /// and fetching additional information from an API. It holds all the data used to render the 155 | /// README items. 156 | #[derive(Debug, Serialize)] 157 | struct GarminResource { 158 | name: String, 159 | description: Option, 160 | url: String, 161 | #[serde(with = "ymd_date")] 162 | last_updated: Option>, 163 | is_archived: bool, 164 | star_count: Option, 165 | } 166 | 167 | /// The data that is passed to render the template. It contains all the resolved Garmin resources 168 | /// grouped by type and a timestamp to set when the file was generated. 169 | #[derive(Serialize)] 170 | struct Template { 171 | resources: GarminResources, 172 | updated_at: String, 173 | } 174 | 175 | /// The GitLab client does not come with pre-defined types, instead it will deserialize to whatever 176 | /// type the user define. This is the only data we're currently interested in. 177 | #[derive(Debug, Deserialize)] 178 | struct GitLabProject { 179 | name: String, 180 | description: Option, 181 | last_activity_at: chrono::DateTime, 182 | archived: bool, 183 | star_count: u32, 184 | } 185 | 186 | /// Generate the README based on all the contents in `awesome.toml`. If the element is a link to 187 | /// GitHub or GitLab their API will be called to fetch description and information about last 188 | /// activity. 189 | pub async fn generate_readme() -> anyhow::Result<()> { 190 | let resources = read_toml_file()?; 191 | let octocrab = Arc::new( 192 | octocrab::OctocrabBuilder::new() 193 | .personal_token(std::env::var("GITHUB_TOKEN")?) 194 | .build()?, 195 | ); 196 | let glab = Arc::new( 197 | gitlab::GitlabBuilder::new("gitlab.com", std::env::var("GITLAB_TOKEN")?) 198 | .build_async() 199 | .await?, 200 | ); 201 | 202 | let data: Arc> = Arc::new(Mutex::new(BTreeMap::new())); 203 | let fixes: Arc> = Arc::new(Mutex::new(TomlFixes::default())); 204 | 205 | let resource_types = vec![ 206 | (ResourceType::WatchFace, resources.watch_faces), 207 | (ResourceType::DataField, resources.data_fields), 208 | (ResourceType::Widget, resources.widgets), 209 | (ResourceType::DeviceApp, resources.device_apps), 210 | ( 211 | ResourceType::AudioContentProvider, 212 | resources.audio_content_providers, 213 | ), 214 | (ResourceType::Barrel, resources.barrels), 215 | (ResourceType::Tool, resources.tools), 216 | (ResourceType::CompanionApp, resources.companion_apps), 217 | (ResourceType::Miscellaneous, resources.miscellaneous), 218 | ]; 219 | 220 | let mut futures = Vec::new(); 221 | for (resource_type, resources) in resource_types { 222 | for (resource_url, resource) in resources { 223 | futures.push(update_resource( 224 | resource_type.clone(), 225 | resource_url, 226 | resource, 227 | octocrab.clone(), 228 | glab.clone(), 229 | data.clone(), 230 | fixes.clone(), 231 | )); 232 | } 233 | } 234 | 235 | let stream = futures::stream::iter(futures).buffer_unordered(MAX_CONCURRENT_REQUESTS); 236 | stream.collect::>().await; 237 | 238 | let mut hb = Handlebars::new(); 239 | hb.register_escape_fn(no_escape); 240 | hb.register_template_string("readme", TEMPLATE).unwrap(); 241 | hb.register_helper("resourceList", Box::new(resource_list_helper)); 242 | 243 | { 244 | let mut d = data.lock().unwrap(); 245 | for (_, v) in d.iter_mut() { 246 | for (_, i) in v.iter_mut() { 247 | sorted_resources(i); 248 | } 249 | } 250 | } 251 | 252 | let template = Template { 253 | resources: Arc::try_unwrap(data).unwrap().into_inner()?, 254 | updated_at: chrono::Utc::now().format("%Y-%m-%d").to_string(), 255 | }; 256 | 257 | println!("{}", hb.render("readme", &template)?); 258 | 259 | // Write fixes file if there are any issues to fix 260 | let fixes = Arc::try_unwrap(fixes).unwrap().into_inner()?; 261 | if !fixes.owner_mismatches.is_empty() || !fixes.not_found.is_empty() { 262 | let fixes_json = serde_json::to_string_pretty(&fixes)?; 263 | std::fs::write("toml-fixes.json", fixes_json)?; 264 | eprintln!( 265 | "\n📝 Found {} owner mismatch(es) and {} not-found resource(s). Written to toml-fixes.json", 266 | fixes.owner_mismatches.len(), 267 | fixes.not_found.len() 268 | ); 269 | } 270 | 271 | Ok(()) 272 | } 273 | 274 | fn resource_list_helper( 275 | h: &Helper, 276 | _: &Handlebars, 277 | _: &Context, 278 | _: &mut RenderContext, 279 | out: &mut dyn Output, 280 | ) -> HelperResult { 281 | let mut output = String::new(); 282 | 283 | let show_description = h 284 | .param(2) 285 | .is_none_or(|p| p.value().as_bool().unwrap_or(true)); 286 | 287 | let active = h.param(0).unwrap().value(); 288 | output.push_str(&resources_to_str(active, show_description)); 289 | 290 | if let Some(inactive_list) = h.param(1) { 291 | let inactive = resources_to_str(inactive_list.value(), show_description); 292 | if !inactive.is_empty() { 293 | output.push_str(&format!( 294 | r#" 295 | ### Older resources 296 | 297 |
298 | Click to expand 299 | 300 | {inactive} 301 | 302 |
"# 303 | )); 304 | } 305 | } 306 | 307 | out.write(output.as_str())?; 308 | 309 | Ok(()) 310 | } 311 | 312 | fn resources_to_str(resources: &serde_json::Value, show_description: bool) -> String { 313 | let mut output = String::new(); 314 | 315 | if let Some(active_list) = resources.as_array() { 316 | if show_description { 317 | output.push_str("| Name | Description | Last updated | Stars |\n"); 318 | output.push_str("| ---- | ----------- | ----------------- | ----- |\n"); 319 | } else { 320 | output.push_str("| Name | Last updated | Stars |\n"); 321 | output.push_str("| ---- | ----------------- | ----- |\n"); 322 | } 323 | 324 | for resource in active_list { 325 | if let Some(name) = resource.get("name").and_then(|n| n.as_str()) { 326 | let url = resource.get("url").and_then(|u| u.as_str()).unwrap_or("#"); 327 | let description = resource 328 | .get("description") 329 | .and_then(|d| d.as_str().map(|v| v.replace("|", "-"))); 330 | let star_count = resource.get("star_count").and_then(|s| s.as_u64()); 331 | let last_updated = resource.get("last_updated").and_then(|l| l.as_str()); 332 | let is_archived = resource.get("is_archived").and_then(|a| a.as_bool()); 333 | 334 | output.push_str(&format!("| [{name}]({url}) ")); 335 | 336 | if show_description { 337 | if let Some(description) = description { 338 | output.push_str(&format!("| {description} ")); 339 | } else { 340 | output.push_str("| "); 341 | } 342 | } 343 | 344 | let is_archived = if let Some(true) = is_archived { 345 | "🗄️" 346 | } else { 347 | "" 348 | }; 349 | 350 | if let Some(date) = last_updated { 351 | output.push_str(&format!("| {date} {is_archived} ")); 352 | } else { 353 | output.push_str("| {is_archived} "); 354 | } 355 | 356 | if let Some(stars) = star_count { 357 | output.push_str("| "); 358 | if stars > 0 { 359 | output.push_str(&format!("⭐{stars} ")); 360 | } 361 | } 362 | 363 | output.push_str("|\n"); 364 | } 365 | } 366 | } 367 | 368 | output 369 | } 370 | 371 | /// Read the toml file and return the prased file as a [`TomlFile`]. 372 | fn read_toml_file() -> anyhow::Result { 373 | let mut toml_content = String::new(); 374 | std::fs::File::open("awesome.toml") 375 | .expect("Failed to open awesome.toml") 376 | .read_to_string(&mut toml_content) 377 | .expect("Failed to read awesome.toml"); 378 | 379 | Ok(toml::from_str(&toml_content)?) 380 | } 381 | 382 | /// The resources will be sorted by date - if they have any, and then by name. 383 | fn sorted_resources(resources: &mut [GarminResource]) { 384 | resources.sort_by(|a, b| match (a.last_updated, b.last_updated) { 385 | (None, None) => a.name.cmp(&b.name), 386 | (Some(u1), Some(u2)) => u2.cmp(&u1).then(a.name.cmp(&b.name)), 387 | (None, Some(_)) => std::cmp::Ordering::Greater, 388 | (Some(_), None) => std::cmp::Ordering::Less, 389 | }); 390 | } 391 | 392 | /// A single resources is updated based on the URL. It will be added to the `GarminResources` once 393 | /// resolved and not return any data. 394 | async fn update_resource( 395 | resource_type: ResourceType, 396 | resource_url: String, 397 | resource: TomlFileItem, 398 | octocrab: Arc, 399 | glab: Arc, 400 | data: Arc>, 401 | fixes: Arc>, 402 | ) { 403 | eprintln!("Updating {}", resource_url); 404 | 405 | let (resource, is_old) = if resource_url.contains("github.com") { 406 | update_github_resource(resource_url, &resource, octocrab, fixes).await 407 | } else if resource_url.contains("gitlab.com") { 408 | update_gitlab_resource(resource_url, &resource, glab).await 409 | } else if let Some(name) = resource.name { 410 | ( 411 | Some(GarminResource { 412 | name, 413 | description: resource.description, 414 | url: resource_url, 415 | last_updated: None, 416 | is_archived: false, 417 | star_count: None, 418 | }), 419 | true, 420 | ) 421 | } else { 422 | return; 423 | }; 424 | 425 | if let Some(resource) = resource { 426 | let resource_type_name = resource_type.to_string(); 427 | let resource_status_key = resource_type.status_key(is_old); 428 | 429 | let mut resource_type = data.lock().unwrap(); 430 | let resources = resource_type.entry(resource_type_name).or_default(); 431 | let resource_list = resources.entry(resource_status_key).or_default(); 432 | 433 | resource_list.push(resource) 434 | } 435 | } 436 | 437 | /// Will poll the GitHub API and fetch information about the repo. 438 | async fn update_github_resource( 439 | resource_url: String, 440 | resource: &TomlFileItem, 441 | octocrab: Arc, 442 | fixes: Arc>, 443 | ) -> (Option, bool) { 444 | let u = url::Url::parse(&resource_url).unwrap(); 445 | let mut owner_repo = u.path().strip_prefix('/').unwrap().split('/'); 446 | let owner = owner_repo.next().unwrap(); 447 | let repo = owner_repo.next().unwrap(); 448 | let result = match octocrab.repos(owner, repo).get().await { 449 | Ok(result) => result, 450 | Err(octocrab::Error::GitHub { source, .. }) => { 451 | eprintln!("⚠️ Could not get {resource_url}: {}", source.message); 452 | 453 | if source.message.contains("Not Found") { 454 | fixes.lock().unwrap().not_found.push(resource_url); 455 | } 456 | 457 | return (None, false); 458 | } 459 | Err(err) => { 460 | eprintln!("⚠️ Could not get {resource_url}: {err}"); 461 | return (None, false); 462 | } 463 | }; 464 | 465 | if let Some(Author { login, .. }) = result.owner { 466 | if owner.to_lowercase() != login.to_lowercase() { 467 | eprintln!("⚠️ Owner in toml file ({owner}) does not match the repo ({login})"); 468 | let new_url = resource_url.replace( 469 | &format!("github.com/{owner}"), 470 | &format!("github.com/{login}"), 471 | ); 472 | 473 | fixes.lock().unwrap().owner_mismatches.push(OwnerFix { 474 | old_url: resource_url.clone(), 475 | new_url, 476 | }); 477 | } 478 | }; 479 | 480 | let garmin_resource = GarminResource { 481 | name: repo.to_string(), 482 | description: Some( 483 | resource 484 | .description 485 | .clone() 486 | .unwrap_or(result.description.unwrap_or_default()), 487 | ), 488 | url: resource_url.to_string(), 489 | last_updated: result.pushed_at, 490 | is_archived: result.archived.unwrap_or_default(), 491 | star_count: result.stargazers_count, 492 | }; 493 | 494 | let is_old = if let Some(pushed_at) = result.pushed_at { 495 | pushed_at < chrono::Utc::now() - MAX_AGE_BEFORE_OLD 496 | } else { 497 | false 498 | }; 499 | 500 | (Some(garmin_resource), is_old) 501 | } 502 | 503 | /// Will poll the GitLab API and fetch information about the repo. 504 | async fn update_gitlab_resource( 505 | resource_url: String, 506 | resource: &TomlFileItem, 507 | glab: Arc, 508 | ) -> (Option, bool) { 509 | let u = url::Url::parse(&resource_url).unwrap(); 510 | let owner_repo = u.path().strip_prefix('/').unwrap(); 511 | let endpoint = gitlab::api::projects::Project::builder() 512 | .project(owner_repo) 513 | .build() 514 | .unwrap(); 515 | let result: GitLabProject = match endpoint.query_async(glab.as_ref()).await { 516 | Ok(result) => result, 517 | Err(err) => { 518 | eprintln!("⚠️ Could not get {}: {err}", resource_url); 519 | return (None, false); 520 | } 521 | }; 522 | 523 | let garmin_resource = GarminResource { 524 | name: result.name, 525 | description: Some( 526 | resource 527 | .description 528 | .clone() 529 | .unwrap_or(result.description.unwrap_or_default()), 530 | ), 531 | url: resource_url.to_string(), 532 | last_updated: Some(result.last_activity_at), 533 | is_archived: result.archived, 534 | star_count: Some(result.star_count), 535 | }; 536 | 537 | ( 538 | Some(garmin_resource), 539 | result.last_activity_at < chrono::Utc::now() - MAX_AGE_BEFORE_OLD, 540 | ) 541 | } 542 | 543 | /// Compare what's in the `awesome.toml` file with all the found search results based on the given 544 | /// `keyword`. This is a manual but easy way to see which resources are not listed yet. 545 | /// 546 | /// The output will look just like the toml file to make it easy to compare or copy/paste. 547 | pub async fn compare(keyword: &str) -> anyhow::Result<()> { 548 | let resources = read_toml_file()?; 549 | let toml_file_keys = vec![ 550 | resources.watch_faces.keys().collect::>(), 551 | resources.data_fields.keys().collect::>(), 552 | resources.widgets.keys().collect::>(), 553 | resources.device_apps.keys().collect::>(), 554 | resources 555 | .audio_content_providers 556 | .keys() 557 | .collect::>(), 558 | resources.barrels.keys().collect::>(), 559 | resources.tools.keys().collect::>(), 560 | resources.companion_apps.keys().collect::>(), 561 | resources.miscellaneous.keys().collect::>(), 562 | ]; 563 | 564 | let tomle_file_urls = toml_file_keys 565 | .into_iter() 566 | .flatten() 567 | .map(|i| i.to_owned()) 568 | .collect::>(); 569 | 570 | // Store each app type in a separate `HashSet` so we can print it properly. 571 | let mut watch_faces = HashSet::new(); 572 | let mut data_fields = HashSet::new(); 573 | let mut widgets = HashSet::new(); 574 | let mut device_apps = HashSet::new(); 575 | let mut audio_content_providers = HashSet::new(); 576 | 577 | let mut s = crate::search::ConnectIQSearch::new(keyword.to_string()); 578 | while let Some(app) = s.next().await { 579 | if app.website_url.is_empty() { 580 | continue; 581 | } 582 | 583 | if !app.website_url.starts_with("https://github") 584 | && !app.website_url.starts_with("https://gitlab") 585 | { 586 | continue; 587 | } 588 | 589 | // A lot of URLs goes to paths in a multi repo or have a trailing slash. This list only 590 | // contains full repos so we only care about the repo base URL. 591 | let parsed_url = url::Url::parse(&app.website_url)?; 592 | let repo_base_url = format!( 593 | "{}://{}{}", 594 | parsed_url.scheme(), 595 | parsed_url.host_str().unwrap(), 596 | parsed_url 597 | .path() 598 | .split('/') 599 | .take(3) 600 | .collect::>() 601 | .join("/") 602 | ); 603 | 604 | if tomle_file_urls.contains(&repo_base_url) { 605 | continue; 606 | } 607 | 608 | let resource_type = ResourceType::try_from(app.type_id)?; 609 | match resource_type { 610 | ResourceType::WatchFace => watch_faces.insert(app.website_url), 611 | ResourceType::DataField => data_fields.insert(app.website_url.clone()), 612 | ResourceType::Widget => widgets.insert(app.website_url.clone()), 613 | ResourceType::DeviceApp => device_apps.insert(app.website_url.clone()), 614 | ResourceType::AudioContentProvider => { 615 | audio_content_providers.insert(app.website_url.clone()) 616 | } 617 | _ => unreachable!(), 618 | }; 619 | } 620 | 621 | println!( 622 | "Found {} URLs not in list\n", 623 | watch_faces.len() 624 | + data_fields.len() 625 | + widgets.len() 626 | + device_apps.len() 627 | + audio_content_providers.len() 628 | ); 629 | 630 | for (app_set, header) in [ 631 | (watch_faces, "watch_faces"), 632 | (data_fields, "data_fields"), 633 | (widgets, "widgets"), 634 | (device_apps, "device_apps"), 635 | (audio_content_providers, "audio_content_providers"), 636 | ] { 637 | if !app_set.is_empty() { 638 | println!("[{header}]"); 639 | for u in app_set { 640 | println!("\"{u}\" = {{}}"); 641 | } 642 | 643 | println!(); 644 | } 645 | } 646 | 647 | Ok(()) 648 | } 649 | 650 | /// [`ymd_date`] implements a serializer to show a more condensed date in the README. It will only 651 | /// show YYYY-MM-DD. 652 | mod ymd_date { 653 | use serde::{self, Serializer}; 654 | 655 | const FORMAT: &str = "%Y‑%m‑%d"; 656 | 657 | pub fn serialize( 658 | date: &Option>, 659 | serializer: S, 660 | ) -> Result 661 | where 662 | S: Serializer, 663 | { 664 | match date { 665 | Some(date) => { 666 | let s = format!("{}", date.format(FORMAT)); 667 | serializer.serialize_str(&s) 668 | } 669 | None => serializer.serialize_str(""), 670 | } 671 | } 672 | } 673 | 674 | #[cfg(test)] 675 | mod test { 676 | use std::sync::{Arc, Mutex}; 677 | 678 | use crate::{sorted_resources, GarminResource, TomlFileItem, TomlFixes}; 679 | 680 | #[test] 681 | fn same_updated_should_sort_on_name() { 682 | let t0 = chrono::Utc::now(); 683 | let t1 = t0 - std::time::Duration::from_secs(5); 684 | 685 | let mut r = vec![ 686 | GarminResource { 687 | name: "Name A".to_string(), 688 | last_updated: Some(t1), 689 | description: None, 690 | url: "#".to_string(), 691 | is_archived: false, 692 | star_count: None, 693 | }, 694 | GarminResource { 695 | name: "Name C".to_string(), 696 | last_updated: Some(t0), 697 | description: None, 698 | url: "#".to_string(), 699 | is_archived: false, 700 | star_count: None, 701 | }, 702 | GarminResource { 703 | name: "Name B".to_string(), 704 | last_updated: Some(t0), 705 | description: None, 706 | url: "#".to_string(), 707 | is_archived: false, 708 | star_count: None, 709 | }, 710 | ]; 711 | 712 | sorted_resources(&mut r); 713 | 714 | let names = r.into_iter().map(|n| n.name).collect::>(); 715 | 716 | assert_eq!( 717 | names, 718 | vec![ 719 | "Name B".to_string(), 720 | "Name C".to_string(), 721 | "Name A".to_string() 722 | ] 723 | ); 724 | } 725 | 726 | #[tokio::test] 727 | async fn test_github() { 728 | let empy_toml = TomlFileItem { 729 | name: None, 730 | description: None, 731 | }; 732 | let octocrab = Arc::new( 733 | octocrab::OctocrabBuilder::new() 734 | .personal_token(std::env::var("GITHUB_TOKEN").unwrap()) 735 | .build() 736 | .unwrap(), 737 | ); 738 | 739 | let url = "https://github.com/bombsimon/garmin-seaside"; 740 | let fixes = Arc::new(Mutex::new(TomlFixes::default())); 741 | let (resource, _) = 742 | super::update_github_resource(url.to_string(), &empy_toml, octocrab.clone(), fixes) 743 | .await; 744 | 745 | assert!(resource.is_some()); 746 | 747 | let resource_data = resource.unwrap(); 748 | assert!(resource_data.star_count.unwrap_or(0) >= 1); 749 | assert!(resource_data.description.is_some()); 750 | assert_eq!(resource_data.name, "garmin-seaside".to_string()); 751 | assert_eq!(resource_data.url, url.to_string()); 752 | assert!(!resource_data.is_archived); 753 | } 754 | 755 | #[tokio::test] 756 | async fn test_gitlab() { 757 | let empy_toml = TomlFileItem { 758 | name: None, 759 | description: None, 760 | }; 761 | let glab = Arc::new( 762 | gitlab::GitlabBuilder::new("gitlab.com", std::env::var("GITLAB_TOKEN").unwrap()) 763 | .build_async() 764 | .await 765 | .unwrap(), 766 | ); 767 | 768 | let url = "https://gitlab.com/knusprjg/plotty-mcclockface"; 769 | let (resource, _) = 770 | super::update_gitlab_resource(url.to_string(), &empy_toml, glab.clone()).await; 771 | 772 | assert!(resource.is_some()); 773 | 774 | let resource_data = resource.unwrap(); 775 | assert!(resource_data.star_count.unwrap_or(0) >= 1); 776 | assert!(resource_data.description.is_some()); 777 | assert_eq!(resource_data.name, "Plotty McClockface".to_string()); 778 | assert_eq!(resource_data.url, url.to_string()); 779 | assert!(!resource_data.is_archived); 780 | } 781 | } 782 | -------------------------------------------------------------------------------- /awesome-generator/awesome.toml: -------------------------------------------------------------------------------- 1 | [watch_faces] 2 | "https://github.com/30Wedge/SwagginNumerals" = {} 3 | "https://github.com/ATGH15102AFMLD/Watchface-Cuphead" = {} 4 | "https://github.com/AYCHPlus/AYCHFace" = {} 5 | "https://github.com/AmitPandya007/GarminSampleWatch" = {} 6 | "https://github.com/Anemosx/aion" = {} 7 | "https://github.com/BDH-Software/ThePlanets-Watchface" = {} 8 | "https://github.com/BodyFatControl/garmin_watchface" = {} 9 | "https://github.com/Chemaclass/BinaryWatchFace" = {} 10 | "https://github.com/Chiocciola/Graphomatic" = {} 11 | "https://github.com/ChrisWeldon/GarminMinimalVenuWatchface" = {} 12 | "https://github.com/CodyJung/connectiq-apps" = {} 13 | "https://github.com/Cutwell/garmin-celestial-watchface" = {} 14 | "https://github.com/DRG-developer/DRG-Clutterless" = {} 15 | "https://github.com/DRG-developer/DRG-Essential" = {} 16 | "https://github.com/DRG-developer/DRG-Nathos" = {} 17 | "https://github.com/DRG-developer/DRG_SNT_3" = {} 18 | "https://github.com/DeCaPa/MyBigDate" = {} 19 | "https://github.com/DenysTT/Garmin_BackToTheFuture_WatchFace" = {} 20 | "https://github.com/Gumix/garmin-watchfaces" = {} 21 | "https://github.com/HanSolo/digital" = {} 22 | "https://github.com/HanSolo/digital5" = {} 23 | "https://github.com/HikiQ/DistanceFace" = {} 24 | "https://github.com/Holger-L/EasyDisplay" = {} 25 | "https://github.com/HookyQR/TidyWatch" = {} 26 | "https://github.com/IanGrainger/philippe-watchface" = {} 27 | "https://github.com/JoopVerdoorn/DR4c0" = {} 28 | "https://github.com/JoopVerdoorn/DR4c1" = {} 29 | "https://github.com/JoopVerdoorn/DR4c2" = {} 30 | "https://github.com/JoopVerdoorn/DR5c2" = {} 31 | "https://github.com/JoopVerdoorn/DR6c0" = {} 32 | "https://github.com/JoopVerdoorn/DR6c1" = {} 33 | "https://github.com/JoopVerdoorn/DR6c2" = {} 34 | "https://github.com/JoopVerdoorn/DR7c0" = {} 35 | "https://github.com/JoopVerdoorn/DR7c2" = {} 36 | "https://github.com/JoopVerdoorn/DR8-10c0" = {} 37 | "https://github.com/JoopVerdoorn/DU8-10c3" = {} 38 | "https://github.com/JoshuaTheMiller/Multivision-Watch" = {} 39 | "https://github.com/KWottrich/TimelyFenix" = {} 40 | "https://github.com/Korimsoft/ConnectIQ-ProgbarWatchFace" = {} 41 | "https://github.com/Laverlin/Yet-Another-WatchFace" = {} 42 | "https://github.com/MrJacquers/GarminBlendWatchFace" = {} 43 | "https://github.com/NickSteen/BYOD-Watchface" = {} 44 | "https://github.com/OliverHannover/Aviatorlike" = {} 45 | "https://github.com/OliverHannover/Aviatorlike_1Hz" = {} 46 | "https://github.com/OliverHannover/Formula_1" = {} 47 | "https://github.com/Peterdedecker/kudos" = {} 48 | "https://github.com/Prime1Code/OnAGlimpse" = {} 49 | "https://github.com/RyanDam/Infocal" = {} 50 | "https://github.com/SarahBass/BanjoGarmin" = {} 51 | "https://github.com/SarahBass/BeachKittyGarmin" = {} 52 | "https://github.com/SarahBass/BeetleJuice" = {} 53 | "https://github.com/SarahBass/CandyAdventure" = {} 54 | "https://github.com/SarahBass/Cycle-View-Garmin-Watch-Pig" = {} 55 | "https://github.com/SarahBass/Data-Heavy-Garmin-Watchface" = {} 56 | "https://github.com/SarahBass/GarminKirby" = {} 57 | "https://github.com/SarahBass/HalloweenCat" = {} 58 | "https://github.com/SarahBass/Ocean" = {} 59 | "https://github.com/SarahBass/PocketAsh" = {} 60 | "https://github.com/SarahBass/PocketPika" = {} 61 | "https://github.com/SarahBass/PokemonFishing" = {} 62 | "https://github.com/SarahBass/PokemonGarmin" = {} 63 | "https://github.com/SarahBass/PoolPanda" = {} 64 | "https://github.com/SarahBass/Rainforest" = {} 65 | "https://github.com/SarahBass/Virtual-Garmin-Pet" = {} 66 | "https://github.com/SarahBass/VirtualPetMonkey" = {} 67 | "https://github.com/SarahBass/VirtualStarPetGarmin" = {} 68 | "https://github.com/SarahBass/VirtualStarWatchGARMIN" = {} 69 | "https://github.com/SarahBass/YoshiGarmin" = {} 70 | "https://github.com/SarahBass/blackcatGarmin" = {} 71 | "https://github.com/StefanStefanoff/VivoactiveAtreliosWatchFace" = {} 72 | "https://github.com/SylvainGa/crystal-face" = {} 73 | "https://github.com/ToryStark/connect-iq" = {} 74 | "https://github.com/WHalford/WHatch4Me" = {} 75 | "https://github.com/adamdanielczyk/garmin-mini-chrono" = {} 76 | "https://github.com/ahuggel/SwissRailwayClock" = {} 77 | "https://github.com/akendrick451/AKInstinctQuotesStatsMoveBar" = {} 78 | "https://github.com/aklarl/BavarianWatchFace" = {} 79 | "https://github.com/alni/AlniLargeTimeWatchFace" = {} 80 | "https://github.com/andriijas/connectiq-apps" = {} 81 | "https://github.com/ankineri/gweatherwatch" = {} 82 | "https://github.com/antonioasaro/GARMIN-AMD_Watchface" = {} 83 | "https://github.com/ayaromenok/WatchFaceMonospace" = {} 84 | "https://github.com/backface/AnalogSeed" = {} 85 | "https://github.com/berryk/ConnectIQ-WorldTime-Face" = {} 86 | "https://github.com/bhugh/ElegantAnalog-Watchface" = {} 87 | "https://github.com/blotspot/garmin-watchface-protomolecule" = {} 88 | "https://github.com/bodnar13/JBWatch" = {} 89 | "https://github.com/bodyazn/COVID19WF" = {} 90 | "https://github.com/bombsimon/garmin-seaside" = {} 91 | "https://github.com/cekeller6121/Garmin-Watchface" = {} 92 | "https://github.com/chakflying/tactix-fenix" = {} 93 | "https://github.com/cizi/Sundance" = {} 94 | "https://github.com/claudiocandio/Garmin-WatchCLC" = {} 95 | "https://github.com/cy384/copernicus" = {} 96 | "https://github.com/darrencroton/Snapshot" = {} 97 | "https://github.com/darrencroton/SnapshotHR" = {} 98 | "https://github.com/darrencroton/SnapshotRHR" = {} 99 | "https://github.com/darrencroton/SnapshotWatch" = {} 100 | "https://github.com/dbanno/ConnectIQ-8-BitWatch" = {} 101 | "https://github.com/dbcm/KISSFace" = {} 102 | "https://github.com/dennybiasiolli/garmin-connect-iq" = {} 103 | "https://github.com/derbartigelady/Tac" = {} 104 | "https://github.com/dev-whiterice/Essence" = {} 105 | "https://github.com/deviammx/dexli-watchface" = {} 106 | "https://github.com/dimasmith/binary-clock" = {} 107 | "https://github.com/dmllr/vaguetime-watch-face" = {} 108 | "https://github.com/domosia/Retro-Quartz-Digital-Watch" = {} 109 | "https://github.com/douglasr/connectiq-logo-analog" = {} 110 | "https://github.com/dryotta/garmin-watchface-40d-mip-power" = {} 111 | "https://github.com/eiveiv/erock20" = {} 112 | "https://github.com/eldes/presbyopia-watch-face" = {} 113 | "https://github.com/elp87/elp87GarminWatchFace" = {} 114 | "https://github.com/erikvb/Digital5Reloaded" = {} 115 | "https://github.com/fabrikant/FontLessFace" = {} 116 | "https://github.com/fabrikant/LowEnergyFace" = {} 117 | "https://github.com/fabrikant/LowEnergyFace2" = {} 118 | "https://github.com/fabrikant/WWF" = {} 119 | "https://github.com/fabrikant/WWF4" = {} 120 | "https://github.com/fabrikant/WWF5" = {} 121 | "https://github.com/fevieira27/MoveToBeActive" = {} 122 | "https://github.com/fjbenitog/digital-watch-cas10" = {} 123 | "https://github.com/funix83/Funix-Watch" = {} 124 | "https://github.com/groovc/connectiq-watch-faces" = {} 125 | "https://github.com/hiddewie/garmin-watch-face" = {} 126 | "https://github.com/hurenkam/AnalogExplorerWatchFace" = {} 127 | "https://github.com/jchabsi/RunnerAttitude" = {} 128 | "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/ " } 129 | "https://github.com/jeffwyeh/Infocal" = {} 130 | "https://github.com/jensws80/JSClock" = {} 131 | "https://github.com/jm355/wf" = {} 132 | "https://github.com/joakim-ribier/ftw-garmin" = {} 133 | "https://github.com/johndifini/cryptocurrency-watchface" = {} 134 | "https://github.com/jonasbcdk/CleanSteps" = {} 135 | "https://github.com/jonathan-beebe/garmin-offset-watch-face" = {} 136 | "https://github.com/jonathandaliva/Fenix5" = {} 137 | "https://github.com/jpg63/crystal-face-jpg63" = {} 138 | "https://github.com/jrhahn/daytimeWatchFace" = {} 139 | "https://github.com/kelnage/digital-simplicity" = {} 140 | "https://github.com/kevin940726/shy-watch-face" = {} 141 | "https://github.com/kevinboone/BAWF" = {} 142 | "https://github.com/krasimir/kago" = {} 143 | "https://github.com/kromar/garmin_fenix3" = {} 144 | "https://github.com/lanker/wf01" = {} 145 | "https://github.com/laurencee9/Watch-Face-Garmin" = {} 146 | "https://github.com/lcj2/ciq_binarywatch" = {} 147 | "https://github.com/ldscavo/fitface" = {} 148 | "https://github.com/le-cds/connectiq-faceymcwatchface" = {} 149 | "https://github.com/ledouxe/Slanted280" = {} 150 | "https://github.com/ludw/Segment34" = {} 151 | "https://github.com/ludw/Segment34mkII" = {} 152 | "https://github.com/lukaszgruca/SilverWatchFace" = {} 153 | "https://github.com/macherel/DaylightWF" = {} 154 | "https://github.com/mannyray/StressWatchFace" = {} 155 | "https://github.com/markdotai/m1" = {} 156 | "https://github.com/markdotai/m2" = {} 157 | "https://github.com/matei-tm/garmin-m8m" = {} 158 | "https://github.com/mcvnh/ximpo" = {} 159 | "https://github.com/miamo/batman" = {} 160 | "https://github.com/micooke/LetsGetDigital" = {} 161 | "https://github.com/modus75/RaVel-GarminDigitalWatchFace" = {} 162 | "https://github.com/mpl75/anyaWatches" = {} 163 | "https://github.com/mrmarbury/garmin_mnmlst_watchface" = {} 164 | "https://github.com/myneur/late" = {} 165 | "https://github.com/nicolas-gte/RetroFace" = {} 166 | "https://github.com/nldroid/Spotlight" = {} 167 | "https://github.com/okdar/smartarcs" = {} 168 | "https://github.com/okdar/smartarcsactive" = {} 169 | "https://github.com/okdar/smartarcstrip" = {} 170 | "https://github.com/onryou/framework245" = {} 171 | "https://github.com/oyvindse/Anker" = {} 172 | "https://github.com/patrickpl/WatchOfTheRings" = {} 173 | "https://github.com/pencilitin/orbit-face" = {} 174 | "https://github.com/pierre-muth/HandAvoidance" = {} 175 | "https://github.com/plaets/connectiq-xclock" = {} 176 | "https://github.com/psjo/arcsin" = {} 177 | "https://github.com/psjo/darktimes" = {} 178 | "https://github.com/psjo/dotter" = {} 179 | "https://github.com/psjo/felt" = {} 180 | "https://github.com/rain-dl/DayRound" = {} 181 | "https://github.com/samuelmr/garmin-abouttime" = {} 182 | "https://github.com/sarahemm/LimitFace" = {} 183 | "https://github.com/shbumba/SimplePixels" = {} 184 | "https://github.com/shortattentionspan/Aviatorlike" = {} 185 | "https://github.com/shortattentionspan/garmin-watchface" = {} 186 | "https://github.com/shurupyan/stValentineFace" = {} 187 | "https://github.com/simllll/garmin-pedro-watchface" = {} 188 | "https://github.com/sixtop/Watch-Face-Garmin" = {} 189 | "https://github.com/slakhani1231/Triforce-Watch-Face" = {} 190 | "https://github.com/slyoldfox/slyface" = {} 191 | "https://github.com/smeyac/connect-iq" = {} 192 | "https://github.com/sparksp/Analog24" = {} 193 | "https://github.com/springle/sleepy_monkey" = {} 194 | "https://github.com/starryalley/eleven-forty-five" = {} 195 | "https://github.com/ste616/garmin-sidereal-watchface" = {} 196 | "https://github.com/sudarsanyes/thirdface" = {} 197 | "https://github.com/sunpazed/garmin-djcat" = {} 198 | "https://github.com/sunpazed/garmin-drawaa" = {} 199 | "https://github.com/sunpazed/garmin-flags" = {} 200 | "https://github.com/sunpazed/garmin-hedgetime" = {} 201 | "https://github.com/sunpazed/garmin-mario" = {} 202 | "https://github.com/sunpazed/garmin-mickey" = {} 203 | "https://github.com/sunpazed/garmin-nyan-cat" = {} 204 | "https://github.com/sunpazed/garmin-oz" = {} 205 | "https://github.com/sunpazed/garmin-pollock" = {} 206 | "https://github.com/sunpazed/garmin-vangogh" = {} 207 | "https://github.com/sura0111/GarminWatchFaceSuccessCircle" = {} 208 | "https://github.com/thekr1s/garmin_wordclock" = {} 209 | "https://github.com/tomfogg/garmin-roundedtext" = {} 210 | "https://github.com/tumb1er/ElPrimero" = {} 211 | "https://github.com/usernzb/ActiAnalog3" = {} 212 | "https://github.com/victorpaul/garmin-watchFace" = {} 213 | "https://github.com/vmaywood/Garmin-Watch-Faces" = {} 214 | "https://github.com/voseldop/timeless" = {} 215 | "https://github.com/warmsound/crystal-face" = {} 216 | "https://github.com/willful-it/cara-one" = {} 217 | "https://github.com/wolffshots/snout" = {} 218 | "https://github.com/worksasdesigned/z1_watchface" = {} 219 | "https://github.com/wwarby/iconic" = {} 220 | "https://github.com/yarmatr/BGConnectUI" = {} 221 | "https://github.com/zRenard/zRenardWatch" = {} 222 | "https://github.com/zRenard/zRenardWatch2" = {} 223 | "https://github.com/zetxek/aface-garmin-watchface" = {} 224 | "https://gitlab.com/jsteinkamp/Simplog" = {} 225 | "https://gitlab.com/keithwberry/worldtime-crystal" = {} 226 | "https://gitlab.com/knusprjg/plotty-mcclockface" = {} 227 | "https://gitlab.com/nz_brian/garmin.watch.analogplus" = {} 228 | "https://gitlab.com/ravenfeld/Connect-IQ-WatchFace" = {} 229 | 230 | [data_fields] 231 | "https://github.com/ActiveLook/Garmin-Datafield-sample-code" = {} 232 | "https://github.com/AlexBarinov/GarminHikeDifficulty" = { description = "Calculates your real time Shenandoah's Hiking Difficulty as defined on National Park Service site" } 233 | "https://github.com/Bimtino/ActivityMonitor" = {} 234 | "https://github.com/Fra-Sti/Sailing-Instrument" = {} 235 | "https://github.com/Likenttt/GRun-Chinese" = {} 236 | "https://github.com/ViktorStagge/ZoneTraining" = { description = "A Zone Training app for Garmin Watches." } 237 | "https://github.com/adamml/tempo-trainer" = {} 238 | "https://github.com/axl13/PowerAdjuster" = {} 239 | "https://github.com/britiger/PauseTimer-connectiq" = {} 240 | "https://github.com/britiger/PauseTimer-connectiq-cm" = {} 241 | "https://github.com/bugjam/garmin-eta" = {} 242 | "https://github.com/bunnyhu/GarminDashboardBlock" = {} 243 | "https://github.com/bunnyhu/GarminSpeedBar" = {} 244 | "https://github.com/chfr/garmin-avg-speed-plus" = {} 245 | "https://github.com/christoph-lucas/garmin-minutes-per-powerkilometer-field" = { description = "A data field for Garmin devices that displays the minutes per power kilometer" } 246 | "https://github.com/clementbarthes/GarminCogDisplay" = {} 247 | "https://github.com/creacominc/connectiq-PowerField" = {} 248 | "https://github.com/danielmitd/datafields" = {} 249 | "https://github.com/danipindado/Lap-average-vertical-speed" = { description = "Average vertical lap speed" } 250 | "https://github.com/danipindado/Lap-average-vertical-speed" = { description = "Performance per kilometer calculation" } 251 | "https://github.com/davisben/edgecycle" = {} 252 | "https://github.com/der-Dod/jumps" = {} 253 | "https://github.com/dhague/bt-ats-ciq-datafield" = {} 254 | "https://github.com/djs2014/whatpower" = { description = "What app power" } 255 | "https://github.com/djs2014/whatspeed" = { description = "What app speed" } 256 | "https://github.com/dmuino/HMFields" = {} 257 | "https://github.com/dodor84/data-field" = { description = "Test data field" } 258 | "https://github.com/dyuri/garmin-repafield" = {} 259 | "https://github.com/ebolefeysot/CIQ_InstantPcMAS" = {} 260 | "https://github.com/ebolefeysot/CIQ_PcvVo2max" = {} 261 | "https://github.com/ebottacin/OmniBikeField" = {} 262 | "https://github.com/evilwombat/HikeFieldv2" = {} 263 | "https://github.com/evilwombat/HikeFieldv2-forked" = {} 264 | "https://github.com/fabiobaltieri/ciq-battery-field" = {} 265 | "https://github.com/fabiobaltieri/ciq-nrf-blinky" = {} 266 | "https://github.com/fabiobaltieri/spotlight" = {} 267 | "https://github.com/fellrnr/Fellrnrs-Datafield-ActiveLook" = {} 268 | "https://github.com/flocsy/BodyBatteryDF" = {} 269 | "https://github.com/flocsy/DFDetector" = {} 270 | "https://github.com/flocsy/FitFieldWasterDF" = {} 271 | "https://github.com/flowstatedev/ciq-runpower" = {} 272 | "https://github.com/gcormier9/GRun" = {} 273 | "https://github.com/grafstrom/ORun" = {} 274 | "https://github.com/guibber/4caster" = {} 275 | "https://github.com/holubp/Connect-IQ-lap-max-speed" = {} 276 | "https://github.com/imgrant/AuxHR" = {} 277 | "https://github.com/imgrant/EnergyExpenditureField" = {} 278 | "https://github.com/imgrant/FlexiRunner" = {} 279 | "https://github.com/imgrant/RunningEconomyField" = {} 280 | "https://github.com/ithiel01/CombiSpeed" = {} 281 | "https://github.com/janverley/405HR" = {} 282 | "https://github.com/jimmyspets/HCU" = {} 283 | "https://github.com/kolyuchii/TravelCalc" = {} 284 | "https://github.com/kopa/BikersField" = {} 285 | "https://github.com/kopa/RunnersField" = {} 286 | "https://github.com/landnavapp/LandNavApp" = {} 287 | "https://github.com/larspnw/larsBikeDatafields" = {} 288 | "https://github.com/lcj2/ciq_monkeyfuel" = {} 289 | "https://github.com/maca88/E-Bike-Edge-MultiField" = { description = "Displays up to 10 data fields from an ANT+ LEV (Light Electronic Vehicle) device" } 290 | "https://github.com/maca88/SmartBikeLights" = {} 291 | "https://github.com/maca88/TempeField" = {} 292 | "https://github.com/markdotai/emtb" = {} 293 | "https://github.com/markwmuller/GRun" = {} 294 | "https://github.com/matthiasmullie/connect-iq-datafield-accurate-pace" = {} 295 | "https://github.com/matthiasmullie/connect-iq-datafield-calories-equivalent" = {} 296 | "https://github.com/mattv23v/UVIndexDataField" = { description = "DataField to show UV index" } 297 | "https://github.com/mirko77/PBike" = { description = "Configurable Garmin FR645M datafield" } 298 | "https://github.com/mirko77/PRun" = { description = "Configurable Garmin FR645M datafield" } 299 | "https://github.com/mizamae/GarminSlopeDatafield" = {} 300 | "https://github.com/mpl75/anyaBike" = { description = "Data field for cyclists who have their watch attached to their handlebars" } 301 | "https://github.com/nickmacias/Garmin-AvgGrade" = {} 302 | "https://github.com/nickmacias/Garmin-ClimbRate" = {} 303 | "https://github.com/nickmacias/Garmin-LSGrade" = {} 304 | "https://github.com/pauljohnston2025/breadcrumb-garmin" = {} 305 | "https://github.com/peregin/connectiq-hr-zones" = {} 306 | "https://github.com/peregin/connectiq-time-battery" = {} 307 | "https://github.com/pinselimo/BackAtDaylight" = {} 308 | "https://github.com/prenard/DF_RoadBook" = { description = "This data field allows display of a rolling roadbook on your Garmin Edge 820/1000" } 309 | "https://github.com/prenard/DF_TorqueAVG" = { description = "Display average torque value in N-m during your training" } 310 | "https://github.com/ray0711/BTHomeIQ" = {} 311 | "https://github.com/rconradharris/DaylightLeft" = {} 312 | "https://github.com/rgergely/polesteps" = {} 313 | "https://github.com/rgergely/steps2fit" = {} 314 | "https://github.com/roelofk/HeartRateRunner" = {} 315 | "https://github.com/sam-dumont/GarminGoProDatafield" = { description = "Control your GoPro camera from a Datafield" } 316 | "https://github.com/sam-dumont/RaceWithPower" = {} 317 | "https://github.com/sam-dumont/RunPowerWorkoutNG" = {} 318 | "https://github.com/sam-dumont/connectiq-workout-datafields" = {} 319 | "https://github.com/seajay/ColourHR" = {} 320 | "https://github.com/simonl-ciq/RollingAverage" = {} 321 | "https://github.com/simonl-ciq/SimplyTime" = {} 322 | "https://github.com/simonl-ciq/SunTimes" = {} 323 | "https://github.com/simonmacmullen/chart-datafields" = {} 324 | "https://github.com/snorrehu/Connect-iQ-CGM-datafield" = {} 325 | "https://github.com/stirnim/garmin-andytimer" = {} 326 | "https://github.com/stirnim/garmin-lastsplit" = {} 327 | "https://github.com/stirnim/garmin-swissgrid" = {} 328 | "https://github.com/tao-j/Keiser2Garmin" = {} 329 | "https://github.com/thisdougb/SinceStopped" = {} 330 | "https://github.com/to-ko/EveryTile" = {} 331 | "https://github.com/tobiaslj/TrendPace" = { description = "This data field shows the average pace for the past 30 seconds together with a trend indication" } 332 | "https://github.com/tommyvdz/RunPowerWorkout" = {} 333 | "https://github.com/torhovland/garmin-endurance-in-zone" = {} 334 | "https://github.com/travisvitek/connectiq_laps_datafield" = {} 335 | "https://github.com/tymmej/HikeField" = {} 336 | "https://github.com/victornottat/garmin-trimp" = {} 337 | "https://github.com/victornottat/garmin-trimp-perhour" = {} 338 | "https://github.com/vinzenzs/garmin-fartlek4fun" = { description = "Play some fun Fartleks" } 339 | "https://github.com/vovan-/cyclist-datafiled-garmin" = {} 340 | "https://github.com/vovan-/swimmer-datafiled-garmin" = {} 341 | "https://github.com/wubbl0rz/DataChampGarmin" = { description = "More than one data field for bike computers" } 342 | "https://github.com/wwarby/walker" = {} 343 | "https://gitlab.com/harryonline/smart-cadence" = {} 344 | "https://gitlab.com/nz_brian/HiVisRunField" = { description = "Easy to read data field" } 345 | "https://gitlab.com/ravenfeld/Connect-IQ-DataField-BackHome" = { description = "Indicates the distance and direction to be taken from the starting point of your activity" } 346 | "https://gitlab.com/ravenfeld/Connect-IQ-DataField-Battery" = {} 347 | "https://gitlab.com/ravenfeld/Connect-IQ-DataField-GPS" = {} 348 | "https://gitlab.com/ravenfeld/Connect-IQ-DataField-OC" = {} 349 | "https://gitlab.com/ravenfeld/Connect-IQ-DataField-Speed" = { description = "Colorized speed gauge" } 350 | "https://gitlab.com/ravenfeld/Connect-IQ-DataField-VirtualPartner" = { description = "Virtual race partner" } 351 | "https://gitlab.com/ravenfeld/connect-iq-datafield-runner" = { description = "Fields of data that can correct the distance course by pressing lap" } 352 | 353 | [widgets] 354 | "https://github.com/11samype/CIQBitcoinWidget" = {} 355 | "https://github.com/BDH-Software/ThePlanets-Widget" = {} 356 | "https://github.com/ChelsWin/Tasker-Trigger" = {} 357 | "https://github.com/GuMiner/garmin-JustOneButton" = {} 358 | "https://github.com/JuliensLab/Garmin-BatteryAnalyzer" = {} 359 | "https://github.com/Likenttt/DogecoinToTheMoon" = {} 360 | "https://github.com/Marios007/WoP" = { description = "Pregnancy Widget for Garmin Watches" } 361 | "https://github.com/PlanetTeamSpeakk/UC-Widget" = {} 362 | "https://github.com/SylvainGa/BatteryMonitor" = {} 363 | "https://github.com/SylvainGa/Calculator" = {} 364 | "https://github.com/SylvainGa/Flashlight" = {} 365 | "https://github.com/SylvainGa/Garmin-WeeWX" = {} 366 | "https://github.com/SylvainGa/Tesla-Link" = {} 367 | "https://github.com/TheNinth7/evccg" = {} 368 | "https://github.com/TimZander/slope-widget" = {} 369 | "https://github.com/Vertumnus/garmin-ioBrokerVis" = {} 370 | "https://github.com/YoungChulDK/GarminCryptoPrices" = {} 371 | "https://github.com/ad220/gopro-remote-connectiq" = {} 372 | "https://github.com/admsteck/ConnectIQ" = {} 373 | "https://github.com/aleung/ConnectIQ-LogIt" = {} 374 | "https://github.com/aleung/ciq-sensorhistory" = {} 375 | "https://github.com/antirez/iqmeteo" = {} 376 | "https://github.com/aronsommer/WebRequestGlance-Widget" = { description = "Modified version of the Garmin IQ Connect WebRequest sample" } 377 | "https://github.com/aronsommer/WebRequestMultiple-Widget" = {} 378 | "https://github.com/ascending-edge/garmin-tally" = {} 379 | "https://github.com/bbary/Jokes" = {} 380 | "https://github.com/bbary/book_read_counters" = { description = "Basic counter widget with 3 different counters to keep track of book reading or memorization" } 381 | "https://github.com/bbary/counters" = {} 382 | "https://github.com/bhugh/slope-widget" = {} 383 | "https://github.com/blaskovicz/garmin-nest-camera-control" = {} 384 | "https://github.com/bombsimon/garmin-swish-qr" = {} 385 | "https://github.com/britiger/criticalmaps-garmin-widget" = {} 386 | "https://github.com/cedric-dufour/connectiq-widget-pilotaltimeter" = {} 387 | "https://github.com/cedric-dufour/connectiq-widget-pilotsrss" = {} 388 | "https://github.com/cedric-dufour/connectiq-widget-totp" = {} 389 | "https://github.com/chemikadze/garmin-authenticator" = {} 390 | "https://github.com/dabastynator/GarminSmartHome" = {} 391 | "https://github.com/danielsiwiec/garmin-connect-seed" = { description = "This is a seed project for writing Garmin Connect IQ application" } 392 | "https://github.com/dbucher97/iqbeerpongwidget" = {} 393 | "https://github.com/desyat/OpenWeatherMapWidget" = { description = "Garmin Widget connecting to Open Weather Map" } 394 | "https://github.com/dividebysandwich/SolarStatus-Garmin" = {} 395 | "https://github.com/djdevin/septa-rr-garmin" = {} 396 | "https://github.com/elgaard/buttonStroke" = {} 397 | "https://github.com/eternal-flame-AD/git-notifications-ciq" = {} 398 | "https://github.com/fabrikant/AllSensors" = { description = "Widget with data from multiple sensors" } 399 | "https://github.com/fabrikant/DonnerWetter" = { description = "Widget for openweatrmap.org service" } 400 | "https://github.com/fabrikant/Galendar" = { description = "Google calendar implementation" } 401 | "https://github.com/fabrikant/LetMeIn" = { description = "Create and display QR codes" } 402 | "https://github.com/fabrikant/SensorHistoryWidget" = { description = "Displays sensor history: Heart rate, pressure, altitude, temperature, oxygen saturation" } 403 | "https://github.com/felwal/avganar" = {} 404 | "https://github.com/fhdeutschmann/ZuluTime" = {} 405 | "https://github.com/frontdevops/garmin-widget-battery" = {} 406 | "https://github.com/gcaufield/TogglIQ" = {} 407 | "https://github.com/geel97/dcc-connectiq" = {} 408 | "https://github.com/hakonrossebo/FootballFixtures" = {} 409 | "https://github.com/haraldh/SunCalc" = {} 410 | "https://github.com/hasscontrol/hasscontrol" = {} 411 | "https://github.com/hatl/hasscontrol" = {} 412 | "https://github.com/hexaguin/Connect-IQ-ThingSpeak-Client" = {} 413 | "https://github.com/individual-it/BatteryGuesstimate" = {} 414 | "https://github.com/jctim/otp-ciq" = {} 415 | "https://github.com/jimmycaille/SensorHistoryWidget" = {} 416 | "https://github.com/jonathanburchmore/Enphase" = {} 417 | "https://github.com/jurask/authentificator" = {} 418 | "https://github.com/lkjh654/HabitTree" = { description = "Garmin widget that supports resisting bad habits by growing a tree" } 419 | "https://github.com/maca88/BikeLightsControl" = {} 420 | "https://github.com/macherel/Barcode-Wallet" = { description = "Display various type of barcodes (Simple barcode or 2D barcodes like QR code or Aztec code)" } 421 | "https://github.com/macherel/Connect-IQ-QR-Code-Viewer" = { description = "A widget that can display QR Code on Garmin watch" } 422 | "https://github.com/madskonradsen/garmin-iq-shortsweather" = {} 423 | "https://github.com/markwmuller/PregnancyWidget" = {} 424 | "https://github.com/mayaleh/Maya.CryptoFiatPrice" = { description = "Explore the exchange rate of some crypto currencies" } 425 | "https://github.com/mettyw/activity_view" = {} 426 | "https://github.com/miharekar/ForecastLine" = {} 427 | "https://github.com/mikeller/garmin-divesite-weather-widget" = {} 428 | "https://github.com/mriscott/GarminRings" = {} 429 | "https://github.com/natabat/FertiliQ" = {} 430 | "https://github.com/okdar/lostandfound" = {} 431 | "https://github.com/openhab/openhab-garmin" = {} 432 | "https://github.com/pedlarstudios/WordOfTheDay" = {} 433 | "https://github.com/pyrob2142/FastingWidget" = {} 434 | "https://github.com/serhuz/CryptoMarket" = {} 435 | "https://github.com/sigsegvat/connectIqIotButton" = {} 436 | "https://github.com/simonl-ciq/AltitudeWidget" = {} 437 | "https://github.com/simonl-ciq/MagneticDeclination" = {} 438 | "https://github.com/simonl-ciq/SimplyDaylightWidget" = {} 439 | "https://github.com/simonl-ciq/SimplyHeightWidget" = {} 440 | "https://github.com/simonl-ciq/SimplyLunar" = {} 441 | "https://github.com/simonl-ciq/SimplySolar" = {} 442 | "https://github.com/simonl-ciq/SimplyWeather" = {} 443 | "https://github.com/simonmacmullen/activity-widget" = {} 444 | "https://github.com/simonmacmullen/hr-widget" = {} 445 | "https://github.com/simonmacmullen/instrument-panel" = {} 446 | "https://github.com/srwalter/garmin-tesla" = {} 447 | "https://github.com/starryalley/Unquestionify" = {} 448 | "https://github.com/starryalley/garmin-birds-around" = {} 449 | "https://github.com/tanstaaflFH/BabyLog-Feed-ConnectIQ" = {} 450 | "https://github.com/tanstaaflFH/BabyLog-Sleep-ConnectIQ" = {} 451 | "https://github.com/tanvir-dhanjal/Garmin-NBA-Widget" = {} 452 | "https://github.com/toskaw/ImageNotify" = {} 453 | "https://github.com/tumb1er/BetterBatteryWidget" = {} 454 | "https://github.com/uaraven/otpauth-ciq" = {} 455 | "https://github.com/valgit/WeatherWid" = {} 456 | "https://github.com/yamaserif/garminSmartLockApi" = { description = "Garmin Smartwatch Widget for Smart Lock with API provided" } 457 | "https://github.com/zivke/SimpTemp" = {} 458 | "https://github.com/zmullett/connectiq-sonos" = {} 459 | "https://gitlab.com/harryonline/emergencyinfo" = {} 460 | "https://gitlab.com/harryonline/fortune-quote" = { description = "This widget show a random quote from the Gigaset Fortune collection" } 461 | "https://gitlab.com/harryonline/timerwidget" = {} 462 | 463 | [device_apps] 464 | "https://github.com/333fred/fta-monitor-garmin-watchapp" = {} 465 | "https://github.com/BDH-Software/TheStars" = {} 466 | "https://github.com/BleachDev/GarminQ" = {} 467 | "https://github.com/BleachDev/Rainy" = {} 468 | "https://github.com/Byeongcheol-Kim/Meditate" = {} 469 | "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." } 470 | "https://github.com/Cybermite/GolfApp" = {} 471 | "https://github.com/DaWenning/garmin-football-ref-watch" = {} 472 | "https://github.com/DylanBarratt/Garmin-Coin-Flip" = {} 473 | "https://github.com/Gualor/garmin-gotchi" = {} 474 | "https://github.com/HerrRiebmann/Stretch" = {} 475 | "https://github.com/IrishMarineInstitute/connectiq-ido" = {} 476 | "https://github.com/Judex-77/Moon-App-Simulator" = {} 477 | "https://github.com/K4pes/ultiCount" = { name = "UltiCount", description = "Keep track of scores and gender ratios during games of Ultimate Frisbee" } 478 | "https://github.com/KatieXC/GarMenu_GarminConnectIQApp" = {} 479 | "https://github.com/KieranDotCo/whats-the-score" = {} 480 | "https://github.com/Laverlin/Yet-Another-Sailing-App" = {} 481 | "https://github.com/MarkusDatgloi/ebikeApp" = {} 482 | "https://github.com/OpenSeizureDetector/Garmin_SD" = {} 483 | "https://github.com/ROSENET-BTU/Garmin-App" = {} 484 | "https://github.com/Siratigui/garmin_app" = {} 485 | "https://github.com/Sonicious/GarminApps" = {} 486 | "https://github.com/SverreWisloff/TackingMaster" = {} 487 | "https://github.com/TDF-PL/TAKWatch-IQ" = {} 488 | "https://github.com/Tamarpe/CatFacts" = {} 489 | "https://github.com/Tkadla-GSG/garmin" = { description = "Collection of apps for Garmin wearable hardware written in Monkey C" } 490 | "https://github.com/TrainAsONE/trainasone-connectiq" = {} 491 | "https://github.com/YoungChulDK/CryptoPricesGarmin" = {} 492 | "https://github.com/abs0/GarminWebRequestTest" = {} 493 | "https://github.com/adamjakab/iHIIT" = {} 494 | "https://github.com/adekkpl/garmin-agv-skating" = {} 495 | "https://github.com/aiMonster/Garmin-Contrast-Shower" = {} 496 | "https://github.com/akamming/Garmoticz" = {} 497 | "https://github.com/alanfischer/hassiq" = {} 498 | "https://github.com/alexphredorg/ConnectIqSailingApp" = {} 499 | "https://github.com/alfonso-orta/garmin_tomato_clock" = {} 500 | "https://github.com/andan67/wormnav" = {} 501 | "https://github.com/anickle060193/rep_track_react_native" = {} 502 | "https://github.com/arquicanedo/barbecueboss" = {} 503 | "https://github.com/bbary/Salati" = {} 504 | "https://github.com/bderusha/GarminIQ-CoachCompanion" = {} 505 | "https://github.com/bhugh/ThePlanets" = {} 506 | "https://github.com/blackdogit/connectiq-apps" = {} 507 | "https://github.com/blackshadev/wayfinder" = {} 508 | "https://github.com/blaskovicz/garmin-tplink-cloud-control" = {} 509 | "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" } 510 | "https://github.com/bombsimon/garmin-pace-calculator" = {} 511 | "https://github.com/brandon-rhodes/brandon-garmin" = {} 512 | "https://github.com/breber/2048-iq" = {} 513 | "https://github.com/breber/helicopter-iq" = { description = "Helicopter game for Garmin" } 514 | "https://github.com/breber/nest-iq" = {} 515 | "https://github.com/capoaira/TicTacToe_Garmin_Connect_IQ" = {} 516 | "https://github.com/capoaira/Timer_Garmin_Connect_IQ" = {} 517 | "https://github.com/cedric-dufour/connectiq-app-glidersk" = {} 518 | "https://github.com/cedric-dufour/connectiq-app-towplanesk" = {} 519 | "https://github.com/celo-vschi/garmin-intervals" = { description = "Intervals applcation for Forerunner® 235, Forerunner ® 245 (Music) and all fēnix® 6 Pro devices." } 520 | "https://github.com/cfculhane/ConnectIQ-LIFX" = {} 521 | "https://github.com/ch1bo/garmin-otp-authenticator" = {} 522 | "https://github.com/chakflying/flight-watcher" = {} 523 | "https://github.com/chakflying/hkoradar" = {} 524 | "https://github.com/chanezgr/IQwprimebal" = {} 525 | "https://github.com/csekri/fenix-calculator" = {} 526 | "https://github.com/danielsiwiec/fitnessTimer" = { description = "Fitness timer" } 527 | "https://github.com/danielsiwiec/tabataTimer" = {} 528 | "https://github.com/danielsiwiec/timebomb" = {} 529 | "https://github.com/danielsiwiec/waypoints-app" = { description = "Easily send waypoints from Google Maps to your device. No registration required!" } 530 | "https://github.com/danisik/nThlon" = {} 531 | "https://github.com/davedoesdemos/ConnectIQ-Watch-IoT" = {} 532 | "https://github.com/dazey77/Horizontal-speedo-rep" = {} 533 | "https://github.com/derjust/sos-now" = {} 534 | "https://github.com/dkappler/kraken" = {} 535 | "https://github.com/dliedke/Meditate" = {} 536 | "https://github.com/eden159/garmin-checkpoint" = { description = "For people who want to know when the next checkpoint for a competition is" } 537 | "https://github.com/eferreyr/SimonGame" = {} 538 | "https://github.com/electrofloat/BPTransport-Garmin" = { description = "A Garmin Connect IQ app to view realtime public transport data" } 539 | "https://github.com/eriklupander/Fenix3GolfDistance" = {} 540 | "https://github.com/fabrikant/RoseOfWind" = {} 541 | "https://github.com/filarl/Ticker" = {} 542 | "https://github.com/flori/S2C" = {} 543 | "https://github.com/floriangeigl/Meditate" = {} 544 | "https://github.com/fmercado/telemeter" = {} 545 | "https://github.com/fo2rist/garmin-vehicle-keyfob" = {} 546 | "https://github.com/frenchtoast747/connectiq-packman" = {} 547 | "https://github.com/gaetanmarti/glidator" = {} 548 | "https://github.com/gatkin/commute-tracker" = {} 549 | "https://github.com/georgefang13/STRIDE_CIQ_CustomBleProfile" = { description = "Connect FR265 to your STRIDE hardware" } 550 | "https://github.com/gergo225/StepGetterWatch" = {} 551 | "https://github.com/hansiglaser/ConnectIQ" = {} 552 | "https://github.com/harknus/ManualHR" = {} 553 | "https://github.com/house-of-abbey/GarminHomeAssistant" = {} 554 | "https://github.com/hupei1991/FindTreasure" = {} 555 | "https://github.com/igorso/Garmin42" = {} 556 | "https://github.com/iuliux/BitcoinWatcher" = {} 557 | "https://github.com/jimmycaille/ShopListApp" = {} 558 | "https://github.com/jmnorma/SprintPace" = {} 559 | "https://github.com/johnnyw3/connectiq-watchapps" = {} 560 | "https://github.com/jravey7/CIQChecklist" = {} 561 | "https://github.com/kartoone/mybiketraffic" = {} 562 | "https://github.com/klimeryk/garmodoro" = {} 563 | "https://github.com/kolitiri/garmin-myBus-app" = {} 564 | "https://github.com/kzibart/Garmin_AcesUp" = {} 565 | "https://github.com/kzibart/Garmin_Blackjack" = {} 566 | "https://github.com/kzibart/Garmin_Farkle" = {} 567 | "https://github.com/kzibart/Garmin_FlappyWatch" = {} 568 | "https://github.com/kzibart/Garmin_Hangman" = {} 569 | "https://github.com/kzibart/Garmin_MasterMind" = {} 570 | "https://github.com/kzibart/Garmin_Pyramid" = {} 571 | "https://github.com/kzibart/Garmin_Sokoban" = {} 572 | "https://github.com/kzibart/Garmin_SpaceTrek" = {} 573 | "https://github.com/kzibart/Garmin_TileSlider" = {} 574 | "https://github.com/kzibart/Garmin_TriPeaks" = {} 575 | "https://github.com/kzibart/Garmin_Yahtzee" = {} 576 | "https://github.com/ldscavo/tea-timer" = {} 577 | "https://github.com/leCapi/RepCounter" = { description = "Repetition counter for Garmin" } 578 | "https://github.com/lucamrod/TriathlonDuathlonAquathlon" = {} 579 | "https://github.com/lucasasselli/garmin-podcasts" = {} 580 | "https://github.com/lukasbeckercode/CPR-Timer" = {} 581 | "https://github.com/marvik37/DiscGolf" = { description = "Disc golf app" } 582 | "https://github.com/matco/badminton" = {} 583 | "https://github.com/matmuc/SportMonitor" = {} 584 | "https://github.com/mazefest/SnakeIQ" = {} 585 | "https://github.com/mikeller/garmin-christchurch-bus-widget" = {} 586 | "https://github.com/mikkosh/Ballistics" = {} 587 | "https://github.com/mikkosh/DogTracker" = {} 588 | "https://github.com/mikkosh/shotgunsports" = {} 589 | "https://github.com/mirmousaviii/Persian-Calendar-for-Garmin-Watch" = {} 590 | "https://github.com/miss-architect/garmin-squash" = {} 591 | "https://github.com/mrohmer/CockpitOnlineGarminClient" = { description = "Garmin Watch Client for Cockpit XP Online via cockpit-online.rohmer.rocks" } 592 | "https://github.com/n-lahmi/GarminCallControls" = {} 593 | "https://github.com/noln/doughnuts-burnt" = {} 594 | "https://github.com/nubissurveying/Garmin_vivoactiveHR" = {} 595 | "https://github.com/pchng/connect-iq-totp" = {} 596 | "https://github.com/pedlarstudios/EggTimer" = {} 597 | "https://github.com/pedrorijo91/garmin-padel" = {} 598 | "https://github.com/phil-mitchell/garmin-curling" = {} 599 | "https://github.com/pintail105/SailingTools" = {} 600 | "https://github.com/pukao/GarminEmergencyContact" = {} 601 | "https://github.com/pukao/GarminSailing" = { description = "Sailing app for connectIQ Garmin" } 602 | "https://github.com/quickdk/uPaddle" = {} 603 | "https://github.com/rexMingla/low-battery-mode" = {} 604 | "https://github.com/rgrellmann/connectiq-bergsteigen-app" = {} 605 | "https://github.com/rjmccann101/MBO" = {} 606 | "https://github.com/rxkaminski/Garmin-SportTimerHR" = {} 607 | "https://github.com/sarahemm/DerbyLaps" = {} 608 | "https://github.com/sdgriggs/GarminDiscGolf" = {} 609 | "https://github.com/sharkbait-au/HRV_iq" = {} 610 | "https://github.com/shprung/garminIQ_HRonly" = {} 611 | "https://github.com/simonseo/garmin-otp-generator" = {} 612 | "https://github.com/sjager/GarminApps" = {} 613 | "https://github.com/slipperybee/connectiq-islamic-calendar" = {} 614 | "https://github.com/slipperybee/connectiq-jewish-calendar" = {} 615 | "https://github.com/sohaeb/Garmin_pomodoro" = {} 616 | "https://github.com/spikyjt/SailingTimer" = {} 617 | "https://github.com/sw-samuraj/garmin-inline-skating" = {} 618 | "https://github.com/tanvir-dhanjal/Garmin-Sudoku-Watch-App" = {} 619 | "https://github.com/toomasr/8-min-abs" = {} 620 | "https://github.com/toskaw/NotifyApp" = {} 621 | "https://github.com/tskf/MapOfflineGPS" = {} 622 | "https://github.com/valgit/GarminSailing" = {} 623 | "https://github.com/valgit/WeatherApp" = {} 624 | "https://github.com/valgit/virtual_sailing" = {} 625 | "https://github.com/vladmunteanu/monky" = {} 626 | "https://github.com/vtrifonov-esfiddle/Meditate" = {} 627 | "https://github.com/vtrifonov-esfiddle/TestHrv" = {} 628 | "https://github.com/weavercm/Connect-IQ-Work-Timer" = { description = "Allows you to keep track of your work time" } 629 | "https://github.com/werkkrew/ciq-hiit-tracker" = {} 630 | "https://github.com/werkkrew/ciq-orange-theory" = {} 631 | "https://github.com/winds-mobi/winds-mobi-client-garmin" = {} 632 | "https://github.com/worktrail/worktrail-garmin-connect-iq" = {} 633 | "https://github.com/xtruan/GpsPosition" = {} 634 | "https://github.com/xtruan/MorseCode" = {} 635 | "https://github.com/xtruan/TempoBPM" = {} 636 | "https://github.com/xtruan/WorkoutTimer" = {} 637 | "https://github.com/ydutertre/myvario" = {} 638 | "https://github.com/ydutertre/myvariolite" = {} 639 | "https://github.com/zbraniecki/ultitimer" = {} 640 | "https://github.com/zetxek/garmin-qr" = {} 641 | "https://github.com/zlelik/ConnectIqSailingApp" = {} 642 | "https://gitlab.com/ravenfeld/Connect-IQ-App-ChronoGym" = { name = "Chrono Gym", description = "Set count and rest timer" } 643 | "https://gitlab.com/ravenfeld/Connect-IQ-App-Compass" = { name = "Compass App", description = "Compass" } 644 | "https://gitlab.com/ravenfeld/Connect-IQ-App-Timer" = { name = "Timer", description = "Add several timer already registered" } 645 | 646 | [audio_content_providers] 647 | "https://github.com/memen45/SubMusic" = {} 648 | 649 | [barrels] 650 | "https://github.com/Likenttt/garmin-ciq-page-indicator" = {} 651 | "https://github.com/bombsimon/garmin-touch-keypad" = {} 652 | "https://github.com/bostonrwalker/navutils" = {} 653 | "https://github.com/britiger/CriticalMapsAPIBarrel" = {} 654 | "https://github.com/douglasr/ciqtools-cryptography" = { description = "An attempt to streamline the use of the Connect IQ Cryptography library" } 655 | "https://github.com/douglasr/ciqtools-graphing" = { description = "A clone of the graphing functionality present within Garmin devices natively" } 656 | "https://github.com/douglasr/ciqtools-number-picker" = { description = "Number picker barrel" } 657 | "https://github.com/douglasr/msgpack-monkeyc" = {} 658 | "https://github.com/hurenkam/WidgetBarrel" = {} 659 | "https://github.com/mannyray/ANTPlusHeartStrap" = { description = "Code for connecting your ANT+ heart strap to your garmin watch" } 660 | "https://github.com/mannyray/GarminBytePacking" = { description = "Garmin library that adds functions for manipulating ByteArrays, Floats, Doubles and Longs" } 661 | "https://github.com/mikkosh/AntAssetTracker" = {} 662 | "https://github.com/vtrifonov-esfiddle/ConnectIqDataPickers" = {} 663 | "https://gitlab.com/waterkip/opn-monkeyc" = {} 664 | 665 | [companion_apps] 666 | "https://github.com/AldoSusanto/mHealth-Project" = {} 667 | "https://github.com/Cougargriff/SensorTriggerIQ" = {} 668 | "https://github.com/MatyasKriz/ios-connect-iq-comms" = {} 669 | "https://github.com/Wheellog/Companion.Garmin" = {} 670 | "https://github.com/buessow/garmin" = {} 671 | "https://github.com/dougw/Garmin-ExampleApp-Swift" = {} 672 | "https://github.com/gimportexportdevs/gexporter" = {} 673 | "https://github.com/gimportexportdevs/gimporter" = {} 674 | "https://github.com/grigorye/Handsfree" = {} 675 | "https://github.com/kite247/Onewheel2Garmin" = {} 676 | "https://github.com/robertmpowell/OBD2Reader" = {} 677 | "https://github.com/starryalley/Unquestionify-android" = {} 678 | "https://github.com/urbandroid-team/Sleep-as-Android-Garmin-Addon" = {} 679 | 680 | [tools] 681 | "https://github.com/DavidBaddeley/connectiq-tester" = { description = "Fork of `connectiq-tester` with screenshot support"} 682 | "https://github.com/RobertWojtowicz/export2garmin" = {} 683 | "https://github.com/arpanghosh8453/garmin-grafana" = {} 684 | "https://github.com/blackdogit/connectiq-monkeyc" = {} 685 | "https://github.com/blackshadev/garmin-connectiq-release-action" = {} 686 | "https://github.com/bombsimon/garmin-screenshot" = {} 687 | "https://github.com/cedric-dufour/connectiq-app-rawlogger" = {} 688 | "https://github.com/cjsmith/react-native-connect-iq-mobile-sdk" = {} 689 | "https://github.com/cyberang3l/GarminMonkeyCBoilerPlate" = {} 690 | "https://github.com/cyberang3l/GarminSettingsFileParser" = {} 691 | "https://github.com/cyberang3l/garmin-linux-development-environment" = {} 692 | "https://github.com/cyberang3l/vim-monkey-c" = {} 693 | "https://github.com/flocsy/GarminSportsDev" = {} 694 | "https://github.com/flocsy/garmin-dev-tools" = {} 695 | "https://github.com/fulippo/share-your-garmin-workout" = {} 696 | "https://github.com/gcaufield/MonkeyContainer" = {} 697 | "https://github.com/gcaufield/MonkeyInject" = {} 698 | "https://github.com/gcaufield/MonkeyPack" = {} 699 | "https://github.com/gcaufield/MonkeyTest" = {} 700 | "https://github.com/hacdias/flowfit" = {} 701 | "https://github.com/himanushi/dithering-converter" = {} 702 | "https://github.com/kalemena/docker-connectiq" = {} 703 | "https://github.com/lindig/fit" = {} 704 | "https://github.com/maca88/directive-preprocessor" = {} 705 | "https://github.com/markw65/monkeyc-optimizer" = {} 706 | "https://github.com/markw65/prettier-extension-monkeyc" = {} 707 | "https://github.com/markw65/prettier-plugin-monkeyc" = {} 708 | "https://github.com/matco/action-connectiq-tester" = { description = "GitHub action for `connectiq-tester`"} 709 | "https://github.com/matco/connectiq-tester" = { description = "Docker image that can be used to run the tests \"Run No Evil\" of a ConnectIQ application" } 710 | "https://github.com/matin/garth" = {} 711 | "https://github.com/muktihari/fit" = {} 712 | "https://github.com/openivity/openivity.github.io" = {} 713 | "https://github.com/pcolby/connectiq-sdk-manager" = {} 714 | "https://github.com/pzl/ciqdb" = {} 715 | "https://github.com/stadelmanma/fitparse-rs" = {} 716 | "https://github.com/sunpazed/garmin-tilemapper" = {} 717 | "https://github.com/tcgoetz/GarminDB" = {} 718 | "https://github.com/voltangle/kumitateru" = {} 719 | "https://github.com/zzyandzzy/fit-rust" = {} 720 | "https://marketplace.visualstudio.com/items?itemName=garmin.monkey-c" = { name = "VS Code Monkey C", description = "Official VS Code extension for Monkey C"} 721 | "https://www.angelcode.com/products/bmfont" = { name = "BM Font", description = "This program will allow you to generate bitmap fonts from TrueType fonts" } 722 | 723 | [miscellaneous] 724 | "https://developer.garmin.com/connect-iq/overview" = { name = "Official Garmin developer site", description = "Information about Garmin development and the Monkey C language" } 725 | "https://forums.garmin.com/developer/connect-iq" = { name = "Connect IQ developer forum", description = "Forum to talk anything Connect IQ related" } 726 | "https://garmin.watchfacebuilder.com" = { name = "Watch Face Builder", description = "Build (or download) watch faces in the browser" } 727 | "https://github.com/AndrewKhassapov/connect-iq" = {} 728 | "https://github.com/Artaud/CIQ-Comm-failure-sample" = {} 729 | "https://github.com/Likenttt/garmin-games" = {} 730 | "https://github.com/OpenGIS/Inreach-Mapshare" = { name = "inReach MapShare for WordPress", description = "Display your live inReach MapShare data on your WordPress Site" } 731 | "https://github.com/Peterdedecker/connectiq" = {} 732 | "https://github.com/Shmuma/garmin-public" = {} 733 | "https://github.com/YAWNICK/MonkeyAOC" = { description = "[Advent of Code](https://adventofcode.com) in Monkey C" } 734 | "https://github.com/ZachXu/NextMatchReminder" = {} 735 | "https://github.com/acrossthekyle/garmin" = { description = "Collection of projects created over the years for Garmin watches." } 736 | "https://github.com/arsfabula/Insta360-Remote-CIQ" = {} 737 | "https://github.com/creacominc/connectiq-PowerFieldTests" = {} 738 | "https://github.com/cyberang3l/garmin-monkey-c-neovim-language-server" = {} 739 | "https://github.com/cyberjunky/home-assistant-garmin_connect" = {} 740 | "https://github.com/douglasr/connectiq-samples" = {} 741 | "https://github.com/ekutter/CIQTest" = {} 742 | "https://github.com/fagalto/ConnectIQ" = { description = "Collection of ConnectIQ apps" } 743 | "https://github.com/ferranpujolcamins/GarminApps" = {} 744 | "https://github.com/flocsy/VibraTest" = {} 745 | "https://github.com/garmin/connectiq-apps" = {} 746 | "https://github.com/google/open-location-code" = {} 747 | "https://github.com/iperformance/garmin-conect" = { description = "A collection of Connect IQ apps and libraries" } 748 | "https://github.com/jstringer1/garmin-connectiq" = {} 749 | "https://github.com/klimeryk/vim-monkey-c" = {} 750 | "https://github.com/mkuthan/garmin-workouts" = {} 751 | "https://github.com/rbsexton/workspace-ConnectIQ" = {} 752 | "https://github.com/simonl-ciq/GridReference" = {} 753 | "https://github.com/sunpazed/garmin-ciqsummit17" = { description = "A basic widget that displays tweets from #ciqsummit17" } 754 | "https://github.com/sunpazed/garmin-complicate" = { description = "An example application that demonstrates system6 complications" } 755 | "https://github.com/sunpazed/garmin-complicate-circle" = { description = "An example application that demonstrates system6 complications" } 756 | "https://github.com/sunpazed/garmin-waketest" = { description = "Watchface to verify timings, and poll frequency of `onUpdate()`" } 757 | "https://github.com/sydspost/Garmin-Connect-Workout-and-Schedule-creator" = {} 758 | "https://github.com/waterkip/connectiq-sdk-docker" = {} 759 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Awesome Garmin 2 | 3 | [![Awesome](https://awesome.re/badge.svg)](https://awesome.re) 4 | 5 | An extensive list of Garmin apps, both for Garmin devices written in [Monkey C] 6 | and tools that integrate with the Garmin ecosystem and services. 7 | 8 | > [!NOTE] 9 | > This README is generated! 10 | > To help exploring relevant resources the items in each segmented are _sorted 11 | > by last activity_ if available. 12 | > 13 | > _This README was last generated at 2025-11-24_. 14 | 15 | Contributions are always welcome! To add a new resource, **do not edit this 16 | file**. Instead, add it to [`awesome.toml`][awesome-toml]. If the resource is a 17 | GitHub or GitLab repository with a description, just include the URL. To 18 | customize the name, set name, and to add a missing description, set description. 19 | 20 | Since many resources in this list are outdated, watch faces, widgets, data 21 | fields, and device apps with no activity in the past two years (from the file's 22 | generation date) will be placed in a collapsible section to reduce clutter. 23 | 24 | ## Contents 25 | 26 | - [Watch faces](#watch-faces) 27 | - [Data fields](#data-fields) 28 | - [Widgets](#widgets) 29 | - [Device Apps](#device-apps) 30 | - [Audio Content Providers](#audio-content-providers) 31 | - [Barrels](#barrels) 32 | - [Companion apps](#companion-apps) 33 | - [Tools](#tools) 34 | - [Miscellaneous](#miscellaneous) 35 | 36 | ## Watch faces 37 | 38 | [Watch faces] are a special application type that display on the main screen of 39 | Garmin’s wearable devices. These application types are limited some ways to 40 | allow them to have minimal impact on the device’s battery life. 41 | 42 | | Name | Last updated | Stars | 43 | | ---- | ----------------- | ----- | 44 | | [zRenardWatch](https://github.com/zRenard/zRenardWatch) | 2025‑11‑20  | | 45 | | [SwissRailwayClock](https://github.com/ahuggel/SwissRailwayClock) | 2025‑11‑19  | ⭐23 | 46 | | [Essence](https://github.com/dev-lessismore/Essence) | 2025‑11‑09  | ⭐3 | 47 | | [MoveToBeActive](https://github.com/fevieira27/MoveToBeActive) | 2025‑11‑09  | ⭐41 | 48 | | [garmin-abouttime](https://github.com/samuelmr/garmin-abouttime) | 2025‑10‑29  | ⭐30 | 49 | | [Connect-IQ-WatchFace](https://gitlab.com/ravenfeld/Connect-IQ-WatchFace) | 2025‑10‑22  | ⭐3 | 50 | | [Tac](https://github.com/derbartigelady/Tac) | 2025‑10‑17  | ⭐1 | 51 | | [wf](https://github.com/jm355/wf) | 2025‑10‑10  | ⭐1 | 52 | | [garmin-watchfaces](https://github.com/Gumix/garmin-watchfaces) | 2025‑09‑20  | ⭐2 | 53 | | [crystal-face](https://github.com/SylvainGa/crystal-face) | 2025‑09‑19  | ⭐18 | 54 | | [Segment34mkII](https://github.com/ludw/Segment34mkII) | 2025‑09‑12  | ⭐142 | 55 | | [garmin-watchFace](https://github.com/victorpaul/garmin-watchFace) | 2025‑09‑09  | ⭐29 | 56 | | [WWF5](https://github.com/fabrikant/WWF5) | 2025‑08‑26  | ⭐1 | 57 | | [garmin_mnmlst_watchface](https://github.com/mrmarbury/garmin_mnmlst_watchface) | 2025‑08‑25  | ⭐1 | 58 | | [garmin-watchface-protomolecule](https://github.com/blotspot/garmin-watchface-protomolecule) | 2025‑08‑20  | ⭐77 | 59 | | [garmin_fenix3](https://github.com/kromar/garmin_fenix3) | 2025‑08‑03  | ⭐2 | 60 | | [WatchOfTheRings](https://github.com/patrickpl/WatchOfTheRings) | 2025‑07‑25  | ⭐1 | 61 | | [WWF](https://github.com/fabrikant/WWF) | 2025‑07‑25  | ⭐3 | 62 | | [gweatherwatch](https://github.com/ankineri/gweatherwatch) | 2025‑07‑20  | ⭐5 | 63 | | [aion](https://github.com/Anemosx/aion) | 2025‑07‑16  | | 64 | | [garmin-mini-chrono](https://github.com/adamdanielczyk/garmin-mini-chrono) | 2025‑07‑04  | | 65 | | [garmin-seaside](https://github.com/bombsimon/garmin-seaside) | 2025‑06‑29  | ⭐7 | 66 | | [SimplePixels](https://github.com/shbumba/SimplePixels) | 2025‑06‑15  | ⭐5 | 67 | | [Slanted280](https://github.com/ledouxe/Slanted280) | 2025‑05‑28  | ⭐2 | 68 | | [smartarcs](https://github.com/okdar/smartarcs) | 2025‑05‑13  | ⭐8 | 69 | | [smartarcsactive](https://github.com/okdar/smartarcsactive) | 2025‑05‑13  | ⭐10 | 70 | | [HandAvoidance](https://github.com/pierre-muth/HandAvoidance) | 2025‑05‑13  | | 71 | | [smartarcstrip](https://github.com/okdar/smartarcstrip) | 2025‑04‑26  | ⭐4 | 72 | | [orbit-face](https://github.com/pencilitin/orbit-face) | 2025‑04‑22  | ⭐1 | 73 | | [crystal-face](https://github.com/warmsound/crystal-face) | 2025‑04‑15  | ⭐443 | 74 | | [zRenardWatch2](https://github.com/zRenard/zRenardWatch2) | 2025‑02‑24  | ⭐2 | 75 | | [Funix-Watch](https://github.com/funix83/Funix-Watch) | 2025‑02‑17  | ⭐7 | 76 | | [wf01](https://github.com/lanker/wf01) | 2025‑02‑07  | | 77 | | [Segment34](https://github.com/ludw/Segment34) | 2025‑02‑05  | ⭐54 | 78 | | [ElegantAnalog-Watchface](https://github.com/bhugh/ElegantAnalog-Watchface) | 2025‑01‑29  | ⭐4 | 79 | | [AKInstinctQuotesStatsMoveBar](https://github.com/akendrick451/AKInstinctQuotesStatsMoveBar) | 2025‑01‑18  | | 80 | | [ThePlanets-Watchface](https://github.com/BDH-Software/ThePlanets-Watchface) | 2025‑01‑18  | | 81 | | [Anker](https://github.com/oyvindse/Anker) | 2025‑01‑15  | ⭐1 | 82 | | [garmin-pedro-watchface](https://github.com/simllll/garmin-pedro-watchface) | 2025‑01‑07  | ⭐4 | 83 | | [kago](https://github.com/krasimir/kago) | 2025‑01‑04  | ⭐9 | 84 | | [Yet-Another-WatchFace](https://github.com/Laverlin/Yet-Another-WatchFace) | 2024‑12‑07  | ⭐61 | 85 | | [garmin-watchface-40d-mip-power](https://github.com/dryotta/garmin-watchface-40d-mip-power) | 2024‑11‑23  | ⭐11 | 86 | | [Rainforest](https://github.com/SarahBass/Rainforest) | 2024‑09‑28  | | 87 | | [Ocean](https://github.com/SarahBass/Ocean) | 2024‑09‑28  | | 88 | | [CandyAdventure](https://github.com/SarahBass/CandyAdventure) | 2024‑09‑18  | | 89 | | [Sundance](https://github.com/cizi/Sundance) | 2024‑09‑16  | ⭐1 | 90 | | [BeetleJuice](https://github.com/SarahBass/BeetleJuice) | 2024‑09‑14  | | 91 | | [GarminKirby](https://github.com/SarahBass/GarminKirby) | 2024‑09‑13  | | 92 | | [TimelyFenix](https://github.com/KWottrich/TimelyFenix) | 2024‑09‑12  | ⭐2 | 93 | | [connectiq-watch-faces](https://github.com/groovc/connectiq-watch-faces) | 2024‑09‑12  | | 94 | | [RaVel-GarminDigitalWatchFace](https://github.com/modus75/RaVel-GarminDigitalWatchFace) | 2024‑09‑11  | | 95 | | [BanjoGarmin](https://github.com/SarahBass/BanjoGarmin) | 2024‑09‑10  | | 96 | | [YoshiGarmin](https://github.com/SarahBass/YoshiGarmin) | 2024‑09‑04  | | 97 | | [PokemonFishing](https://github.com/SarahBass/PokemonFishing) | 2024‑08‑30  | | 98 | | [PocketAsh](https://github.com/SarahBass/PocketAsh) | 2024‑08‑23  | | 99 | | [PocketPika](https://github.com/SarahBass/PocketPika) | 2024‑08‑23  | | 100 | | [dotter](https://github.com/psjo/dotter) | 2024‑08‑10  | | 101 | | [AlniLargeTimeWatchFace](https://github.com/alni/AlniLargeTimeWatchFace) | 2024‑08‑03  | | 102 | | [EasyDisplay](https://github.com/Holger-L/EasyDisplay) | 2024‑07‑13  | | 103 | | [WWF4](https://github.com/fabrikant/WWF4) | 2024‑04‑27  | ⭐1 | 104 | | [FontLessFace](https://github.com/fabrikant/FontLessFace) | 2024‑04‑04  | | 105 | | [aface-garmin-watchface](https://github.com/zetxek/aface-garmin-watchface) | 2024‑04‑01  | ⭐1 | 106 | | [GarminBlendWatchFace](https://github.com/MrJacquers/GarminBlendWatchFace) | 2024‑03‑25  | ⭐4 | 107 | | [Aviatorlike](https://github.com/shortattentionspan/Aviatorlike) | 2024‑02‑29  | | 108 | | [Spotlight](https://github.com/nldroid/Spotlight) | 2024‑02‑29  | ⭐10 | 109 | | [connectiq-logo-analog](https://github.com/douglasr/connectiq-logo-analog) | 2024‑02‑10  | ⭐28 | 110 | | [late](https://github.com/myneur/late) | 2024‑02‑09  | ⭐60 | 111 | | [m2](https://github.com/markdotai/m2) | 2024‑01‑26  | ⭐3 | 112 | | [m1](https://github.com/markdotai/m1) | 2024‑01‑26  | | 113 | | [GarminWatchFaceSuccessCircle](https://github.com/sura0111/GarminWatchFaceSuccessCircle) | 2024‑01‑25  | ⭐4 | 114 | | [presbyopia-watch-face](https://github.com/eldes/presbyopia-watch-face) | 2024‑01‑12  | | 115 | | [garmin-celestial-watchface](https://github.com/Cutwell/garmin-celestial-watchface) | 2024‑01‑09  | | 116 | | [daytimeWatchFace](https://github.com/supercoder3000/daytimeWatchFace) | 2023‑12‑27  | ⭐1 | 117 | | [StressWatchFace](https://github.com/mannyray/StressWatchFace) | 2023‑12‑26  | | 118 | | [thirdface](https://github.com/sudarsanyes/thirdface) | 2023‑12‑19  | | 119 | 120 | ### Older resources 121 | 122 |
123 | Click to expand 124 | 125 | | Name | Last updated | Stars | 126 | | ---- | ----------------- | ----- | 127 | | [BavarianWatchFace](https://github.com/aklarl/BavarianWatchFace) | 2023‑11‑08  | | 128 | | [JBWatch](https://github.com/bodnar13/JBWatch) | 2023‑11‑02  | | 129 | | [AnalogExplorerWatchFace](https://github.com/hurenkam/AnalogExplorerWatchFace) | 2023‑10‑27  | ⭐4 | 130 | | [garmin.watch.analogplus](https://gitlab.com/nz_brian/garmin.watch.analogplus) | 2023‑10‑27  | | 131 | | [garmin-watch-face](https://github.com/hiddewie/garmin-watch-face) | 2023‑10‑09  | | 132 | | [BAWF](https://github.com/kevinboone/BAWF) | 2023‑09‑21  | ⭐1 | 133 | | [blackcatGarmin](https://github.com/SarahBass/blackcatGarmin) | 2023‑09‑04  | | 134 | | [HalloweenCat](https://github.com/SarahBass/HalloweenCat) | 2023‑09‑04  | ⭐1 | 135 | | [tactix-fenix](https://github.com/chakflying/tactix-fenix) | 2023‑08‑26  | ⭐2 | 136 | | [Infocal](https://github.com/RyanDam/Infocal) | 2023‑08‑23  | ⭐65 | 137 | | [Infocal](https://github.com/jeffwyeh/Infocal) | 2023‑08‑23  | ⭐4 | 138 | | [DaylightWF](https://github.com/macherel/DaylightWF) | 2023‑08‑14  | | 139 | | [Data-Heavy-Garmin-Watchface](https://github.com/SarahBass/Data-Heavy-Garmin-Watchface) | 2023‑08‑09  | ⭐5 | 140 | | [PokemonGarmin](https://github.com/SarahBass/PokemonGarmin) | 2023‑08‑09  | ⭐2 | 141 | | [Cycle-View-Garmin-Watch-Pig](https://github.com/SarahBass/Cycle-View-Garmin-Watch-Pig) | 2023‑08‑09  | ⭐1 | 142 | | [VirtualPetMonkey](https://github.com/SarahBass/VirtualPetMonkey) | 2023‑08‑09  | ⭐12 | 143 | | [PoolPanda](https://github.com/SarahBass/PoolPanda) | 2023‑08‑09  | ⭐1 | 144 | | [BeachKittyGarmin](https://github.com/SarahBass/BeachKittyGarmin) | 2023‑08‑09  | ⭐1 | 145 | | [Virtual-Garmin-Pet](https://github.com/SarahBass/Virtual-Garmin-Pet) | 2023‑08‑09  | ⭐4 | 146 | | [snout](https://github.com/wolffshots/snout) | 2023‑07‑07  | ⭐3 | 147 | | [DR4c1](https://github.com/JoopVerdoorn/DR4c1) | 2023‑07‑01  | | 148 | | [DR4c2](https://github.com/JoopVerdoorn/DR4c2) | 2023‑07‑01  | ⭐1 | 149 | | [RetroFace](https://github.com/nicolas-gte/RetroFace) | 2023‑06‑21  | ⭐1 | 150 | | [VirtualStarPetGarmin](https://github.com/SarahBass/VirtualStarPetGarmin) | 2023‑05‑04  | ⭐1 | 151 | | [VirtualStarWatchGARMIN](https://github.com/SarahBass/VirtualStarWatchGARMIN) | 2023‑04‑26  | ⭐1 | 152 | | [OnAGlimpse](https://github.com/Prime1Code/OnAGlimpse) | 2023‑04‑15  | ⭐4 | 153 | | [Triforce-Watch-Face](https://github.com/slakhani1231/Triforce-Watch-Face) | 2023‑03‑06  | ⭐1 | 154 | | [dexli-watchface](https://github.com/deviammx/dexli-watchface) | 2023‑02‑13  | | 155 | | [DR4c0](https://github.com/JoopVerdoorn/DR4c0) | 2023‑01‑18  | | 156 | | [DR8-10c0](https://github.com/JoopVerdoorn/DR8-10c0) | 2023‑01‑09  | | 157 | | [DU8-10c3](https://github.com/JoopVerdoorn/DU8-10c3) | 2023‑01‑09  | | 158 | | [CleanSteps](https://github.com/jonasbcdk/CleanSteps) | 2023‑01‑04  | ⭐1 | 159 | | [DR7c2](https://github.com/JoopVerdoorn/DR7c2) | 2022‑12‑24  | | 160 | | [DR6c1](https://github.com/JoopVerdoorn/DR6c1) | 2022‑12‑24  | | 161 | | [DR6c2](https://github.com/JoopVerdoorn/DR6c2) | 2022‑12‑24  | | 162 | | [DR5c2](https://github.com/JoopVerdoorn/DR5c2) | 2022‑12‑23  | | 163 | | [garmin_wordclock](https://github.com/thekr1s/garmin_wordclock) | 2022‑12‑21  | ⭐3 | 164 | | [DR7c0](https://github.com/JoopVerdoorn/DR7c0) | 2022‑12‑21  | ⭐2 | 165 | | [DR6c0](https://github.com/JoopVerdoorn/DR6c0) | 2022‑12‑18  | | 166 | | [garmin-connect-iq](https://github.com/dennybiasiolli/garmin-connect-iq) | 2022‑10‑10  | ⭐24 | 167 | | [RunnerAttitude](https://github.com/jchabsi/RunnerAttitude) | 2022‑07‑23  | | 168 | | [eleven-forty-five](https://github.com/starryalley/eleven-forty-five) | 2022‑06‑23  | ⭐3 | 169 | | [stValentineFace](https://github.com/shurupyan/stValentineFace) | 2022‑06‑12  | | 170 | | [fitface](https://github.com/ldscavo/fitface) | 2022‑05‑07  | ⭐1 | 171 | | [ciq_binarywatch](https://github.com/lcj2/ciq_binarywatch) | 2022‑03‑23  | | 172 | | [digital-watch-cas10](https://github.com/fjbenitog/digital-watch-cas10) | 2022‑02‑24 🗄️ | ⭐2 | 173 | | [Multivision-Watch](https://github.com/JoshuaTheMiller/Multivision-Watch) | 2022‑02‑06  | ⭐21 | 174 | | [BinaryWatchFace](https://github.com/Chemaclass/BinaryWatchFace) | 2022‑01‑29  | ⭐5 | 175 | | [Garmin-WatchCLC](https://github.com/claudiocandio/Garmin-WatchCLC) | 2022‑01‑20  | ⭐1 | 176 | | [Retro-Quartz-Digital-Watch](https://github.com/domosia/Retro-Quartz-Digital-Watch) | 2022‑01‑20  | ⭐9 | 177 | | [shy-watch-face](https://github.com/kevin940726/shy-watch-face) | 2022‑01‑09  | ⭐11 | 178 | | [timeless](https://github.com/voseldop/timeless) | 2021‑10‑24  | ⭐1 | 179 | | [Aviatorlike_1Hz](https://github.com/OliverHannover/Aviatorlike_1Hz) | 2021‑08‑30  | | 180 | | [Aviatorlike](https://github.com/OliverHannover/Aviatorlike) | 2021‑08‑28  | ⭐5 | 181 | | [garmin-m8m](https://github.com/matei-tm/garmin-m8m) | 2021‑07‑04  | ⭐3 | 182 | | [garmin-nyan-cat](https://github.com/sunpazed/garmin-nyan-cat) | 2021‑05‑29  | ⭐23 | 183 | | [ElPrimero](https://github.com/tumb1er/ElPrimero) | 2021‑05‑21  | ⭐9 | 184 | | [vaguetime-watch-face](https://github.com/dmllr/vaguetime-watch-face) | 2021‑03‑25  | ⭐2 | 185 | | [connectiq-faceymcwatchface](https://github.com/le-cds/connectiq-faceymcwatchface) | 2021‑03‑18  | ⭐6 | 186 | | [connectiq-xclock](https://github.com/plaets/connectiq-xclock) | 2021‑03‑08  | | 187 | | [VivoactiveAtreliosWatchFace](https://github.com/StefanStefanoff/VivoactiveAtreliosWatchFace) | 2021‑02‑11  | | 188 | | [JSClock](https://github.com/jensws80/JSClock) | 2021‑01‑19  | ⭐2 | 189 | | [DRG-Clutterless](https://github.com/DRG-developer/DRG-Clutterless) | 2021‑01‑17  | ⭐1 | 190 | | [kudos](https://github.com/Peterdedecker/kudos) | 2021‑01‑01  | ⭐5 | 191 | | [DRG-Nathos](https://github.com/DRG-developer/DRG-Nathos) | 2020‑10‑08  | | 192 | | [Digital5Reloaded](https://github.com/erikvb/Digital5Reloaded) | 2020‑10‑04  | | 193 | | [DRG_SNT_3](https://github.com/DRG-developer/DRG_SNT_3) | 2020‑09‑22  | | 194 | | [digital-simplicity](https://github.com/kelnage/digital-simplicity) | 2020‑09‑07  | ⭐8 | 195 | | [GarminMinimalVenuWatchface](https://github.com/ChrisWeldon/GarminMinimalVenuWatchface) | 2020‑08‑28  | ⭐12 | 196 | | [Garmin_BackToTheFuture_WatchFace](https://github.com/DenysTT/Garmin_BackToTheFuture_WatchFace) | 2020‑08‑03  | ⭐7 | 197 | | [sleepy_monkey](https://github.com/springle/sleepy_monkey) | 2020‑08‑01  | | 198 | | [framework245](https://github.com/onryou/framework245) | 2020‑07‑29  | | 199 | | [ximpo](https://github.com/anhmv/ximpo) | 2020‑07‑24  | | 200 | | [DRG-Essential](https://github.com/DRG-developer/DRG-Essential) | 2020‑07‑10  | ⭐3 | 201 | | [iconic](https://github.com/wwarby/iconic) | 2020‑07‑06  | | 202 | | [binary-clock](https://github.com/dimasmith/binary-clock) | 2020‑06‑22  | | 203 | | [ftw-garmin](https://github.com/joakim-ribier/ftw-garmin) | 2020‑06‑12 🗄️ | | 204 | | [elp87GarminWatchFace](https://github.com/elp87/elp87GarminWatchFace) | 2020‑06‑11  | | 205 | | [garmin-roundedtext](https://github.com/tomfogg/garmin-roundedtext) | 2020‑06‑04  | ⭐12 | 206 | | [COVID19WF](https://github.com/bodyazn/COVID19WF) | 2020‑05‑21  | | 207 | | [ripoff-watch-face](https://github.com/jchen1/ripoff-watch-face) | 2020‑05‑17  | ⭐2 | 208 | | [garmin_watchface](https://github.com/BodyFatControl/garmin_watchface) | 2020‑05‑15  | | 209 | | [WHatch4Me](https://github.com/WHalford/WHatch4Me) | 2020‑05‑12  | ⭐2 | 210 | | [digital5](https://github.com/HanSolo/digital5) | 2020‑04‑27  | ⭐12 | 211 | | [slyface](https://github.com/slyoldfox/slyface) | 2020‑04‑11  | | 212 | | [SilverWatchFace](https://github.com/lukaszgruca/SilverWatchFace) | 2020‑04‑06  | ⭐9 | 213 | | [AYCHFace](https://github.com/AYCHPlus/AYCHFace) | 2020‑04‑01  | | 214 | | [cara-one](https://github.com/willful-it/cara-one) | 2020‑03‑28  | ⭐1 | 215 | | [LowEnergyFace](https://github.com/fabrikant/LowEnergyFace) | 2020‑03‑20  | ⭐2 | 216 | | [philippe-watchface](https://github.com/IanGrainger/philippe-watchface) | 2020‑03‑14  | | 217 | | [LowEnergyFace2](https://github.com/fabrikant/LowEnergyFace2) | 2020‑02‑25  | | 218 | | [GarminSampleWatch](https://github.com/AmitPandya007/GarminSampleWatch) | 2019‑12‑17  | | 219 | | [WatchFaceMonospace](https://github.com/ayaromenok/WatchFaceMonospace) | 2019‑11‑16  | | 220 | | [Plotty McClockface](https://gitlab.com/knusprjg/plotty-mcclockface) | 2019‑10‑17  | ⭐1 | 221 | | [crystal-face-jpg63](https://github.com/jpg63/crystal-face-jpg63) | 2019‑06‑29  | | 222 | | [copernicus](https://github.com/cy384/copernicus) | 2019‑05‑22  | ⭐3 | 223 | | [ConnectIQ-WorldTime-Face](https://github.com/berryk/ConnectIQ-WorldTime-Face) | 2019‑05‑05  | ⭐1 | 224 | | [garmin-hedgetime](https://github.com/sunpazed/garmin-hedgetime) | 2019‑04‑24  | ⭐7 | 225 | | [LetsGetDigital](https://github.com/micooke/LetsGetDigital) | 2019‑04‑24  | ⭐3 | 226 | | [Simplog](https://gitlab.com/jsteinkamp/Simplog) | 2019‑03‑30  | | 227 | | [garmin-djcat](https://github.com/sunpazed/garmin-djcat) | 2019‑03‑06  | | 228 | | [garmin-sidereal-watchface](https://github.com/ste616/garmin-sidereal-watchface) | 2018‑12‑16  | | 229 | | [DistanceFace](https://github.com/HikiQ/DistanceFace) | 2018‑11‑10  | ⭐1 | 230 | | [Watchface-Cuphead](https://github.com/ATGH15102AFMLD/Watchface-Cuphead) | 2018‑09‑17  | ⭐3 | 231 | | [cryptocurrency-watchface](https://github.com/johndifini/cryptocurrency-watchface) | 2018‑09‑14  | ⭐3 | 232 | | [Fenix5](https://github.com/jonathandaliva/Fenix5) | 2018‑07‑22  | | 233 | | [worldtime-crystal](https://gitlab.com/keithwberry/worldtime-crystal) | 2018‑07‑15  | ⭐2 | 234 | | [ActiAnalog3](https://github.com/usernzb/ActiAnalog3) | 2018‑07‑04  | | 235 | | [MyBigDate](https://github.com/DeCaPa/MyBigDate) | 2018‑05‑01  | | 236 | | [erock20](https://github.com/eiveiv/erock20) | 2018‑04‑30  | | 237 | | [DayRound](https://github.com/rain-dl/DayRound) | 2018‑03‑18  | ⭐1 | 238 | | [Watch-Face-Garmin](https://github.com/sixtop/Watch-Face-Garmin) | 2018‑02‑26  | | 239 | | [anyaWatches](https://github.com/mpl75/anyaWatches) | 2018‑02‑25  | ⭐1 | 240 | | [Watch-Face-Garmin](https://github.com/laurencee9/Watch-Face-Garmin) | 2018‑02‑23  | ⭐10 | 241 | | [garmin-flags](https://github.com/sunpazed/garmin-flags) | 2018‑02‑16  | ⭐1 | 242 | | [Graphomatic](https://github.com/Chiocciola/Graphomatic) | 2018‑02‑15  | | 243 | | [KISSFace](https://github.com/dbcm/KISSFace) | 2018‑01‑26  | ⭐21 | 244 | | [Snapshot](https://github.com/darrencroton/Snapshot) | 2018‑01‑24  | ⭐3 | 245 | | [TidyWatch](https://github.com/HookyQR/TidyWatch) | 2017‑10‑02  | ⭐1 | 246 | | [SnapshotWatch](https://github.com/darrencroton/SnapshotWatch) | 2017‑09‑20  | ⭐20 | 247 | | [AnalogSeed](https://github.com/backface/AnalogSeed) | 2017‑09‑16  | ⭐2 | 248 | | [BGConnectUI](https://github.com/yarmatr/BGConnectUI) | 2017‑08‑21  | | 249 | | [Garmin-Watchface](https://github.com/cekeller6121/Garmin-Watchface) | 2017‑08‑05  | | 250 | | [BYOD-Watchface](https://github.com/NickSteen/BYOD-Watchface) | 2017‑06‑30  | ⭐18 | 251 | | [garmin-pollock](https://github.com/sunpazed/garmin-pollock) | 2017‑06‑02  | | 252 | | [Garmin-Watch-Faces](https://github.com/vmaywood/Garmin-Watch-Faces) | 2017‑05‑27  | ⭐3 | 253 | | [garmin-mario](https://github.com/sunpazed/garmin-mario) | 2017‑05‑02  | ⭐2 | 254 | | [garmin-watchface](https://github.com/shortattentionspan/garmin-watchface) | 2017‑04‑30  | ⭐1 | 255 | | [SnapshotHR](https://github.com/darrencroton/SnapshotHR) | 2017‑04‑23  | ⭐5 | 256 | | [SnapshotRHR](https://github.com/darrencroton/SnapshotRHR) | 2017‑04‑18  | ⭐3 | 257 | | [ConnectIQ-ProgbarWatchFace](https://github.com/Korimsoft/ConnectIQ-ProgbarWatchFace) | 2017‑04‑13  | ⭐2 | 258 | | [garmin-mickey](https://github.com/sunpazed/garmin-mickey) | 2017‑04‑12  | ⭐25 | 259 | | [digital](https://github.com/HanSolo/digital) | 2017‑03‑20  | ⭐11 | 260 | | [darktimes](https://github.com/psjo/darktimes) | 2017‑03‑08  | ⭐2 | 261 | | [GARMIN-AMD_Watchface](https://github.com/antonioasaro/GARMIN-AMD_Watchface) | 2017‑02‑21  | ⭐1 | 262 | | [arcsin](https://github.com/psjo/arcsin) | 2017‑02‑07  | ⭐1 | 263 | | [felt](https://github.com/psjo/felt) | 2017‑02‑02  | ⭐1 | 264 | | [garmin-drawaa](https://github.com/sunpazed/garmin-drawaa) | 2017‑01‑25  | ⭐15 | 265 | | [garmin-vangogh](https://github.com/sunpazed/garmin-vangogh) | 2017‑01‑25  | ⭐1 | 266 | | [SwagginNumerals](https://github.com/30Wedge/SwagginNumerals) | 2017‑01‑23  | | 267 | | [garmin-oz](https://github.com/sunpazed/garmin-oz) | 2017‑01‑12  | | 268 | | [Formula_1](https://github.com/OliverHannover/Formula_1) | 2017‑01‑08  | ⭐5 | 269 | | [connect-iq](https://github.com/ToryStark/connect-iq) | 2016‑12‑19  | | 270 | | [batman](https://github.com/miamo/batman) | 2016‑10‑08  | ⭐3 | 271 | | [connectiq-apps](https://github.com/andriijas/connectiq-apps) | 2016‑10‑05  | | 272 | | [garmin-offset-watch-face](https://github.com/jonathan-beebe/garmin-offset-watch-face) | 2016‑10‑04 🗄️ | | 273 | | [LimitFace](https://github.com/sarahemm/LimitFace) | 2016‑09‑11  | ⭐2 | 274 | | [connectiq-apps](https://github.com/CodyJung/connectiq-apps) | 2016‑08‑14  | ⭐51 | 275 | | [ConnectIQ-8-BitWatch](https://github.com/dbanno/ConnectIQ-8-BitWatch) | 2016‑04‑16  | ⭐1 | 276 | | [Analog24](https://github.com/sparksp/Analog24) | 2016‑03‑29  | ⭐5 | 277 | | [connect-iq](https://github.com/smeyac/connect-iq) | 2016‑01‑26  | ⭐6 | 278 | | [z1_watchface](https://github.com/worksasdesigned/z1_watchface) | 2015‑08‑11  | ⭐10 | 279 | 280 | 281 |
282 | 283 | ## Data fields 284 | 285 | [Data fields] allow customers and third party developers to write additional 286 | metrics and data that will display with Garmin activities. The goal is to create 287 | a system that not only makes it easy for a user to make a quick data field based 288 | off our workout data, but also gives the developer the the ability to customize 289 | the presentation. 290 | 291 | | Name | Description | Last updated | Stars | 292 | | ---- | ----------- | ----------------- | ----- | 293 | | [breadcrumb-garmin](https://github.com/pauljohnston2025/breadcrumb-garmin) | Garmin watch datafield that shows breadcrumb trail | 2025‑11‑11  | ⭐11 | 294 | | [smart-cadence](https://gitlab.com/harryonline/smart-cadence) | Connect IQ display field cadence, distance/time when cadence 0 | 2025‑11‑06  | | 295 | | [SmartBikeLights](https://github.com/maca88/SmartBikeLights) | Garmin application for ANT+ bike lights | 2025‑11‑02  | ⭐148 | 296 | | [HikeFieldv2](https://github.com/evilwombat/HikeFieldv2) | Hiking data field for Garmin smartwatches. Originally forked from tymmej/HikeField | 2025‑10‑30  | ⭐1 | 297 | | [steps2fit](https://github.com/rgergely/steps2fit) | Garmin Connect IQ datafiled for counting steps during activities | 2025‑10‑25  | ⭐10 | 298 | | [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 | 299 | | [GRun-Chinese](https://github.com/Likenttt/GRun-Chinese) | Forked from GRun but localized for Chinese | 2025‑10‑17  | | 300 | | [BodyBatteryDF](https://github.com/flocsy/BodyBatteryDF) | Body Battery data field for Garmin watches | 2025‑10‑15  | ⭐1 | 301 | | [DFDetector](https://github.com/flocsy/DFDetector) | Garmin datafield for developers to demonstrate how multiple datafields can be detected | 2025‑10‑15  | ⭐4 | 302 | | [FitFieldWasterDF](https://github.com/flocsy/FitFieldWasterDF) | | 2025‑10‑15  | | 303 | | [GRun](https://github.com/gcormier9/GRun) | Configurable Garmin Watch datafield | 2025‑10‑14  | ⭐109 | 304 | | [BTHomeIQ](https://github.com/ray0711/BTHomeIQ) | ConnectIQ datafield for displaying and recording BTHome temperature broadcasts | 2025‑10‑12  | ⭐3 | 305 | | [GarminHikeDifficulty](https://github.com/AlexBarinov/GarminHikeDifficulty) | Calculates your real time Shenandoah's Hiking Difficulty as defined on National Park Service site | 2025‑10‑06  | ⭐4 | 306 | | [Garmin-Datafield-sample-code](https://github.com/ActiveLook/Garmin-Datafield-sample-code) | ActiveLook Garmin Datafield | 2025‑10‑06  | ⭐10 | 307 | | [Fellrnrs-Datafield-ActiveLook](https://github.com/fellrnr/Fellrnrs-Datafield-ActiveLook) | Fellrnr's Modification of ActiveLook Garmin Datafield | 2025‑07‑30  | | 308 | | [garmin-repafield](https://github.com/dyuri/garmin-repafield) | Garmin watch DataField for myself | 2025‑07‑19  | ⭐5 | 309 | | [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  | | 310 | | [PowerAdjuster](https://github.com/axl13/PowerAdjuster) | Connect IQ Power Adjuster | 2025‑07‑08  | ⭐3 | 311 | | [TempeField](https://github.com/maca88/TempeField) | Garmin application for Tempe sensor | 2025‑07‑06  | ⭐8 | 312 | | [GarminGoProDatafield](https://github.com/sam-dumont/GarminGoProDatafield) | Control your GoPro camera from a Datafield | 2025‑06‑27  | ⭐11 | 313 | | [anyaBike](https://github.com/mpl75/anyaBike) | Data field for cyclists who have their watch attached to their handlebars | 2025‑06‑25  | ⭐4 | 314 | | [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  | | 315 | | [DaylightLeft](https://github.com/rconradharris/DaylightLeft) | Daylight Left DataField for Garmin ConnectIQ Watches | 2025‑05‑23  | ⭐1 | 316 | | [spotlight](https://github.com/fabiobaltieri/spotlight) | Petzl Actik Core mod board with Bluetooth LE and Connect IQ remote control. | 2025‑05‑15 🗄️ | ⭐7 | 317 | | [ZoneTraining](https://github.com/ViktorStagge/ZoneTraining) | A Zone Training app for Garmin Watches. | 2025‑04‑24  | ⭐5 | 318 | | [SinceStopped](https://github.com/thisdougb/SinceStopped) | A Garmin data field. | 2025‑04‑15  | | 319 | | [ciq-battery-field](https://github.com/fabiobaltieri/ciq-battery-field) | Connect IQ field for battery level with Fit logging | 2025‑03‑19  | ⭐3 | 320 | | [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 | 321 | | [GarminSlopeDatafield](https://github.com/mizamae/GarminSlopeDatafield) | Datafield that shows the current slope (in %) that you are in | 2025‑01‑24  | ⭐7 | 322 | | [walker](https://github.com/wwarby/walker) | A free data field for Garmin watches to provide stats for walking activities | 2024‑12‑26  | ⭐67 | 323 | | [HikeFieldv2-forked](https://github.com/evilwombat/HikeFieldv2-forked) | Data Field for Garmin Watches | 2024‑12‑26  | ⭐2 | 324 | | [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 | 325 | | [ciq-nrf-blinky](https://github.com/fabiobaltieri/ciq-nrf-blinky) | Connect IQ application client for Nordic nRF Blinky BLE example | 2024‑10‑07  | ⭐16 | 326 | | [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 | 327 | | [garmin-lastsplit](https://github.com/stirnim/garmin-lastsplit) | Last Split - a Garmin Connect IQ data field | 2024‑03‑05  | ⭐1 | 328 | | [Sailing-Instrument](https://github.com/Fra-Sti/Sailing-Instrument) | Garmin sailing instrument connecting to a Calypso Ultrasonic | 2024‑02‑07  | ⭐3 | 329 | | [HikeField](https://github.com/tymmej/HikeField) | Data Field for Garmin Watches | 2024‑01‑07  | | 330 | | [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 | 331 | | [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 | 332 | 333 | ### Older resources 334 | 335 |
336 | Click to expand 337 | 338 | | Name | Description | Last updated | Stars | 339 | | ---- | ----------- | ----------------- | ----- | 340 | | [connectiq-hr-zones](https://github.com/peregin/connectiq-hr-zones) | Heart rate and zones with histogram data field for Garmin IQ | 2023‑11‑20  | ⭐9 | 341 | | [UVIndexDataField](https://github.com/mattv23v/UVIndexDataField) | DataField to show UV index | 2023‑11‑10  | ⭐1 | 342 | | [DataChampGarmin](https://github.com/wubbl0rz/DataChampGarmin) | More than one data field for bike computers | 2023‑11‑04  | ⭐6 | 343 | | [HeartRateRunner](https://github.com/roelofk/HeartRateRunner) | Garmin connect IQ HeartRateRunner fields | 2023‑09‑21  | ⭐22 | 344 | | [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  | | 345 | | [Connect-IQ-DataField-OC](https://gitlab.com/ravenfeld/Connect-IQ-DataField-OC) | Datafield Garmin connect iq for orientation course | 2023‑09‑14  | | 346 | | [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 | 347 | | [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 | 348 | | [RunPowerWorkout](https://github.com/tommyvdz/RunPowerWorkout) | Garmin ConnectIQ DataField for structured workouts using Stryd. | 2023‑06‑06  | ⭐24 | 349 | | [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  | | 350 | | [DF_TorqueAVG](https://github.com/prenard/DF_TorqueAVG) | Display average torque value in N-m during your training | 2023‑04‑25  | ⭐1 | 351 | | [whatspeed](https://github.com/djs2014/whatspeed) | What app speed | 2023‑04‑05  | | 352 | | [whatpower](https://github.com/djs2014/whatpower) | What app power | 2023‑04‑05  | | 353 | | [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 | 354 | | [HiVisRunField](https://gitlab.com/nz_brian/HiVisRunField) | Easy to read data field | 2023‑02‑16  | | 355 | | [Connect-IQ-DataField-Speed](https://gitlab.com/ravenfeld/Connect-IQ-DataField-Speed) | Colorized speed gauge | 2022‑12‑21  | | 356 | | [Connect-IQ-DataField-VirtualPartner](https://gitlab.com/ravenfeld/Connect-IQ-DataField-VirtualPartner) | Virtual race partner | 2022‑12‑21  | | 357 | | [Connect-IQ-DataField-GPS](https://gitlab.com/ravenfeld/Connect-IQ-DataField-GPS) | Datafield Garmin connect iq GPS | 2022‑12‑21  | | 358 | | [Connect-IQ-DataField-Battery](https://gitlab.com/ravenfeld/Connect-IQ-DataField-Battery) | Datafield Garmin connect iq battery | 2022‑12‑21  | | 359 | | [EveryTile](https://github.com/to-ko/EveryTile) | DataField App for garmin edge cycling computers | 2022‑10‑01  | ⭐10 | 360 | | [4caster](https://github.com/guibber/4caster) | DataField for Garmin devices that predicts milestone times based upon current speed and progress | 2022‑09‑11  | | 361 | | [RunPowerWorkoutNG](https://github.com/sam-dumont/RunPowerWorkoutNG) | Garmin ConnectIQ DataField for structured workouts using Stryd. | 2022‑07‑16  | | 362 | | [RaceWithPower](https://github.com/sam-dumont/RaceWithPower) | Datafield dedicated to racing with power, for Garmin Watches | 2022‑07‑15  | ⭐1 | 363 | | [ORun](https://github.com/grafstrom/ORun) | Orienteering data-field for Garmin Connect IQ devices | 2022‑06‑12  | ⭐3 | 364 | | [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  | | 365 | | [jumps](https://github.com/der-Dod/jumps) | Garmin datafield for jumps | 2022‑03‑18  | ⭐12 | 366 | | [garmin-fartlek4fun](https://github.com/vinzenzs/garmin-fartlek4fun) | Play some fun Fartleks | 2022‑02‑21  | | 367 | | [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 | 368 | | [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 | 369 | | [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 | 370 | | [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 | 371 | | [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 | 372 | | [AuxHR](https://github.com/imgrant/AuxHR) | Connect IQ data field for secondary ANT+ heart rate monitor | 2021‑09‑13  | ⭐7 | 373 | | [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  | | 374 | | [GRun](https://github.com/markwmuller/GRun) | Configurable Garmin Watch datafield | 2020‑12‑21 🗄️ | | 375 | | [connectiq-workout-datafields](https://github.com/sam-dumont/connectiq-workout-datafields) | | 2020‑11‑25  | ⭐2 | 376 | | [datafields](https://github.com/danielmitd/datafields) | garmin datafields (coverage) | 2020‑08‑29  | ⭐2 | 377 | | [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 | 378 | | [data-field](https://github.com/dodor84/data-field) | Test data field | 2020‑05‑24  | | 379 | | [garmin-swissgrid](https://github.com/stirnim/garmin-swissgrid) | Swissgrid - a Garmin Connect IQ data field | 2020‑05‑05  | | 380 | | [garmin-andytimer](https://github.com/stirnim/garmin-andytimer) | Andy Timer - a Garmin Connect IQ data field | 2020‑05‑05  | | 381 | | [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  | | 382 | | [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 | 383 | | [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  | | 384 | | [GarminCogDisplay](https://github.com/clementbarthes/GarminCogDisplay) | | 2019‑10‑11  | ⭐4 | 385 | | [RunnersField](https://github.com/kopa/RunnersField) | A specialized data field for the Garmin Fenix 3 sports watch. | 2019‑07‑03  | ⭐32 | 386 | | [edgecycle](https://github.com/davisben/edgecycle) | Cycling data field for Garmin Edge Devices | 2019‑04‑27  | | 387 | | [larsBikeDatafields](https://github.com/larspnw/larsBikeDatafields) | | 2019‑03‑07  | | 388 | | [ciq-runpower](https://github.com/flowstatedev/ciq-runpower) | Run Power data field for Garmin Connect IQ watches | 2019‑01‑13  | ⭐14 | 389 | | [PauseTimer-connectiq](https://github.com/britiger/PauseTimer-connectiq) | Pause Timer for Garmin Connect IQ | 2018‑12‑30  | | 390 | | [PBike](https://github.com/mirko77/PBike) | Configurable Garmin FR645M datafield | 2018‑12‑23  | ⭐1 | 391 | | [PRun](https://github.com/mirko77/PRun) | Configurable Garmin FR645M datafield | 2018‑12‑23  | ⭐1 | 392 | | [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 | 393 | | [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 | 394 | | [CombiSpeed](https://github.com/ithiel01/CombiSpeed) | CombiSpeed | 2018‑01‑03  | | 395 | | [Connect-iQ-CGM-datafield](https://github.com/snorrehu/Connect-iQ-CGM-datafield) | | 2017‑11‑05  | | 396 | | [405HR](https://github.com/janverley/405HR) | Forerunner 405 styled HR graph Connect IQ Data Field | 2017‑09‑11  | ⭐1 | 397 | | [Lap-average-vertical-speed](https://github.com/danipindado/Lap-average-vertical-speed) | Average vertical lap speed | 2017‑07‑19  | ⭐1 | 398 | | [Lap-average-vertical-speed](https://github.com/danielp27/Lap-average-vertical-speed) | Performance per kilometer calculation | 2017‑07‑19  | ⭐1 | 399 | | [ColourHR](https://github.com/seajay/ColourHR) | Datafield for Garmin watches | 2017‑04‑12  | ⭐2 | 400 | | [LandNavApp](https://github.com/landnavapp/LandNavApp) | Land Nav, dead reckoning, and orienteering training datafield for Garmin GPS Connect-IQ enabled devices | 2017‑04‑03  | ⭐5 | 401 | | [connectiq_laps_datafield](https://github.com/travisvitek/connectiq_laps_datafield) | ConnectIQ: simple lap history data field | 2017‑02‑27  | ⭐1 | 402 | | [FlexiRunner](https://github.com/imgrant/FlexiRunner) | A ConnectIQ customized data field for Garmin devices | 2017‑02‑24  | ⭐16 | 403 | | [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  | | 404 | | [TravelCalc](https://github.com/kolyuchii/TravelCalc) | This is a data field for the Garmin bicycle computers | 2017‑02‑02  | ⭐1 | 405 | | [OmniBikeField](https://github.com/ebottacin/OmniBikeField) | Connect IQ datafield | 2017‑01‑22  | | 406 | | [ciq_monkeyfuel](https://github.com/lcj2/ciq_monkeyfuel) | Connect IQ sample simple data field project. | 2017‑01‑20  | ⭐3 | 407 | | [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 | 408 | | [EnergyExpenditureField](https://github.com/imgrant/EnergyExpenditureField) | A ConnectIQ customized data field for Garmin devices | 2016‑11‑03  | ⭐1 | 409 | | [RunningEconomyField](https://github.com/imgrant/RunningEconomyField) | A ConnectIQ customized data field for Garmin devices | 2016‑11‑03  | ⭐2 | 410 | | [garmin-trimp](https://github.com/victornottat/garmin-trimp) | Garmin Connect IQ TRIMP data field | 2016‑10‑03  | ⭐4 | 411 | | [garmin-trimp-perhour](https://github.com/victornottat/garmin-trimp-perhour) | Garmin Connect IQ TRIMP per hour data field | 2016‑10‑03  | ⭐6 | 412 | | [Garmin-LSGrade](https://github.com/nickmacias/Garmin-LSGrade) | Garmin MonkeyC code for least-squares calculation of smoothed grade | 2016‑09‑02  | | 413 | | [Garmin-ClimbRate](https://github.com/nickmacias/Garmin-ClimbRate) | Garmin MonkeyC code for calculating climbing rate | 2016‑09‑02  | | 414 | | [Garmin-AvgGrade](https://github.com/nickmacias/Garmin-AvgGrade) | Garmin MonkeyC code for average grade | 2016‑09‑02  | ⭐2 | 415 | | [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 | 416 | | [HCU](https://github.com/jimmyspets/HCU) | Fenix3 Datafield for HCU 129 | 2016‑06‑03  | | 417 | | [swimmer-datafiled-garmin](https://github.com/vovan-/swimmer-datafiled-garmin) | Swimmer datafiled for Garmin Connect IQ store. | 2016‑03‑03  | ⭐3 | 418 | | [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 | 419 | | [BikersField](https://github.com/kopa/BikersField) | A specialized data field for the Garmin Fenix 3 sports watch. | 2015‑11‑12  | ⭐16 | 420 | | [chart-datafields](https://github.com/simonmacmullen/chart-datafields) | Connect IQ data fields | 2015‑10‑22  | ⭐17 | 421 | | [HMFields](https://github.com/dmuino/HMFields) | Connect IQ Data Field for Fenix3 for running a half marathon. | 2015‑10‑11  | ⭐8 | 422 | 423 | 424 |
425 | 426 | ## Widgets 427 | 428 | [Widgets] are mini-apps that allow developers to provide glanceable views of 429 | information. The information may be from a cloud service, from the onboard 430 | sensors, or from other Connect IQ APIs. Widgets are launchable from a rotating 431 | carousel of pages accessible from the main screen of wearables, or from a side 432 | view on bike computers and outdoor handhelds. Unlike apps, Widgets time out 433 | after a period of inactivity and are not allowed to record activities, but they 434 | are also launchable at any time. 435 | 436 | | Name | Description | Last updated | Stars | 437 | | ---- | ----------- | ----------------- | ----- | 438 | | [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. | 2025‑11‑24  | ⭐6 | 439 | | [avganar](https://github.com/felwal/avganar) | Public transport watch app for Stockholm, Sweden | 2025‑11‑23  | ⭐8 | 440 | | [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. | 2025‑11‑17  | ⭐2 | 441 | | [emergencyinfo](https://gitlab.com/harryonline/emergencyinfo) | EmergencyInfo app for Connect IQ | 2025‑11‑13  | | 442 | | [Fortune Quote](https://gitlab.com/harryonline/fortune-quote) | This widget show a random quote from the Gigaset Fortune collection | 2025‑11‑06  | ⭐1 | 443 | | [hasscontrol](https://github.com/hatl/hasscontrol) | Simple garmin widget to control home assistant scenes | 2025‑11‑02  | ⭐210 | 444 | | [gopro-remote-connectiq](https://github.com/ad220/gopro-remote-connectiq) | Garmin ConnectIQ widget to control a GoPro from your wrist | 2025‑10‑24  | ⭐3 | 445 | | [BatteryMonitor](https://github.com/SylvainGa/BatteryMonitor) | Garmin Battery Monitor Widget | 2025‑10‑19  | ⭐3 | 446 | | [Tasker-Trigger](https://github.com/ChelsWin/Tasker-Trigger) | Trigger Tasker tasks from your Garmin watch using the AutoNotification plugin on Android. | 2025‑10‑13  | ⭐2 | 447 | | [Calculator](https://github.com/SylvainGa/Calculator) | | 2025‑10‑12  | ⭐4 | 448 | | [BikeLightsControl](https://github.com/maca88/BikeLightsControl) | Garmin widget for controlling ANT+ lights | 2025‑10‑08  | ⭐19 | 449 | | [Unquestionify](https://github.com/starryalley/Unquestionify) | A Garmin Connect IQ widget for displaying phone notifications as bitmap | 2025‑09‑30  | ⭐17 | 450 | | [otpauth-ciq](https://github.com/uaraven/otpauth-ciq) | ConnectIQ widget for generating TOTP authentication codes. | 2025‑09‑25  | ⭐18 | 451 | | [HabitTree](https://github.com/lkjh654/HabitTree) | Garmin widget that supports resisting bad habits by growing a tree | 2025‑09‑19  | ⭐2 | 452 | | [CIQBitcoinWidget](https://github.com/11samype/CIQBitcoinWidget) | A Connect IQ widget that gets the current Bitcoin price. | 2025‑09‑11  | ⭐3 | 453 | | [Tesla-Link](https://github.com/SylvainGa/Tesla-Link) | ConnectIQ widget for Tesla vehicle control | 2025‑09‑10  | ⭐15 | 454 | | [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‑09‑03  | ⭐68 | 455 | | [Garmin-WeeWX](https://github.com/SylvainGa/Garmin-WeeWX) | Get WeeWX data directly from your Garmin watch | 2025‑08‑30  | ⭐3 | 456 | | [connectiq-sonos](https://github.com/zmullett/connectiq-sonos) | A Garmin Connect IQ watch widget that controls Sonos speaker groups. | 2025‑08‑29  | ⭐9 | 457 | | [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 | 458 | | [timerwidget](https://gitlab.com/harryonline/timerwidget) | A repeating timer widget for Connect IQ compatible Garmin watches. | 2025‑07‑15  | ⭐4 | 459 | | [evccg](https://github.com/TheNinth7/evccg) | A Garmin widget that displays data from evcc, an open-source software solution for solar-powered EV charging. | 2025‑07‑12  | ⭐6 | 460 | | [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 | 461 | | [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  | | 462 | | [authentificator](https://github.com/jurask/authentificator) | OTP authentificator for Garmin devices | 2025‑07‑05  | ⭐6 | 463 | | [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  | ⭐2 | 464 | | [WoP](https://github.com/Marios007/WoP) | Pregnancy Widget for Garmin Watches | 2025‑05‑31  | | 465 | | [garmin-ioBrokerVis](https://github.com/Vertumnus/garmin-ioBrokerVis) | ioBroker Visualization for Garmin smartwatches | 2025‑04‑20  | ⭐3 | 466 | | [SimpTemp](https://github.com/zivke/SimpTemp) | Simple temperature widget for Garmin watches | 2025‑03‑09  | ⭐1 | 467 | | [BatteryGuesstimate](https://github.com/individual-it/BatteryGuesstimate) | Battery estimation for Garmin sportwatches | 2025‑02‑07  | ⭐15 | 468 | | [ThePlanets-Widget](https://github.com/BDH-Software/ThePlanets-Widget) | Garmin IQ widget to calculate position of sun, moon, & planets | 2025‑01‑17  | | 469 | | [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  | | 470 | | [Flashlight](https://github.com/SylvainGa/Flashlight) | Flashlight for Garmin watches | 2024‑12‑22  | ⭐1 | 471 | | [GarminSmartHome](https://github.com/dabastynator/GarminSmartHome) | SmartHome client for Garmin Watches | 2024‑12‑19  | ⭐1 | 472 | | [lostandfound](https://github.com/okdar/lostandfound) | Lost and Found Garmin widget | 2024‑12‑18  | ⭐2 | 473 | | [otp-ciq](https://github.com/jctim/otp-ciq) | OTP Auth Widget for Garmin Connect IQ | 2024‑09‑27  | ⭐20 | 474 | | [SolarStatus-Garmin](https://github.com/dividebysandwich/SolarStatus-Garmin) | A solar status display for the Garmin Epix | 2024‑08‑28  | ⭐3 | 475 | | [garmin-swish-qr](https://github.com/bombsimon/garmin-swish-qr) | Show your Swish QR code on your wrist | 2024‑08‑19  | | 476 | | [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  | | 477 | | [DonnerWetter](https://github.com/fabrikant/DonnerWetter) | Widget for openweatrmap.org service | 2024‑04‑20  | ⭐2 | 478 | | [Garmin-NBA-Widget](https://github.com/singh144401/Garmin-NBA-Widget) | NBA widget gives score of Live NBA games with Timer - Monkey C | 2024‑04‑16  | ⭐4 | 479 | | [Jokes](https://github.com/bbary/Jokes) | Garmin widget that display random jokes | 2024‑03‑18  | | 480 | | [counters](https://github.com/bbary/counters) | garmin counters x3 widget | 2024‑03‑17  | ⭐1 | 481 | | [garminSmartLockApi](https://github.com/yamaserif/garminSmartLockApi) | Garmin Smartwatch Widget for Smart Lock with API provided | 2024‑01‑22  | ⭐1 | 482 | | [GarminCryptoPrices](https://github.com/YoungChulDK/GarminCryptoPrices) | Garmin - Connect IQ App for Current Price of Top 10 Cryptocurrencies | 2023‑12‑13  | ⭐19 | 483 | 484 | ### Older resources 485 | 486 |
487 | Click to expand 488 | 489 | | Name | Description | Last updated | Stars | 490 | | ---- | ----------- | ----------------- | ----- | 491 | | [garmin-tesla](https://github.com/srwalter/garmin-tesla) | ConnectIQ widget for Tesla vehicle control | 2023‑11‑07  | ⭐37 | 492 | | [LetMeIn](https://github.com/fabrikant/LetMeIn) | Create and display QR codes | 2023‑08‑27  | ⭐1 | 493 | | [buttonStroke](https://github.com/elgaard/buttonStroke) | Measure stroke rates in rowing | 2023‑04‑02  | | 494 | | [Maya.CryptoFiatPrice](https://github.com/mayaleh/Maya.CryptoFiatPrice) | Explore the exchange rate of some crypto currencies | 2023‑03‑19  | | 495 | | [hasscontrol](https://github.com/hasscontrol/hasscontrol) | Simple garmin widget to control home assistant scenes | 2022‑12‑14  | ⭐162 | 496 | | [ConnectIQ-LogIt](https://github.com/aleung/ConnectIQ-LogIt) | A ConnectIQ widget to log time | 2022‑11‑23  | ⭐3 | 497 | | [OpenWeatherMapWidget](https://github.com/desyat/OpenWeatherMapWidget) | Garmin Widget connecting to Open Weather Map | 2022‑11‑09  | ⭐46 | 498 | | [GarminRings](https://github.com/mriscott/GarminRings) | Widget showing activity rings | 2022‑09‑02  | ⭐1 | 499 | | [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 | 500 | | [connectiq-widget-pilotsrss](https://github.com/cedric-dufour/connectiq-widget-pilotsrss) | Pilot SR/SS/Twilight hours for Garmin ConnectIQ devices [GPLv3] | 2022‑07‑15  | | 501 | | [connectiq-widget-pilotaltimeter](https://github.com/cedric-dufour/connectiq-widget-pilotaltimeter) | Pilot ICAO/ISA Altimeter for Garmin ConnectIQ devices [GPLv3] | 2022‑07‑15  | ⭐1 | 502 | | [TogglIQ](https://github.com/gcaufield/TogglIQ) | ConnectIQ widget for controlling a Toggl Track Timer | 2022‑06‑26  | ⭐17 | 503 | | [connectiq-widget-totp](https://github.com/cedric-dufour/connectiq-widget-totp) | TOTP (RFC6238) implementation for Garmin ConnectIQ devices [GPLv3] | 2022‑06‑26  | ⭐1 | 504 | | [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  | ⭐1 | 505 | | [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 | 506 | | [BetterBatteryWidget](https://github.com/tumb1er/BetterBatteryWidget) | Battery widget for Connect IQ | 2022‑02‑02  | ⭐6 | 507 | | [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 | 508 | | [dcc-connectiq](https://github.com/geel97/dcc-connectiq) | EU Digital Covid Certificate for Garmin ConnectIQ | 2022‑01‑25  | ⭐4 | 509 | | [WebRequestGlance-Widget](https://github.com/aronsommer/WebRequestGlance-Widget) | Modified version of the Garmin IQ Connect WebRequest sample | 2022‑01‑21  | ⭐3 | 510 | | [WebRequestMultiple-Widget](https://github.com/aronsommer/WebRequestMultiple-Widget) | Garmin Connect IQ WebRequest sample with multiple WebRequests | 2022‑01‑08  | ⭐3 | 511 | | [PregnancyWidget](https://github.com/markwmuller/PregnancyWidget) | | 2021‑10‑31 🗄️ | ⭐1 | 512 | | [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 | 513 | | [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 | 514 | | [AltitudeWidget](https://github.com/simonl-ciq/AltitudeWidget) | A Garmin Connect IQ widget to show the current altitude | 2021‑10‑28  | ⭐1 | 515 | | [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  | | 516 | | [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 | 517 | | [iqbeerpongwidget](https://github.com/dbucher97/iqbeerpongwidget) | A Connect IQ Beer Pong Stats Widget for Garmin Sports Watches | 2021‑05‑18  | ⭐2 | 518 | | [activity_view](https://github.com/mettyw/activity_view) | Garmin Forerunner 235 activity view widget | 2021‑04‑10  | ⭐3 | 519 | | [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  | ⭐13 | 520 | | [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 | 521 | | [ForecastLine](https://github.com/miharekar/ForecastLine) | Connect IQ App inspired by Weather Line | 2020‑12‑16  | ⭐9 | 522 | | [WeatherWid](https://github.com/valgit/WeatherWid) | Garrmin Connect Weather Widget | 2020‑10‑19  | | 523 | | [ConnectIQ](https://github.com/admsteck/ConnectIQ) | Garmin ConnectIQ projects | 2020‑10‑08  | | 524 | | [SunCalc](https://github.com/haraldh/SunCalc) | Garmin Connect IQ Widget to calculate Dusk, Dawn, Sunset, Sunrise, Blue Hour, etc. | 2020‑10‑02  | ⭐38 | 525 | | [SensorHistoryWidget](https://github.com/fabrikant/SensorHistoryWidget) | Displays sensor history: Heart rate, pressure, altitude, temperature, oxygen saturation | 2020‑09‑23  | ⭐3 | 526 | | [ciq-sensorhistory](https://github.com/aleung/ciq-sensorhistory) | Garmin Connect IQ widget - display sensor history diagram | 2020‑08‑20  | ⭐1 | 527 | | [ImageNotify](https://github.com/toskaw/ImageNotify) | Garmin ConnectIQ widget ImageNotify | 2020‑07‑03  | ⭐5 | 528 | | [FastingWidget](https://github.com/pyrob2142/FastingWidget) | A simple fasting tracker for Garmin devices | 2020‑06‑17  | ⭐7 | 529 | | [AllSensors](https://github.com/fabrikant/AllSensors) | Widget with data from multiple sensors | 2020‑03‑05  | | 530 | | [CryptoMarket](https://github.com/serhuz/CryptoMarket) | Widget for viewing cryptocurrency tickers | 2020‑02‑09  | ⭐3 | 531 | | [criticalmaps-garmin-widget](https://github.com/britiger/criticalmaps-garmin-widget) | ConnectIQ Widget for Garmin Edge to send Position to CriticalMaps | 2020‑02‑03  | ⭐3 | 532 | | [septa-rr-garmin](https://github.com/djdevin/septa-rr-garmin) | SEPTA RR widget for Garmin watches | 2020‑01‑26  | | 533 | | [Galendar](https://github.com/fabrikant/Galendar) | Google calendar implementation | 2019‑11‑15  | | 534 | | [BabyLog-Feed-ConnectIQ](https://github.com/tanstaaflFH/BabyLog-Feed-ConnectIQ) | BabyLog: Feed Widget for Garmin ConnectIQ (currently: VivoActive3) | 2019‑11‑11  | ⭐7 | 535 | | [UC-Widget](https://github.com/PlanetTeamSpeakk/UC-Widget) | A widget for Garmin devices that shows today's UC. | 2019‑09‑18  | | 536 | | [Connect-IQ-ThingSpeak-Client](https://github.com/hexaguin/Connect-IQ-ThingSpeak-Client) | Displays weather data from a ThingSpeak Channel | 2019‑02‑24  | | 537 | | [SensorHistoryWidget](https://github.com/jimmycaille/SensorHistoryWidget) | Garmin widget | 2018‑12‑13  | | 538 | | [git-notifications-ciq](https://github.com/eternal-flame-AD/git-notifications-ciq) | Your github notifications on your Garmin(R) watches! | 2018‑12‑01  | ⭐4 | 539 | | [Enphase](https://github.com/jonathanburchmore/Enphase) | Connect IQ widget that displays production and consumption information from an Enphase solar installation | 2018‑11‑26  | | 540 | | [BabyLog-Sleep-ConnectIQ](https://github.com/tanstaaflFH/BabyLog-Sleep-ConnectIQ) | BabyLog: Feed Widget for Garmin ConnectIQ (currently: VivoActive3) | 2018‑10‑30  | | 541 | | [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 | 542 | | [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 | 543 | | [FertiliQ](https://github.com/natabat/FertiliQ) | Fertility stats for Garmin activity trackers | 2018‑03‑24  | | 544 | | [garmin-tally](https://github.com/ascending-edge/garmin-tally) | A counting widget for Garmin Connect IQ devices | 2018‑02‑21  | ⭐2 | 545 | | [connectIqIotButton](https://github.com/sigsegvat/connectIqIotButton) | Configurable IoT Button for connectIQ devices | 2018‑01‑21  | ⭐6 | 546 | | [garmin-authenticator](https://github.com/chemikadze/garmin-authenticator) | Authenticator app for ConnectIQ | 2017‑12‑22  | ⭐25 | 547 | | [garmin-widget-battery](https://github.com/frontdevops/garmin-widget-battery) | Battery Status - Simple beautiful widget for Garmin Watches | 2017‑07‑22  | | 548 | | [iqmeteo](https://github.com/antirez/iqmeteo) | Meteo widget for the Garmin Vivoactive HR powered by Yahoo Weather API | 2017‑04‑14  | ⭐20 | 549 | | [FootballFixtures](https://github.com/hakonrossebo/FootballFixtures) | Garmin Connect IQ widget to display football (soccer) team fixtures | 2016‑08‑02  | ⭐5 | 550 | | [ZuluTime](https://github.com/fhdeutschmann/ZuluTime) | ZuluTime Garmin Connect IQ app | 2016‑01‑19  | | 551 | | [activity-widget](https://github.com/simonmacmullen/activity-widget) | ConnectIQ activity history | 2015‑07‑13  | ⭐8 | 552 | | [instrument-panel](https://github.com/simonmacmullen/instrument-panel) | ConnectIQ speedo | 2015‑04‑29  | ⭐5 | 553 | | [hr-widget](https://github.com/simonmacmullen/hr-widget) | Connect IQ heart rate widget | 2015‑04‑26  | ⭐27 | 554 | 555 | 556 |
557 | 558 | ## Device Apps 559 | 560 | Applications, or [Device Apps], are by far the most robust type of app 561 | available. These allow the most flexibility and customization to the app 562 | designer. They also provide the most access to the capabilities of the wearable 563 | device, such as accessing ANT+ sensors, the accelerometer and reading/recording 564 | FIT files. 565 | 566 | | Name | Description | Last updated | Stars | 567 | | ---- | ----------- | ----------------- | ----- | 568 | | [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. | 2025‑11‑23  | ⭐6 | 569 | | [GarminHomeAssistant](https://github.com/house-of-abbey/GarminHomeAssistant) | Garmin application to provide a dashboard to control your Home Assistant | 2025‑11‑16  | ⭐234 | 570 | | [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  | | 571 | | [Moon-App-Simulator](https://github.com/Judex-77/Moon-App-Simulator) | App for Garmin watches to display data of the moon | 2025‑11‑02  | | 572 | | [trainasone-connectiq](https://github.com/TrainAsONE/trainasone-connectiq) | TrainAsONE Garmin workout download app (Connect IQ) app | 2025‑10‑27  | ⭐23 | 573 | | [IQwprimebal](https://github.com/chanezgr/IQwprimebal) | Garmin Connect IQ Wprime Bal application | 2025‑10‑21  | ⭐20 | 574 | | [TAKWatch-IQ](https://github.com/TDF-PL/TAKWatch-IQ) | TAKWatch-IQ is a Garmin ConnectIQ application that integrates ATAK with Garmin devices | 2025‑10‑13  | ⭐54 | 575 | | [myvario](https://github.com/ydutertre/myvario) | Fork of GliderSK targeted towards paraglider pilots | 2025‑10‑11  | ⭐28 | 576 | | [garmodoro](https://github.com/klimeryk/garmodoro) | Pomodoro for Garmin devices using Connect IQ | 2025‑09‑29  | ⭐96 | 577 | | [garmin-padel](https://github.com/pedrorijo91/garmin-padel) | padel scorekeeper garmin watch app | 2025‑09‑27  | ⭐4 | 578 | | [TempoBPM](https://github.com/xtruan/TempoBPM) | Tempo BPM app for Garmin ConnectIQ | 2025‑09‑26  | ⭐2 | 579 | | [ultiCount](https://github.com/K4pes/ultiCount) | Keep track of scores and gender ratios during games of Ultimate Frisbee | 2025‑09‑26  | ⭐5 | 580 | | [mybiketraffic](https://github.com/kartoone/mybiketraffic) | ConnectIQ app for processing Garmin Varia radar data and counting vehicles. | 2025‑09‑23  | ⭐56 | 581 | | [badminton](https://github.com/matco/badminton) | Badminton application for Garmin watches | 2025‑09‑22  | ⭐36 | 582 | | [wayfinder](https://github.com/blackshadev/wayfinder) | Garmin connect app for finding your way on the water | 2025‑09‑22  | ⭐1 | 583 | | [WorkoutTimer](https://github.com/xtruan/WorkoutTimer) | Workout Timer app for Garmin ConnectIQ | 2025‑09‑20  | ⭐10 | 584 | | [MorseCode](https://github.com/xtruan/MorseCode) | Morse Code app for Garmin ConnectIQ | 2025‑09‑20  | ⭐4 | 585 | | [GpsPosition](https://github.com/xtruan/GpsPosition) | GPS Position app for Garmin ConnectIQ | 2025‑09‑20  | ⭐10 | 586 | | [BPTransport-Garmin](https://github.com/electrofloat/BPTransport-Garmin) | A Garmin Connect IQ app to view realtime public transport data | 2025‑09‑18  | ⭐2 | 587 | | [garmin-curling](https://github.com/phil-mitchell/garmin-curling) | A curling activity tracker for Garmin devices | 2025‑09‑13  | | 588 | | [winds-mobi-client-garmin](https://github.com/winds-mobi/winds-mobi-client-garmin) | Real-time weather observations: Garmin client | 2025‑09‑10  | ⭐5 | 589 | | [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  | ⭐4 | 590 | | [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 | 591 | | [Persian-Calendar-for-Garmin-Watch](https://github.com/mirmousaviii/Persian-Calendar-for-Garmin-Watch) | Persian-Calendar for Garmin Watch | 2025‑08‑22  | ⭐1 | 592 | | [myvariolite](https://github.com/ydutertre/myvariolite) | | 2025‑08‑16  | ⭐2 | 593 | | [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  | ⭐13 | 594 | | [Garmin-Contrast-Shower](https://github.com/aiMonster/Garmin-Contrast-Shower) | An application for Garmin watches to take a contrast shower | 2025‑07‑23  | ⭐19 | 595 | | [garmin-gotchi](https://github.com/Gualor/garmin-gotchi) | Tamagotchi Gen 1 Emulator for Garmin Instinct 3. | 2025‑07‑20  | ⭐8 | 596 | | [S2C](https://github.com/flori/S2C) | App for Garmin Edge computing cadence from speed | 2025‑07‑11  | | 597 | | [RoseOfWind](https://github.com/fabrikant/RoseOfWind) | Connect iq weather widget | 2025‑07‑03  | ⭐1 | 598 | | [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‑07‑01  | ⭐5 | 599 | | [garmin-pace-calculator](https://github.com/bombsimon/garmin-pace-calculator) | 👟 A Garmin app to convert speed to pace and pace to speed | 2025‑06‑29  | | 600 | | [garmin-agv-skating](https://github.com/adekkpl/garmin-agv-skating) | Garmin app with aggressive inline skating activity | 2025‑06‑27  | | 601 | | [Rainy](https://github.com/BleachDev/Rainy) | My Garmin weather app. | 2025‑06‑26  | ⭐29 | 602 | | [garmin-otp-authenticator](https://github.com/ch1bo/garmin-otp-authenticator) | Garmin ConnectIQ Widget for One Time Passwords (HOTP / TOTP / Steam Guard) | 2025‑06‑24  | ⭐101 | 603 | | [Connect-IQ-App-ChronoGym](https://gitlab.com/ravenfeld/Connect-IQ-App-ChronoGym) | Set count and rest timer | 2025‑06‑23  | | 604 | | [hkoradar](https://github.com/chakflying/hkoradar) | Simple Garmin Connect IQ App to view HKO radar images. | 2025‑06‑23  | ⭐2 | 605 | | [shotgunsports](https://github.com/mikkosh/shotgunsports) | Shotgun Sports app for Garmin ConnectIQ | 2025‑06‑21  | | 606 | | [garmin-qr](https://github.com/zetxek/garmin-qr) | Garmin IQ application to generate and display QR codes and barcodes | 2025‑06‑09  | ⭐3 | 607 | | [STRIDE_CIQ_CustomBleProfile](https://github.com/georgefang13/STRIDE_CIQ_CustomBleProfile) | Connect FR265 to your STRIDE hardware | 2025‑04‑28  | ⭐1 | 608 | | [DiscGolf](https://github.com/marvik37/DiscGolf) | Disc golf app | 2025‑04‑21  | ⭐4 | 609 | | [connectiq-app-towplanesk](https://github.com/cedric-dufour/connectiq-app-towplanesk) | The Towplane Swiss Knife for Garmin ConnectIQ devices [GPLv3] | 2025‑04‑07  | | 610 | | [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 | 2025‑03‑07  | ⭐4 | 611 | | [GarminApps](https://github.com/Sonicious/GarminApps) | My Personal Nice Garmin Apps | 2025‑03‑03  | | 612 | | [SailingTools](https://github.com/pintail105/SailingTools) | A Garmin watch IQ app designed for sailing. | 2025‑02‑25  | ⭐10 | 613 | | [8-min-abs](https://github.com/toomasr/8-min-abs) | App for Garmin watches to follow the 8 minute abs workout | 2025‑02‑24  | ⭐5 | 614 | | [TheStars](https://github.com/BDH-Software/TheStars) | Garmin IQ app show the constellations | 2025‑01‑27  | | 615 | | [ThePlanets](https://github.com/bhugh/ThePlanets) | Garmin IQ app to calculate position of sun, moon, & planets | 2025‑01‑21  | ⭐1 | 616 | | [Garmin_Yahtzee](https://github.com/kzibart/Garmin_Yahtzee) | Garmin Connect IQ Game Yahtzee | 2024‑12‑02  | | 617 | | [Garmin_TriPeaks](https://github.com/kzibart/Garmin_TriPeaks) | Garmin Connect IQ Game TriPeaks | 2024‑12‑02  | | 618 | | [Garmin_TileSlider](https://github.com/kzibart/Garmin_TileSlider) | Garmin Connect IQ Game Tile Slider | 2024‑12‑02  | | 619 | | [Garmin_SpaceTrek](https://github.com/kzibart/Garmin_SpaceTrek) | Garmin Connect IQ Game Space Trek | 2024‑12‑02  | | 620 | | [Garmin_Sokoban](https://github.com/kzibart/Garmin_Sokoban) | Garmin Connect IQ Game Sokoban | 2024‑12‑02  | | 621 | | [Garmin_Pyramid](https://github.com/kzibart/Garmin_Pyramid) | Garmin Connect IQ Game Pyramid | 2024‑12‑02  | | 622 | | [Garmin_MasterMind](https://github.com/kzibart/Garmin_MasterMind) | Garmin Connect IQ Game MasterMind | 2024‑12‑02  | | 623 | | [Garmin_Hangman](https://github.com/kzibart/Garmin_Hangman) | Garmin Connect IQ Game Hangman | 2024‑12‑02  | | 624 | | [Garmin_FlappyWatch](https://github.com/kzibart/Garmin_FlappyWatch) | Garmin Connect IQ Game Flappy Watch | 2024‑12‑02  | ⭐1 | 625 | | [Garmin_Farkle](https://github.com/kzibart/Garmin_Farkle) | Garmin Connect IQ Game Farkle | 2024‑12‑02  | | 626 | | [Garmin_Blackjack](https://github.com/kzibart/Garmin_Blackjack) | Garmin Connect IQ Game Blackjack | 2024‑12‑02  | ⭐2 | 627 | | [Garmin_AcesUp](https://github.com/kzibart/Garmin_AcesUp) | Garmin Connect IQ Game Aces Up | 2024‑12‑02  | | 628 | | [monky](https://github.com/vladmunteanu/monky) | Virtual Pet Simulation game with built-in minigames for Garmin vivoactive series | 2024‑12‑01  | ⭐3 | 629 | | [GarminQ](https://github.com/BleachDev/GarminQ) | Highly customizable Daily Diary app for Garmin watches with a built in data visualizer. | 2024‑11‑25  | ⭐4 | 630 | | [Yet-Another-Sailing-App](https://github.com/Laverlin/Yet-Another-Sailing-App) | Sailing application for Garmin smartwatches | 2024‑11‑03  | ⭐24 | 631 | | [SnakeIQ](https://github.com/mazefest/SnakeIQ) | Simple snake game created for Garmin Connect IQ capable devices. | 2024‑10‑26  | ⭐2 | 632 | | [garmin-football-ref-watch](https://github.com/DaWenning/garmin-football-ref-watch) | Garmin Monkey C Application for Football Referees | 2024‑10‑17  | | 633 | | [glidator](https://github.com/gaetanmarti/glidator) | This application - developed for Garmin watches - provides basic and comprehensive flight instruments for gliders. | 2024‑09‑13  | ⭐1 | 634 | | [StepGetterWatch](https://github.com/gergo225/StepGetterWatch) | App for Garmin watches to get detailed information about your steps | 2024‑09‑06  | | 635 | | [GarminDiscGolf](https://github.com/sdgriggs/GarminDiscGolf) | Attempt to make a Disc Golf app for Garmin Watches | 2024‑08‑15  | ⭐3 | 636 | | [wormnav](https://github.com/andan67/wormnav) | Track navigation for Garmin watches | 2024‑07‑20  | ⭐16 | 637 | | [iHIIT](https://github.com/adamjakab/iHIIT) | High Intensity Interval Training (HIIT) GarminIQ App | 2024‑07‑07  | ⭐7 | 638 | | [Salati](https://github.com/bbary/Salati) | mawaqit | 2024‑07‑04  | | 639 | | [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 | 640 | | [Garmin-Coin-Flip](https://github.com/DylanBarratt/Garmin-Coin-Flip) | A coin flipper for the Garmin Forerunner 945 | 2024‑06‑21  | | 641 | | [flight-watcher](https://github.com/chakflying/flight-watcher) | A Garmin Connect IQ application for viewing Flights around you. | 2024‑06‑06  | ⭐4 | 642 | | [GarminIQ-CoachCompanion](https://github.com/bderusha/GarminIQ-CoachCompanion) | GarminIQ Data Field app for using the RunWalkRun method with coached workouts. | 2024‑05‑26  | ⭐3 | 643 | | [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  | | 644 | | [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  | | 645 | | [barbecueboss](https://github.com/arquicanedo/barbecueboss) | Barbecue ConnectIQ App for Garmin Devices | 2024‑03‑14  | ⭐5 | 646 | | [Garmoticz](https://github.com/akamming/Garmoticz) | Garmin ConnectIQ Frontend for Domoticz | 2024‑03‑11  | ⭐4 | 647 | | [RepCounter](https://github.com/leCapi/RepCounter) | Repetition counter for Garmin | 2024‑02‑28  | ⭐2 | 648 | | [worktrail-garmin-connect-iq](https://github.com/worktrail/worktrail-garmin-connect-iq) | Garmin Connect IQ App for WorkTrail | 2024‑02‑08  | | 649 | | [Connect-IQ-App-Timer](https://gitlab.com/ravenfeld/Connect-IQ-App-Timer) | Add several timer already registered | 2024‑01‑12  | ⭐2 | 650 | | [CryptoPricesGarmin](https://github.com/YoungChulDK/CryptoPricesGarmin) | Garmin - Connect IQ App for Current Price of Top 10 Cryptocurrencies | 2023‑12‑13  | ⭐19 | 651 | 652 | ### Older resources 653 | 654 |
655 | Click to expand 656 | 657 | | Name | Description | Last updated | Stars | 658 | | ---- | ----------- | ----------------- | ----- | 659 | | [MBO](https://github.com/rjmccann101/MBO) | Garmin Watch Apps for Mountain Bike Orienteering | 2023‑11‑13  | ⭐9 | 660 | | [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 | 661 | | [garmin-squash](https://github.com/miss-architect/garmin-squash) | Source code of Squash App for Garmin activity trackers. | 2023‑10‑06  | ⭐18 | 662 | | [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 🗄️ | ⭐80 | 663 | | [fenix-calculator](https://github.com/csekri/fenix-calculator) | Scientific calculator for Garmin watches | 2023‑06‑03  | ⭐8 | 664 | | [waypoints-app](https://github.com/danielsiwiec/waypoints-app) | Easily send waypoints from Google Maps to your device. No registration required! | 2023‑04‑11 🗄️ | ⭐13 | 665 | | [CockpitOnlineGarminClient](https://github.com/mrohmer/CockpitOnlineGarminClient) | Garmin Watch Client for Cockpit XP Online via cockpit-online.rohmer.rocks | 2022‑12‑18  | | 666 | | [connectiq-app-glidersk](https://github.com/cedric-dufour/connectiq-app-glidersk) | The Glider Swiss Knife for Garmin ConnectIQ devices [GPLv3] | 2022‑12‑07  | ⭐6 | 667 | | [ciq-hiit-tracker](https://github.com/werkkrew/ciq-hiit-tracker) | Orange Theory Fitness - Garmin Connect IQ App | 2022‑12‑02  | ⭐8 | 668 | | [ciq-orange-theory](https://github.com/werkkrew/ciq-orange-theory) | Orange Theory Fitness - Garmin Connect IQ App | 2022‑12‑02  | ⭐8 | 669 | | [Meditate](https://github.com/vtrifonov-esfiddle/Meditate) | Meditation app for Garmin smartwatches | 2022‑11‑15  | ⭐52 | 670 | | [SailingTimer](https://github.com/spikyjt/SailingTimer) | Sailing start timer for Garmin Connect IQ | 2022‑08‑31  | ⭐9 | 671 | | [GarminSailing](https://github.com/pukao/GarminSailing) | Sailing app for connectIQ Garmin | 2022‑07‑27  | ⭐5 | 672 | | [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 | 673 | | [hassiq](https://github.com/alanfischer/hassiq) | Home Assistant interface for Garmin's Connect IQ Platform | 2022‑06‑11  | ⭐114 | 674 | | [brandon-garmin](https://github.com/brandon-rhodes/brandon-garmin) | Simple Garmin apps for backcountry navigation | 2022‑05‑11  | ⭐2 | 675 | | [virtual_sailing](https://github.com/valgit/virtual_sailing) | virtual sailing garmin app | 2022‑04‑25  | ⭐1 | 676 | | [EggTimer](https://github.com/pedlarstudios/EggTimer) | A simple timer application for Garmin devices using the Connect IQ framework | 2022‑03‑26  | ⭐9 | 677 | | [Ballistics](https://github.com/mikkosh/Ballistics) | Ballistics is a bullet ballistic calculator application built with Connect IQ for Garmin devices | 2022‑02‑11  | ⭐1 | 678 | | [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 | 679 | | [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  | | 680 | | [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  | | 681 | | [Timer_Garmin_Connect_IQ](https://github.com/capoaira/Timer_Garmin_Connect_IQ) | A timer App for Garmin Smartwatch | 2021‑09‑24  | | 682 | | [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 | 683 | | [Horizontal-speedo-rep](https://github.com/dazey77/Horizontal-speedo-rep) | Garmin 66 Horizontal speedo | 2021‑08‑12  | | 684 | | [Connect-IQ-App-Compass](https://gitlab.com/ravenfeld/Connect-IQ-App-Compass) | Compass | 2021‑06‑20  | | 685 | | [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 | 686 | | [GarminCallControls](https://github.com/n-lahmi/GarminCallControls) | Allows you to controls ongoing calls from your Garmin smart watch/device | 2021‑03‑10  | ⭐3 | 687 | | [MapOfflineGPS](https://github.com/tskf/MapOfflineGPS) | Map around current position - Connect IQ - DataField | 2021‑02‑16  | ⭐4 | 688 | | [TestHrv](https://github.com/vtrifonov-esfiddle/TestHrv) | Heart rate variability app for Garmin smartwatches | 2021‑01‑13  | ⭐50 | 689 | | [GarMenu_GarminConnectIQApp](https://github.com/KatieXC/GarMenu_GarminConnectIQApp) | | 2020‑12‑24  | ⭐2 | 690 | | [ebikeApp](https://github.com/MarkusDatgloi/ebikeApp) | An app allowing Garmin watches to show information about a Shimano STEPS ebike. | 2020‑11‑26  | ⭐4 | 691 | | [whats-the-score](https://github.com/KieranDotCo/whats-the-score) | Forerunner 230 app for tracking a simple score. | 2020‑10‑15  | | 692 | | [Ticker](https://github.com/forsb/Ticker) | Garmin watch app for simple sail race timing | 2020‑08‑25  | ⭐1 | 693 | | [Connect-IQ-Work-Timer](https://github.com/weavercm/Connect-IQ-Work-Timer) | Allows you to keep track of your work time | 2020‑08‑18  | | 694 | | [garmin_app](https://github.com/Siratigui/garmin_app) | | 2020‑08‑15  | | 695 | | [garmin](https://github.com/Tkadla-GSG/garmin) | Collection of apps for Garmin wearable hardware written in Monkey C | 2020‑08‑13  | ⭐6 | 696 | | [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  | | 697 | | [SimonGame](https://github.com/eferreyr/SimonGame) | | 2020‑08‑07  | ⭐1 | 698 | | [Garmin-App](https://github.com/ROSENET-BTU/Garmin-App) | Mobile App for Garmin Forerunner 235 | 2020‑08‑02  | | 699 | | [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 | 700 | | [GarminSailing](https://github.com/valgit/GarminSailing) | Sailing App for Garmin Connect IQ | 2020‑07‑23  | ⭐1 | 701 | | [ConnectIQ-LIFX](https://github.com/cfculhane/ConnectIQ-LIFX) | ConnectIQ app to control LIFX smart lights | 2020‑07‑12  | ⭐2 | 702 | | [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  | | 703 | | [NotifyApp](https://github.com/toskaw/NotifyApp) | Notify App | 2020‑07‑03  | ⭐2 | 704 | | [ConnectIqSailingApp](https://github.com/alexphredorg/ConnectIqSailingApp) | Sailing App for Garmin's ConnectIQ system | 2020‑06‑30  | ⭐15 | 705 | | [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 | 706 | | [tabataTimer](https://github.com/danielsiwiec/tabataTimer) | A tabata timer for garmin watches | 2020‑06‑15  | ⭐10 | 707 | | [TackingMaster](https://github.com/SverreWisloff/TackingMaster) | A sailing-app for Garmin watch | 2020‑06‑06  | ⭐14 | 708 | | [garmin-inline-skating](https://github.com/sw-samuraj/garmin-inline-skating) | Garmin Connect IQ app for tracking of Inline Skating. | 2020‑05‑25  | ⭐1 | 709 | | [connectiq-islamic-calendar](https://github.com/slipperybee/connectiq-islamic-calendar) | | 2020‑05‑01  | | 710 | | [connectiq-jewish-calendar](https://github.com/slipperybee/connectiq-jewish-calendar) | | 2020‑05‑01  | ⭐3 | 711 | | [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 | 712 | | [WeatherApp](https://github.com/valgit/WeatherApp) | Weather Appfor Garmin Watches | 2020‑04‑07  | | 713 | | [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  | | 714 | | [CPR-Timer](https://github.com/lukasbeckercode/CPR-Timer) | A Garmin Connect App for CPR | 2020‑01‑07  | | 715 | | [CatFacts](https://github.com/Tamarpe/CatFacts) | A garmin widget that generates cat facts to your watch | 2019‑10‑23  | | 716 | | [uPaddle](https://github.com/quickdk/uPaddle) | Code for the Garmin Connect IQ uPaddle app | 2019‑10‑20  | ⭐1 | 717 | | [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  | ⭐5 | 718 | | [ShopListApp](https://github.com/jimmycaille/ShopListApp) | Garmin watch app/activity | 2019‑02‑02  | ⭐1 | 719 | | [ManualHR](https://github.com/harknus/ManualHR) | Source code for the ConnectIQ app Manual HR - primarily designed for Fenix 3 | 2018‑12‑24  | | 720 | | [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  | | 721 | | [sos-now](https://github.com/derjust/sos-now) | ConnectIQ S.O.S. app for Garmin Watches | 2018‑11‑25  | | 722 | | [nThlon](https://github.com/danisik/nThlon) | Semestrální práce z předmětu KIV/ZSWI | 2018‑10‑20  | | 723 | | [Garmin_pomodoro](https://github.com/sohaeb/Garmin_pomodoro) | SImple Timer app for Garmin Watch Forerunner 235 | 2018‑10‑04  | | 724 | | [CIQChecklist](https://github.com/jravey7/CIQChecklist) | Create executable checklists for Garmin smart watches using your phone | 2018‑09‑16  | | 725 | | [connect-iq-totp](https://github.com/pchng/connect-iq-totp) | Garmin Connect IQ TOTP App (PoC) | 2018‑08‑21  | ⭐1 | 726 | | [rep_track_react_native](https://github.com/anickle060193/rep_track_react_native) | | 2018‑08‑11  | | 727 | | [connectiq-ido](https://github.com/IrishMarineInstitute/connectiq-ido) | An Integrated Digital Ocean app on the ConnectIQ platform | 2018‑06‑05  | | 728 | | [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  | | 729 | | [fitnessTimer](https://github.com/danielsiwiec/fitnessTimer) | Fitness timer | 2018‑04‑20  | ⭐2 | 730 | | [garmin-otp-generator](https://github.com/simonseo/garmin-otp-generator) | Simple OTP Generator for Garmin watches in Monkey C | 2018‑04‑13  | | 731 | | [BitcoinWatcher](https://github.com/iuliux/BitcoinWatcher) | Connect IQ app for Garmin watches | 2018‑02‑28  | ⭐2 | 732 | | [Stretch](https://github.com/HerrRiebmann/Stretch) | Timer-App for stretching | 2017‑12‑13  | ⭐6 | 733 | | [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 | 734 | | [commute-tracker](https://github.com/gatkin/commute-tracker) | Source code for the Commute Tracker Garmin Connect IQ wearable app | 2017‑11‑19  | ⭐18 | 735 | | [Garmin-Sudoku-Watch-App](https://github.com/singh144401/Garmin-Sudoku-Watch-App) | Sodoku App for Garmin Smart Watch - Published in Connect IQ App store - Monkey C | 2017‑08‑02  | ⭐1 | 736 | | [connectiq-watchapps](https://github.com/johnnyw3/connectiq-watchapps) | My Things For Garmin Connect IQ | 2017‑05‑29  | ⭐10 | 737 | | [ConnectIQ](https://github.com/hansiglaser/ConnectIQ) | Collection of Garmin Connect IQ apps | 2017‑04‑29  | ⭐17 | 738 | | [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 | 739 | | [SportMonitor](https://github.com/matmuc/SportMonitor) | Sport Monitor App for Garmin Fenix 3 Watches (Connect IQ) | 2017‑02‑06  | | 740 | | [DerbyLaps](https://github.com/sarahemm/DerbyLaps) | App for Garmin ConnectIQ watches to do pacing for roller derby lap skating. | 2016‑12‑10  | ⭐1 | 741 | | [garminIQ_HRonly](https://github.com/shprung/garminIQ_HRonly) | vivoActive HR app to show and broadcast HR only | 2016‑11‑18  | ⭐3 | 742 | | [FindTreasure](https://github.com/hupei1991/FindTreasure) | Garmin Connect 2014 Coding Showcase project based on Monkey C Programming Language | 2016‑11‑05  | | 743 | | [2048-iq](https://github.com/breber/2048-iq) | 2048 for ConnectIQ | 2016‑08‑09  | ⭐9 | 744 | | [timebomb](https://github.com/danielsiwiec/timebomb) | Timebomb game for garmin | 2016‑05‑10  | | 745 | | [TriathlonDuathlonAquathlon](https://github.com/lucamrod/TriathlonDuathlonAquathlon) | Code for Triathlon, Aquathlon & Duathlon APP for Garmin watches | 2016‑05‑07  | ⭐3 | 746 | | [kraken](https://github.com/dkappler/kraken) | garmin forerunner 235 app for heart rate tracking | 2016‑03‑30  | ⭐1 | 747 | | [ultitimer](https://github.com/zbraniecki/ultitimer) | Connect IQ app for interval training | 2016‑02‑09  | | 748 | | [HRV_iq](https://github.com/sharkbait-au/HRV_iq) | My HRV app for Garmin Connect IQ | 2016‑01‑29  | ⭐23 | 749 | | [Fenix3GolfDistance](https://github.com/eriklupander/Fenix3GolfDistance) | App for Garmin Fenix 3 for showing golf distance and hole info | 2015‑06‑28  | ⭐6 | 750 | | [connectiq-apps](https://github.com/blackdogit/connectiq-apps) | Connect IQ Apps by Black Dog IQ | 2015‑04‑13  | ⭐14 | 751 | | [nest-iq](https://github.com/breber/nest-iq) | ConnectIQ app to control Nest thermostat | 2015‑03‑29  | ⭐2 | 752 | | [connectiq-packman](https://github.com/frenchtoast747/connectiq-packman) | Classic arcade style for your running/biking world. | 2014‑12‑30  | ⭐6 | 753 | | [Garmin42](https://github.com/igorso/Garmin42) | Garmin Show Down @ UNL | 2014‑11‑17  | | 754 | | [GarminApps](https://github.com/sjager/GarminApps) | Apps created for the 11/15/2014 Garmin Programming Competition | 2014‑11‑15  | | 755 | | [GolfApp](https://github.com/Cybermite/GolfApp) | Garmin connect iq competition | 2014‑10‑25  | | 756 | | [helicopter-iq](https://github.com/breber/helicopter-iq) | Helicopter game for Garmin | 2014‑10‑19  | | 757 | 758 | 759 |
760 | 761 | ## Audio content providers 762 | 763 | [Audio content providers]. Garmin media enabled devices are designed for active 764 | lifestyle users who want to listen to music without carrying their phone on 765 | their rides, runs or other activities. The media player allows the user to 766 | listen to their music, podcasts, and audio-books on the go. 767 | 768 | | Name | Description | Last updated | Stars | 769 | | ---- | ----------- | ----------------- | ----- | 770 | | [SubMusic](https://github.com/memen45/SubMusic) | Sync music and podcasts to your Garmin watch from your own SubSonic or Ampache server | 2024‑01‑30  | ⭐151 | 771 | 772 | 773 | ## Barrels 774 | 775 | Developers can create custom Monkey C libraries, called [Monkey Barrels], that 776 | contain source code and resource information that are easily shared across 777 | Connect IQ Projects. 778 | 779 | | Name | Description | Last updated | Stars | 780 | | ---- | ----------- | ----------------- | ----- | 781 | | [ciqtools-cryptography](https://github.com/douglasr/ciqtools-cryptography) | An attempt to streamline the use of the Connect IQ Cryptography library | 2025‑11‑12  | ⭐2 | 782 | | [msgpack-monkeyc](https://github.com/douglasr/msgpack-monkeyc) | MessagePack for MonkeyC (Connect IQ) / msgpack.org[Monkey C] | 2025‑11‑04  | ⭐5 | 783 | | [garmin-touch-keypad](https://github.com/bombsimon/garmin-touch-keypad) | A barrel to display a numpad and read user input | 2025‑06‑29  | ⭐2 | 784 | | [ciqtools-number-picker](https://github.com/douglasr/ciqtools-number-picker) | Number picker barrel | 2025‑06‑17  | ⭐6 | 785 | | [navutils](https://github.com/bostonrwalker/navutils) | Utilities for building navigation apps in MonkeyC. | 2025‑04‑28  | | 786 | | [ANTPlusHeartStrap](https://github.com/mannyray/ANTPlusHeartStrap) | Code for connecting your ANT+ heart strap to your garmin watch | 2025‑03‑11  | | 787 | | [GarminBytePacking](https://github.com/mannyray/GarminBytePacking) | Garmin library that adds functions for manipulating ByteArrays, Floats, Doubles and Longs | 2025‑02‑27  | | 788 | | [OPN-MonkeyC](https://gitlab.com/waterkip/opn-monkeyc) | A MonkeyC Barrel for OPN / Waterkip projects | 2025‑01‑31  | ⭐1 | 789 | | [ciqtools-graphing](https://github.com/douglasr/ciqtools-graphing) | A clone of the graphing functionality present within Garmin devices natively | 2024‑05‑09  | ⭐5 | 790 | | [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 | 791 | | [WidgetBarrel](https://github.com/hurenkam/WidgetBarrel) | Widgets and drawing primitives library for Garmin Connect IQ Watch Faces | 2023‑10‑27  | ⭐10 | 792 | | [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 | 793 | | [CriticalMapsAPIBarrel](https://github.com/britiger/CriticalMapsAPIBarrel) | CriticalMapsAPI Monkey C Barrel for ConnectIQ | 2020‑10‑24  | ⭐2 | 794 | | [ConnectIqDataPickers](https://github.com/vtrifonov-esfiddle/ConnectIqDataPickers) | Garmin Connect IQ data picker barrels | 2018‑03‑17  | ⭐11 | 795 | 796 | 797 | ## Companion apps 798 | 799 | | Name | Description | Last updated | Stars | 800 | | ---- | ----------- | ----------------- | ----- | 801 | | [Handsfree](https://github.com/grigorye/Handsfree) | Make your phone calls from Garmin watch | 2025‑10‑24  | ⭐10 | 802 | | [gimporter](https://github.com/gimportexportdevs/gimporter) | Garmin Connect App to import GPX and FIT files | 2025‑10‑03  | ⭐28 | 803 | | [garmin](https://github.com/buessow/garmin) | Glucose displays for Garmin devices. | 2025‑08‑28  | ⭐9 | 804 | | [gexporter](https://github.com/gimportexportdevs/gexporter) | Android App to export GPX and FIT to garmin devices | 2025‑08‑04  | ⭐29 | 805 | | [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  | ⭐55 | 806 | | [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  | ⭐14 | 807 | | [Unquestionify-android](https://github.com/starryalley/Unquestionify-android) | Android companion app for Garmin Connect IQ watchapp: Unquestionify | 2023‑11‑23  | ⭐4 | 808 | | [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 | 809 | | [Companion.Garmin](https://github.com/Wheellog/Companion.Garmin) | A WheelLog companion for Garmin smartwatches | 2022‑02‑14 🗄️ | ⭐4 | 810 | | [Onewheel2Garmin](https://github.com/kite247/Onewheel2Garmin) | See the battery status of your Onewheel on a Garmin watch | 2020‑07‑04  | ⭐14 | 811 | | [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 | 812 | | [SensorTriggerIQ](https://github.com/Cougargriff/SensorTriggerIQ) | Companion watch app for Sensor Triggers | 2019‑03‑24  | | 813 | | [OBD2Reader](https://github.com/robertmpowell/OBD2Reader) | Hack ISU fall 2017 OBD2 reader Android and Garmin Connect IQ app. | 2017‑10‑22  | ⭐1 | 814 | 815 | 816 | ## Tools 817 | 818 | | Name | Description | Last updated | Stars | 819 | | ---- | ----------- | ----------------- | ----- | 820 | | [fit](https://github.com/muktihari/fit) | A FIT SDK for decoding and encoding Garmin FIT files in Go supporting FIT Protocol V2. | 2025‑11‑24  | ⭐123 | 821 | | [garmin-dev-tools](https://github.com/flocsy/garmin-dev-tools) | Tools for Garmin CIQ developers | 2025‑11‑24  | ⭐18 | 822 | | [garth](https://github.com/matin/garth) | Garmin SSO auth + Connect Python client | 2025‑11‑21  | ⭐655 | 823 | | [connectiq-sdk-manager](https://github.com/pcolby/connectiq-sdk-manager) | Garmin's Connect IQ SDK Manager as an AppImage | 2025‑11‑20  | ⭐12 | 824 | | [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 | 2025‑11‑17  | ⭐2415 | 825 | | [fit](https://github.com/lindig/fit) | Minimal OCaml library to parse Garmin FIT files | 2025‑11‑17  | ⭐8 | 826 | | [garmin-connectiq-release-action](https://github.com/blackshadev/garmin-connectiq-release-action) | Github action to release / export a garmin ConnectIQ app | 2025‑11‑14  | ⭐2 | 827 | | [fit-rust](https://github.com/zzyandzzy/fit-rust) | fit-rust is a Rust library designed for reading, writing, and merging FIT protocol files. | 2025‑11‑12  | ⭐11 | 828 | | [export2garmin](https://github.com/RobertWojtowicz/export2garmin) | Export Mi - Xiaomi scale & Omron data to Garmin Connect | 2025‑11‑11  | ⭐241 | 829 | | [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. | 2025‑11‑10  | ⭐2762 | 830 | | [share-your-garmin-workout](https://github.com/fulippo/share-your-garmin-workout) | Chrome extension to share your Garmin Connect workout with your friends | 2025‑11‑10  | ⭐20 | 831 | | [GarminSportsDev](https://github.com/flocsy/GarminSportsDev) | App for CIQ developers to examine SPORT and SUB_SPORT values | 2025‑10‑15  | ⭐2 | 832 | | [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‑09‑22  | ⭐7 | 833 | | [prettier-extension-monkeyc](https://github.com/markw65/prettier-extension-monkeyc) | A VSCode extension for Garmin MonkeyC | 2025‑08‑07  | ⭐17 | 834 | | [monkeyc-optimizer](https://github.com/markw65/monkeyc-optimizer) | Utilities for optimizing monkeyc projects | 2025‑08‑07  | ⭐15 | 835 | | [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) | 2025‑07‑11  | ⭐20 | 836 | | [connectiq-tester](https://github.com/DavidBaddeley/connectiq-tester) | Fork of `connectiq-tester` with screenshot support | 2025‑06‑25  | ⭐3 | 837 | | [fitparse-rs](https://github.com/stadelmanma/fitparse-rs) | Rust library to parse FIT formatted files | 2025‑06‑10  | ⭐71 | 838 | | [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  | ⭐6 | 839 | | [GarminMonkeyCBoilerPlate](https://github.com/cyberang3l/GarminMonkeyCBoilerPlate) | Boilerplate with makefile to quickly start new projects | 2025‑03‑20  | | 840 | | [GarminSettingsFileParser](https://github.com/cyberang3l/GarminSettingsFileParser) | A script to read/write GARMIN.SET files | 2025‑03‑15  | | 841 | | [dithering-converter](https://github.com/himanushi/dithering-converter) | Garmin AMOLED to MIP Image Conversion Tool | 2025‑03‑05  | ⭐1 | 842 | | [prettier-plugin-monkeyc](https://github.com/markw65/prettier-plugin-monkeyc) | A prettier plugin for Garmin monkey-c | 2025‑01‑28  | ⭐15 | 843 | | [vim-monkey-c](https://github.com/cyberang3l/vim-monkey-c) | Vim syntax for Monkey C language. | 2025‑01‑23  | | 844 | | [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  | ⭐2 | 845 | | [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  | | 846 | | [flowfit](https://github.com/hacdias/flowfit) | Convert Bosch's eBike Flow FIT file into a FIT file that can be imported by other tools. | 2024‑06‑25  | ⭐4 | 847 | | [connectiq-app-rawlogger](https://github.com/cedric-dufour/connectiq-app-rawlogger) | RawLogger (Garmin ConnectIQ) App [GPLv3] | 2024‑05‑30  | ⭐9 | 848 | | [action-connectiq-tester](https://github.com/matco/action-connectiq-tester) | GitHub action for `connectiq-tester` | 2024‑05‑13  | ⭐6 | 849 | | [ciqdb](https://github.com/pzl/ciqdb) | Connect IQ (PRG) parser and debugger | 2024‑04‑20  | ⭐37 | 850 | | [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  | ⭐48 | 851 | | [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 | 852 | | [MonkeyInject](https://github.com/gcaufield/MonkeyInject) | A dependency injection framework for Connect IQ | 2023‑04‑04 🗄️ | ⭐1 | 853 | | [directive-preprocessor](https://github.com/maca88/directive-preprocessor) | A preprocessor for basic directives written in Node.js | 2022‑01‑14  | ⭐1 | 854 | | [kumitateru](https://github.com/ggoraa/kumitateru) | Build system for Garmin ConnectIQ. Simple, fast, powerful! | 2022‑01‑03 🗄️ | ⭐11 | 855 | | [MonkeyPack](https://github.com/gcaufield/MonkeyPack) | A github release driven ConnectIQ Package Manager | 2020‑11‑03  | ⭐1 | 856 | | [MonkeyTest](https://github.com/gcaufield/MonkeyTest) | A ConnectIQ Testing and Mocking framework. | 2020‑10‑18  | | 857 | | [MonkeyContainer](https://github.com/gcaufield/MonkeyContainer) | A Docker Image for headless Connect IQ Development | 2020‑10‑02  | ⭐4 | 858 | | [connectiq-monkeyc](https://github.com/blackdogit/connectiq-monkeyc) | Various tools for Garmin Connect IQ | 2015‑03‑28  | ⭐14 | 859 | | [BM Font](https://www.angelcode.com/products/bmfont) | This program will allow you to generate bitmap fonts from TrueType fonts |   | 860 | | [VS Code Monkey C](https://marketplace.visualstudio.com/items?itemName=garmin.monkey-c) | Official VS Code extension for Monkey C |   | 861 | 862 | 863 | ## Miscellaneous 864 | 865 | | Name | Description | Last updated | Stars | 866 | | ---- | ----------- | ----------------- | ----- | 867 | | [home-assistant-garmin_connect](https://github.com/cyberjunky/home-assistant-garmin_connect) | The Garmin Connect integration allows you to expose data from Garmin Connect to Home Assistant. | 2025‑11‑24  | ⭐386 | 868 | | [VibraTest](https://github.com/flocsy/VibraTest) | vibration and tone tester for Garmin developers | 2025‑10‑15  | | 869 | | [Insta360-Remote-CIQ](https://github.com/arsfabula/Insta360-Remote-CIQ) | Garmin Connect IQ Remote for Insta360 Cameras | 2025‑09‑09  | ⭐7 | 870 | | [Inreach-Mapshare](https://github.com/OpenGIS/Inreach-Mapshare) | Display your live inReach MapShare data on your WordPress Site | 2025‑08‑20  | ⭐10 | 871 | | [garmin](https://github.com/acrossthekyle/garmin) | Collection of projects created over the years for Garmin watches. | 2025‑08‑19  | ⭐8 | 872 | | [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. | 2025‑06‑20  | ⭐4277 | 873 | | [garmin-workouts](https://github.com/mkuthan/garmin-workouts) | Command line tool for managing Garmin workouts. | 2025‑04‑14  | ⭐105 | 874 | | [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  | ⭐3 | 875 | | [workspace-ConnectIQ](https://github.com/rbsexton/workspace-ConnectIQ) | Garmin Connect IQ Apps | 2025‑02‑11  | ⭐6 | 876 | | [connectiq-apps](https://github.com/garmin/connectiq-apps) | A collection of Connect IQ apps. | 2025‑01‑08  | ⭐548 | 877 | | [MonkeyAOC](https://github.com/YAWNICK/MonkeyAOC) | [Advent of Code](https://adventofcode.com) in Monkey C | 2024‑12‑03  | ⭐4 | 878 | | [connect-iq](https://github.com/AndrewKhassapov/connect-iq) | Creating a Garmin watch-face 101 | 2024‑11‑14  | ⭐58 | 879 | | [NextMatchReminder](https://github.com/ZachXu/NextMatchReminder) | Garmin Application including WatchFace project ,Widget project and a share lib which synchronizing data | 2024‑10‑14  | ⭐1 | 880 | | [garmin-complicate-circle](https://github.com/sunpazed/garmin-complicate-circle) | An example application that demonstrates system6 complications | 2024‑08‑30  | ⭐5 | 881 | | [garmin-complicate](https://github.com/sunpazed/garmin-complicate) | An example application that demonstrates system6 complications | 2024‑07‑12  | ⭐9 | 882 | | [connectiq-samples](https://github.com/douglasr/connectiq-samples) | Connect IQ sample apps, libraries and code snippets | 2024‑03‑12  | ⭐78 | 883 | | [garmin-games](https://github.com/Likenttt/garmin-games) | folked games | 2023‑08‑29  | ⭐3 | 884 | | [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  | ⭐22 | 885 | | [CIQTest](https://github.com/ekutter/CIQTest) | Garmin CIQ test projects | 2023‑03‑13  | ⭐4 | 886 | | [connectiq-sdk-docker](https://github.com/waterkip/connectiq-sdk-docker) | Containerized ConnectIQ Development Environment for Linux [free] | 2023‑03‑08  | ⭐6 | 887 | | [GarminApps](https://github.com/ferranpujolcamins/GarminApps) | A data field for Garmin devices that displays three pieces of information. | 2023‑02‑07  | ⭐1 | 888 | | [garmin-waketest](https://github.com/sunpazed/garmin-waketest) | Watchface to verify timings, and poll frequency of `onUpdate()` | 2022‑12‑01  | ⭐6 | 889 | | [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 | 890 | | [ConnectIQ](https://github.com/fagalto/ConnectIQ) | Collection of ConnectIQ apps | 2021‑09‑03  | ⭐1 | 891 | | [garmin-connectiq](https://github.com/jstringer1/garmin-connectiq) | Bits a pieces of monkeyc written for my garmin fenix 5 plus. | 2020‑12‑31  | ⭐5 | 892 | | [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 | 893 | | [garmin-conect](https://github.com/iperformance/garmin-conect) | A collection of Connect IQ apps and libraries | 2019‑10‑10  | ⭐1 | 894 | | [connectiq](https://github.com/Peterdedecker/connectiq) | Garmin Connect IQ Sample Projects | 2019‑03‑26  | ⭐43 | 895 | | [connectiq-PowerFieldTests](https://github.com/creacominc/connectiq-PowerFieldTests) | unit tests for connectiq-PowerField | 2017‑10‑22  | | 896 | | [garmin-ciqsummit17](https://github.com/sunpazed/garmin-ciqsummit17) | A basic widget that displays tweets from #ciqsummit17 | 2017‑04‑23  | ⭐2 | 897 | | [vim-monkey-c](https://github.com/klimeryk/vim-monkey-c) | Vim syntax for Monkey C language. | 2017‑04‑09  | ⭐7 | 898 | | [garmin-public](https://github.com/Shmuma/garmin-public) | Opensource for Garmin devices | 2015‑05‑13  | ⭐4 | 899 | | [Connect IQ developer forum](https://forums.garmin.com/developer/connect-iq) | Forum to talk anything Connect IQ related |   | 900 | | [Official Garmin developer site](https://developer.garmin.com/connect-iq/overview) | Information about Garmin development and the Monkey C language |   | 901 | | [Watch Face Builder](https://garmin.watchfacebuilder.com) | Build (or download) watch faces in the browser |   | 902 | 903 | 904 | [awesome-toml]: ./awesome-generator/awesome.toml 905 | [Watch faces]: https://developer.garmin.com/connect-iq/connect-iq-basics/app-types/#watchfaces 906 | [Monkey C]: https://developer.garmin.com/connect-iq/monkey-c/ 907 | [Data fields]: https://developer.garmin.com/connect-iq/connect-iq-basics/app-types/#datafields 908 | [Widgets]: https://developer.garmin.com/connect-iq/connect-iq-basics/app-types/#widgets 909 | [Device Apps]: https://developer.garmin.com/connect-iq/connect-iq-basics/app-types/#deviceapps 910 | [Audio content providers]: https://developer.garmin.com/connect-iq/connect-iq-basics/app-types/#audiocontentproviders 911 | [Monkey Barrels]: https://developer.garmin.com/connect-iq/core-topics/shareable-libraries/ 912 | 913 | --------------------------------------------------------------------------------