{"id":46661103,"url":"https://github.com/skuethe/grafana-oss-team-sync","last_synced_at":"2026-04-21T22:07:19.165Z","repository":{"id":301181437,"uuid":"977128011","full_name":"skuethe/grafana-oss-team-sync","owner":"skuethe","description":"FOSS tool to sync teams, users and folders from different sources to Grafana without the need for an enterprise license","archived":false,"fork":false,"pushed_at":"2026-04-14T21:23:00.000Z","size":679,"stargazers_count":15,"open_issues_count":13,"forks_count":2,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-04-14T23:37:54.887Z","etag":null,"topics":["entraid","grafana","grafana-oss","sync","team-sync"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/skuethe.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-05-03T13:43:10.000Z","updated_at":"2026-04-14T21:21:38.000Z","dependencies_parsed_at":"2025-07-10T22:14:42.137Z","dependency_job_id":"20422e44-41ae-47e5-a11c-0ce34b64312e","html_url":"https://github.com/skuethe/grafana-oss-team-sync","commit_stats":null,"previous_names":["skuethe/grafana-oss-team-sync"],"tags_count":23,"template":false,"template_full_name":null,"purl":"pkg:github/skuethe/grafana-oss-team-sync","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skuethe%2Fgrafana-oss-team-sync","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skuethe%2Fgrafana-oss-team-sync/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skuethe%2Fgrafana-oss-team-sync/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skuethe%2Fgrafana-oss-team-sync/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/skuethe","download_url":"https://codeload.github.com/skuethe/grafana-oss-team-sync/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skuethe%2Fgrafana-oss-team-sync/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32112083,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-21T11:25:29.218Z","status":"ssl_error","status_checked_at":"2026-04-21T11:25:28.499Z","response_time":128,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["entraid","grafana","grafana-oss","sync","team-sync"],"created_at":"2026-03-08T11:06:37.896Z","updated_at":"2026-04-21T22:07:19.158Z","avatar_url":"https://github.com/skuethe.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!--\nSPDX-FileCopyrightText: 2025 Sebastian Küthe and (other) contributors to project grafana-oss-team-sync \u003chttps://github.com/skuethe/grafana-oss-team-sync\u003e\nSPDX-License-Identifier: GPL-3.0-or-later\n--\u003e\n\n\u003cdiv id=\"top\"\u003e\u003c/div\u003e\n\n\u003c!-- PROJECT LOGO --\u003e\n\u003cbr /\u003e\n\u003cdiv align=\"center\"\u003e\n  \u003c!--\n  \u003ca href=\"https://github.com/skuethe/grafana-oss-team-sync\"\u003e\n    \u003cimg src=\"images/logo.png\" alt=\"Logo\" width=\"80\" height=\"80\"\u003e\n  \u003c/a\u003e\n  --\u003e\n  \u003ch1 align=\"center\"\u003e\u003cstrong\u003eGrafana OSS Team Sync\u003c/strong\u003e\u003c/h1\u003e\n  \u003cp align=\"center\"\u003e\n    \u003ca href=\"https://github.com/skuethe/grafana-oss-team-sync/issues/new?template=bug_report.md\"\u003eReport a Bug\u003c/a\u003e\n    ·\n    \u003ca href=\"https://github.com/skuethe/grafana-oss-team-sync/issues/new?template=feature_request.md\"\u003eRequest a Feature\u003c/a\u003e\n    \u003cbr/\u003e\n    \u003cbr/\u003e\n\n\u003c!-- PROJECT SHIELDS --\u003e\n[![Go Report Card][goreportcardbadge]][goreportcardlink]\n[![REUSE status][reusebadge]][reuselink]\n![GitHub License][githublicensebadge]\n\n\n\n  \u003c/p\u003e\n\u003c/div\u003e\n\n\u003c!-- TABLE OF CONTENTS --\u003e\n\u003cdetails\u003e\n  \u003csummary\u003eTable of Contents\u003c/summary\u003e\n  \u0026nbsp;\n  \u003cul\u003e\n    \u003cli\u003e\u003ca href=\"#about-the-project\"\u003eAbout The Project\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#requirements\"\u003eRequirements\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#installation\"\u003eInstallation\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#configuration\"\u003eConfiguration\u003c/a\u003e\u003c/li\u003e\n      \u003cul\u003e\n        \u003cli\u003e\u003ca href=\"#grafana\"\u003eGrafana\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#source-entraid\"\u003eSource: EntraID\u003c/a\u003e\u003c/li\u003e\n      \u003c/ul\u003e\n    \u003cli\u003e\u003ca href=\"#opinionated-behaviour\"\u003eOpinionated Behaviour\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#build-it-yourself\"\u003eBuild It Yourself\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#contributing\"\u003eContributing\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#versioning\"\u003eVersioning\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#license\"\u003eLicense\u003c/a\u003e\u003c/li\u003e\n  \u003c/ul\u003e\n\u003c/details\u003e\n\u003cbr/\u003e\n\n\n\n\u003c!-- ABOUT THE PROJECT --\u003e\n## About The Project\n\nI created this project to get into Go development and as such, it is probably far from being perfect. Keep an open mind to that and feel free to [contribute](#contributing) if you want to optimize or extend its functionality.  \n\nThe idea is to use `grafana-oss-team-sync` as an FOSS tool to create **teams**, **users** and even **folders** in Grafana and keep them (and their permissions) in sync with a configured source.  \nThis functionality _does_ exist in Grafana itself (\"Team Sync\"), but is a is an [enterprise feature][enterprisefeature] and as such only usable with an appropriate license key.\n\nSources are internally set-up as plug-ins, which can be easily extended to others in the future.  \nCurrently the following sources are supported:  \n- **Entra ID** (formerly \"Azure Active Directory\")\n\n\n\u003c!-- ABOUT THE PROJECT - CURRENT FEATURE LIST --\u003e\n### Current feature list\n\nThe list of features include:  \n\n- search your `source` for specific `groups` and create them as `teams` in your Grafana instance\n- (optional) create `users` from each configured source group\n- (optional) create `folders` from config input and add groups to the `permission` list as either a `viewer`, `editor` or `admin` role\n\n\n\u003c!-- ABOUT THE PROJECT - POSSIBLE FUTURE IMPROVEMENTS --\u003e\n### Possible future improvements\n\nThings which potentially will be added in the future:\n\n- allow to reference `users` on folder permissions\n- allow to reference `roles` on folder permissions\n- allow to assign `admin` permissions to team members\n- **delete** users and groups when removed from the source / sync list\n\n\u003cp align=\"right\"\u003e( \u003ca href=\"#top\"\u003eBack to top\u003c/a\u003e )\u003c/p\u003e\n\n\n\n\u003c!-- REQUIREMENTS --\u003e\n## Requirements\n\nIn it's current state, only `Microsoft Entra ID` is available as a source for groups and users.  \nThe idea is to add new sources in the future as a \"plug-in\" feature.  \nFeel free to contribute your desired source.\n\nThis tool works with Grafana versions `\u003e=11.1.0`.  \nWe are running tests against versions `v11.1.0`, `v12.0.0`, `v13.0.0` and `latest`  \n\n\u003cp align=\"right\"\u003e( \u003ca href=\"#top\"\u003eBack to top\u003c/a\u003e )\u003c/p\u003e\n\n\n\n\u003c!-- INSTALLATION --\u003e\n## Installation\n\nThere are multiple ways of using this tool. The easiest option would be to use the ready-to-go container image which is automatically uploaded as a [package to this repository][githubpackagelink] on GitHub. It is currently available for architectures `linux/amd64` as well as `linux/arm64`.  \nYou can start evaluating by using the `latest` tag and then switch to a release version. Just have a look at available tags in the package linked above.  \nExample:\n```script\npodman pull ghcr.io/skuethe/grafana-oss-team-sync:latest\n```\n\nAs an alternative, you can download your favourite (linux) binary which is attached to each release. Have a look at the [latest release][githublatestrelease] to find your preferred one (currently building `apk`, `deb` and `rpm` for both `linux/amd64` as well as `linux/arm64`).  \n\nIf you are still missing your installation method or OS architecture of choice, you can either [Build It Yourself](#build-it-yourself), or open a PR with an enhancement to the build-process (goreleaser).\n\n\u003cp align=\"right\"\u003e( \u003ca href=\"#top\"\u003eBack to top\u003c/a\u003e )\u003c/p\u003e\n\n\n\n\u003c!-- CONFIGURATION --\u003e\n## Configuration\n\nThe following tool-specific configuration is available.  \nDetails on **Grafana** and **source** specific requirements can be found below.\n\nYou can configure these either in the `config.yaml`, via environment variables (starting with `GOTS_`) or via command arguments.  \nThe following hierarchy is used when merging different config sources, overriding already existing data (with the exception of the `authfile` in step 4):  \n1. The `config.yaml` you specify\n2. Environment variables set (also respecting an `.env` file)\n3. Command arguments passed\n4. (Optional) content from an `authfile`[^authfilehirarchy]\n\n[^authfilehirarchy]: We are using [godotenv][godotenv], which will **NOT** override existing environment variables.  \n\n| Configuration                     | Configuration via                                                                                                                      | Description |\n|-----------------------------------|----------------------------------------------------------------------------------------------------------------------------------------|-------------|\n| Configuration file                | **argument**: `--config` or `-c`\u003cbr\u003e**env var**: `GOTS_CONFIG`                                                                         | Define the path to your config file (required) |\n| Log level                         | **config.yaml**: `loglevel`\u003cbr\u003e**argument**: `--loglevel` or `-l`\u003cbr\u003e**env var**: `GOTS_LOGLEVEL`                                      | Define the log level\u003cbr\u003e\u003cbr\u003e**Type**: `int`\u003cbr\u003e**Allowed**: `0` (INFO), `1` (WARN), `2` (ERROR), `99` (DEBUG)\u003cbr\u003e**Default**: `0` (INFO) |\n| Source plug-in                    | **config.yaml**: `source`\u003cbr\u003e**argument**: `--source` or `-s`\u003cbr\u003e**env var**: `GOTS_SOURCE`                                            | Define the source plug-in you want to use\u003cbr\u003e\u003cbr\u003e**Type**: `string`\u003cbr\u003e**Allowed**: `entraid` |\n| Authentication file               | **config.yaml**: `authfile`\u003cbr\u003e**argument**: `--authfile`\u003cbr\u003e**env var**: `GOTS_AUTHFILE`                                              | Define an optional file to load authentication data from. File content needs to be in `.env` syntax (so `key=value` per line)\u003cbr\u003e\u003cbr\u003e**Type**: `string` |\n| Feature: disable folder sync      | **config.yaml**: `features.disableFolders`\u003cbr\u003e**argument**: `--disablefolders`\u003cbr\u003e**env var**: `GOTS_DISABLEFOLDERS`                   | Control the folder sync feature\u003cbr\u003e\u003cbr\u003e**Type**: `bool`\u003cbr\u003e**Default**: `false` |\n| Feature: disable user sync        | **config.yaml**: `features.disableUserSync`\u003cbr\u003e**argument**: `--disableusersync`\u003cbr\u003e**env var**: `GOTS_DISABLEUSERSYNC`                | Control the user sync feature\u003cbr\u003e\u003cbr\u003e**Type**: `bool`\u003cbr\u003e**Default**: `false` |\n| Feature: add local admin to teams | **config.yaml**: `features.addLocalAdminToTeams`\u003cbr\u003e**argument**: `--addlocaladmintoteams`\u003cbr\u003e**env var**: `GOTS_ADDLOCALADMINTOTEAMS` | Control adding Grafana local admin to each team\u003cbr\u003e\u003cbr\u003e**Type**: `bool`\u003cbr\u003e**Default**: `true` |\n| Team sync                         | **config.yaml**: `teams`\u003cbr\u003e**argument**: `--teams` or `-t`\u003cbr\u003e**env var**: `GOTS_TEAMS`                                               | Define the list of teams to sync\u003cbr\u003e\u003cbr\u003e**Type**: `[]string` |\n| Folder sync                       | **config.yaml**: `folders`                                                                                                             | Define the list of folders to sync\u003cbr\u003e\u003cbr\u003e**Type**: `[]interface` |\n\n\u003c!-- CONFIGURATION - GRAFANA --\u003e\n### Grafana\n\nIdeally you have [set-up SSO authentication][setupssoauth] with the same source as your group and user sync\n\n| Requirements   | |\n|--------------- |-|\n| Version        | `\u003e= 11.1.0` [^grafanaversion]  |\n| Authentication | Using either one of the [available authentication options][availableauthoptions] `basic auth` or `service account token` [^grafanatokenauth] |\n\n\n| Configuration                         | Configuration via                                                                                                | Description |\n|---------------------------------------|------------------------------------------------------------------------------------------------------------------|-------------|\n| Authentication Type                   | **config.yaml**: `grafana.authtype`\u003cbr\u003e**argument**: `--authtype`\u003cbr\u003e**env var**: `GOTS_AUTHTYPE`                | Define the authentication type to use\u003cbr\u003e\u003cbr\u003e**Type**: `string`\u003cbr\u003e**Allowed**: `basicauth`, `token`\u003cbr\u003e**Default**: `basicauth` |\n| Authentication: Basic Auth            | **argument**: `--username` and `--password` or `-u` and `-p`\u003cbr\u003e**env var**: `GOTS_USERNAME` and `GOTS_PASSWORD` | Define user name and password for basic authentication to Grafana\u003cbr\u003e**Type**: `string` |\n| Authentication: Service Account Token | **argument**: `--token` or `-t`\u003cbr\u003e**env var**: `GOTS_TOKEN`                                                     | Define token for service account token auth to Grafana\u003cbr\u003e**Type**: `string` |\n| Connection: Scheme                    | **config.yaml**: `grafana.connection.scheme`\u003cbr\u003e**argument**: `--scheme`\u003cbr\u003e**env var**: `GOTS_SCHEME`           | Define the scheme to use\u003cbr\u003e\u003cbr\u003e**Type**: `string`\u003cbr\u003e**Allowed**: `http`, `https`\u003cbr\u003e**Default**: `http` |\n| Connection: Host                      | **config.yaml**: `grafana.connection.host`\u003cbr\u003e**argument**: `--host` or `-h`\u003cbr\u003e**env var**: `GOTS_HOST`         | Define the host to use\u003cbr\u003e**Type**: `string`\u003cbr\u003e**Default**: `localhost:3000` |\n| Connection: Base Path                 | **config.yaml**: `grafana.connection.basepath`\u003cbr\u003e**argument**: `--basepath`\u003cbr\u003e**env var**: `GOTS_BASEPATH`     | Define the base path to use\u003cbr\u003e\u003cbr\u003e**Type**: `string`\u003cbr\u003e**Default**: `/api` |\n| Connection: Retry                     | **config.yaml**: `grafana.connection.retry`\u003cbr\u003e**argument**: `--retry` or `-r`\u003cbr\u003e**env var**: `GOTS_RETRY`      | Define the connection retry, waiting 2 seconds in between each.\u003cbr\u003eOnly used when the return status code equals `429` or `5xx`\u003cbr\u003e\u003cbr\u003e**Type**: `int`\u003cbr\u003e**Default**: `0` |\n\n[^grafanaversion]: Minimum Grafana version is `11.1.0` as it introduced [a new bulk team membership endpoint][newbulkendpoint] we are currently using.  \n[^grafanatokenauth]: Please note that `service account token` auth only works if you disable the `UserSync` feature, as creating new users in Grafana uses the Admin API, [which requires the usage of basicauth][requirebasicauth].\n\n\n\n\u003c!-- CONFIGURATION - ENTRAID --\u003e\n### Source: `entraid`\n\nIf you have [enabled EntraID OAuth][entraidoauth] for SSO authentication in Grafana with the same EntraID tenant, it is possible to set `allow_sign_up = false` in your [EntraID OAuth configuration options][entraidoauthconfig], so that only users which are synced by Grafana OSS Team Sync are able to log into your Grafana instance.\n\n| Requirements            | |\n|-------------------------|-|\n| Authentication          | Using Azure app via environment variables: `CLIENT_ID`, `TENANT_ID`, `CLIENT_SECRET` |\n| Application permissions | Minimum: `User.ReadBasic.All`, `GroupMember.Read.All`\u003cbr\u003eTo list the members of a hidden membership group, the `Member.Read.Hidden` permission is required |\n\n\n\u003cp align=\"right\"\u003e( \u003ca href=\"#top\"\u003eBack to top\u003c/a\u003e )\u003c/p\u003e\n\n\n\n\u003c!-- OPINIONATED BEHAVIOUR --\u003e\n## Opinionated Behaviour\n\nPlease note the following opinionated behaviour of this tool.\n\n- this tool should be the single point of truth for creating groups in Grafana. For that matter, we are enforcing the following:\n  - `Teams`: all members of each configured team are completely overridden with matching users from the source. If you added additional users or changed their permission (to \"admin\" e.g.), these changes will be lost during the next sync operation. This also helps with keeping the groups up to date with your configured source (when removing users for example)\n  - `Folders`: the permissions of each folder are completely overridden with the input from your config. If you don't want this to happen, you can always disable the folder sync feature via config / env variable or command argument\n- if the user sync feature is enabled, all newly created users will get a randomly generated password assigned. This password is not available afterwards, as it should not be used in the first place. Ideally you have [set-up SSO authentication][setupssoauth] with the same source as your group and user sync\n\n\u003cp align=\"right\"\u003e( \u003ca href=\"#top\"\u003eBack to top\u003c/a\u003e )\u003c/p\u003e\n\n\n\n\u003c!-- BUILD IT YOURSELF --\u003e\n## Build It Yourself\n\nIf you want to build the project yourself, do the following\n\n1. Clone this repository\n  ```shell\n  git clone https://github.com/skuethe/grafana-oss-team-sync.git\n  cd grafana-oss-team-sync\n  ```\n2. Build the binary\n  ```shell\n  CGO_ENABLED=0 go build .\n  ```\n3. Create the container image (adapt to your preferred tool for creating images)\n  ```shell\n  podman build -t localhost/grafana-oss-team-sync:dev -f build/package/Dockerfile .\n  ```\n\n\u003cp align=\"right\"\u003e( \u003ca href=\"#top\"\u003eBack to top\u003c/a\u003e )\u003c/p\u003e\n\n\n\n\u003c!-- CONTRIBUTING --\u003e\n## Contributing\n\nContributions are what makes the open source community such an amazing place to learn, inspire, and create. Any contributions you make are **greatly appreciated**.\n\nIf you have a suggestion that would make this better, please fork the repository and create a pull request. You can also simply open an issue with the tag \"enhancement\".\nDon't forget to give the project a star! Thanks again!\n\nSee [`CONTRIBUTING`](CONTRIBUTING.md) for more information.\n\n\u003cp align=\"right\"\u003e( \u003ca href=\"#top\"\u003eBack to top\u003c/a\u003e )\u003c/p\u003e\n\n\n\n\u003c!-- VERSIONING --\u003e\n## Versioning\n\nThis projects uses [Semantic Versioning (\"SemVer\")][semver] for releases.  \nAll available versions can be found on the [releases page][githubreleases].\n\n\u003cp align=\"right\"\u003e( \u003ca href=\"#top\"\u003eBack to top\u003c/a\u003e )\u003c/p\u003e\n\n\n\n\u003c!-- LICENSE --\u003e\n## License\n\nDistributed under the `GNU General Public License v3.0 or later (\"GPL-3.0-or-later\")`.  \nThis project adheres to the [`SPDX®` open standard][spdxopenstandard]. It is also [`REUSE`-compliant][reusecompliant]\n\nSee [`LICENSE`](LICENSE.md) for more information.\n\n\u003cp align=\"right\"\u003e( \u003ca href=\"#top\"\u003eBack to top\u003c/a\u003e )\u003c/p\u003e\n\n\n\n\u003c!-- MARKDOWN LINKS \u0026 IMAGES --\u003e\n\u003c!-- https://www.markdownguide.org/basic-syntax/#reference-style-links --\u003e\n\n[goreportcardbadge]:    \u003chttps://goreportcard.com/badge/github.com/skuethe/grafana-oss-team-sync\u003e \"Go Report Card: badge\"\n[goreportcardlink]:     \u003chttps://goreportcard.com/report/github.com/skuethe/grafana-oss-team-sync\u003e \"Go Report Card: link\"\n[reusebadge]:           \u003chttps://api.reuse.software/badge/github.com/skuethe/grafana-oss-team-sync\u003e \"REUSE: badge\"\n[reuselink]:            \u003chttps://api.reuse.software/info/github.com/skuethe/grafana-oss-team-sync\u003e \"REUSE: link\"\n[githublicensebadge]:   \u003chttps://img.shields.io/github/license/skuethe/grafana-oss-team-sync\u003e \"License\"\n\n[githubpackagelink]:    \u003chttps://github.com/skuethe/grafana-oss-team-sync/pkgs/container/grafana-oss-team-sync\u003e \"grafana-oss-team-sync package\"\n[githublatestrelease]:  \u003chttps://github.com/skuethe/grafana-oss-team-sync/releases/latest\u003e \"Latest grafana-oss-team-sync release\"\n[godotenv]:             \u003chttps://github.com/joho/godotenv\u003e \"GoDotEnv\"\n[enterprisefeature]:    \u003chttps://grafana.com/docs/grafana/v12.0/introduction/grafana-enterprise/#team-sync\u003e \"Grafana Enterprise - Team Sync\"\n[availableauthoptions]: \u003chttps://grafana.com/docs/grafana/latest/developers/http_api/authentication/\u003e \"Authentication options for the HTTP API\"\n[newbulkendpoint]:      \u003chttps://github.com/grafana/grafana/pull/87441\u003e \"Team: Add an endpoint for bulk team membership updates\"\n[requirebasicauth]:     \u003chttps://grafana.com/docs/grafana/latest/developers/http_api/admin/\u003e \"Admin API\"\n[setupssoauth]:         \u003chttps://grafana.com/docs/grafana/next/setup-grafana/configure-security/configure-authentication/\u003e \"Configure authentication\"\n[entraidoauth]:         \u003chttps://grafana.com/docs/grafana/next/setup-grafana/configure-security/configure-authentication/azuread/\u003e \"Entra ID OAuth authentication\"\n[entraidoauthconfig]:   \u003chttps://grafana.com/docs/grafana/next/setup-grafana/configure-security/configure-authentication/azuread/#configuration-options\u003e \"Entra ID OAuth - Configuration options\"\n[semver]:               \u003chttps://semver.org/\u003e \"Semantic Versioning\"\n[githubreleases]:       \u003chttps://github.com/skuethe/grafana-oss-team-sync/releases\u003e \"Releases\"\n[spdxopenstandard]:     \u003chttps://spdx.dev\u003e \"The System Package Data Exchange™\"\n[reusecompliant]:       \u003chttps://reuse.software/\u003e \"REUSE SOFTWARE - an initiative by the Free Software Foundation Europe\"\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fskuethe%2Fgrafana-oss-team-sync","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fskuethe%2Fgrafana-oss-team-sync","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fskuethe%2Fgrafana-oss-team-sync/lists"}