mirror of
https://github.com/usetrmnl/oauth2-providers.git
synced 2026-08-13 23:19:00 -07:00
Added OAuth2 provider templates repository
Established community-maintained OAuth2 provider templates for TRMNL private plugins. Includes a YAML catalogue of 352 providers with schema documentation, GitHub Actions CI validation, issue templates, contributing guidelines, and MIT license.
This commit is contained in:
@@ -0,0 +1,27 @@
|
||||
---
|
||||
name: Broken / Outdated Provider
|
||||
about: Report a provider that no longer works or has outdated URLs
|
||||
title: "[Broken] PROVIDER NAME"
|
||||
labels: broken-provider
|
||||
---
|
||||
|
||||
## Provider
|
||||
|
||||
- **Keyname:** (from `providers.yml`)
|
||||
- **Display name:**
|
||||
|
||||
## What's wrong?
|
||||
|
||||
- [ ] Authorization URL no longer works
|
||||
- [ ] Token URL no longer works
|
||||
- [ ] Scopes are outdated
|
||||
- [ ] Provider shut down or deprecated their OAuth2 API
|
||||
- [ ] Other (describe below)
|
||||
|
||||
## Details
|
||||
|
||||
Describe the issue. Include any error messages or links to the provider's updated docs if available.
|
||||
|
||||
## Suggested fix
|
||||
|
||||
If you know the correct values, paste them here. Otherwise, leave blank and we'll investigate.
|
||||
@@ -0,0 +1,23 @@
|
||||
---
|
||||
name: New Provider Request
|
||||
about: Request a new OAuth2 provider template
|
||||
title: "Add [PROVIDER NAME]"
|
||||
labels: new-provider
|
||||
---
|
||||
|
||||
## Provider
|
||||
|
||||
- **Name:**
|
||||
- **Website:**
|
||||
|
||||
## OAuth Details
|
||||
|
||||
- **OAuth docs URL:**
|
||||
- **Authorize URL:**
|
||||
- **Token URL:**
|
||||
- **PKCE required:** yes / no
|
||||
- **Default scopes:**
|
||||
|
||||
## Notes
|
||||
|
||||
Any additional context (special headers, non-standard token responses, etc.)
|
||||
@@ -0,0 +1,15 @@
|
||||
## Checklist
|
||||
|
||||
- [ ] YAML is valid
|
||||
- [ ] Required fields present (`keyname`, `display_name`, `category`, `authorize_url`, `token_url`, `pkce_enabled`)
|
||||
- [ ] `keyname` is unique and lowercase-hyphenated
|
||||
- [ ] `category` is from the valid list
|
||||
- [ ] Tested OAuth flow or linked to provider's OAuth documentation
|
||||
|
||||
## Provider(s)
|
||||
|
||||
<!-- List the provider(s) added or modified -->
|
||||
|
||||
## OAuth Documentation
|
||||
|
||||
<!-- Link to the provider's OAuth/API documentation -->
|
||||
@@ -0,0 +1,87 @@
|
||||
#!/usr/bin/env ruby
|
||||
# frozen_string_literal: true
|
||||
|
||||
# Validates providers.yml for CI
|
||||
# Checks: valid YAML, required fields, no duplicate keynames, URL format, valid categories
|
||||
|
||||
require "yaml"
|
||||
|
||||
PROVIDERS_PATH = File.expand_path("../../providers.yml", __dir__)
|
||||
|
||||
REQUIRED_FIELDS = %w[keyname display_name category authorize_url token_url pkce_enabled].freeze
|
||||
|
||||
VALID_CATEGORIES = %w[
|
||||
ai analytics communication content crm design dev-tools e-commerce
|
||||
education entertainment file-storage finance fitness gaming healthcare
|
||||
hr identity logistics marketing other productivity security smart-home
|
||||
social support travel
|
||||
].freeze
|
||||
|
||||
errors = []
|
||||
|
||||
# Parse YAML
|
||||
begin
|
||||
providers = YAML.load_file(PROVIDERS_PATH)
|
||||
rescue Psych::SyntaxError => e
|
||||
puts "FAIL: Invalid YAML syntax"
|
||||
puts e.message
|
||||
exit 1
|
||||
end
|
||||
|
||||
unless providers.is_a?(Array)
|
||||
puts "FAIL: providers.yml must be a YAML array"
|
||||
exit 1
|
||||
end
|
||||
|
||||
puts "Loaded #{providers.size} providers"
|
||||
|
||||
# Check each provider
|
||||
keynames = []
|
||||
|
||||
providers.each_with_index do |provider, index|
|
||||
label = provider["keyname"] || "entry ##{index + 1}"
|
||||
|
||||
# Required fields
|
||||
REQUIRED_FIELDS.each do |field|
|
||||
if provider[field].nil? || provider[field].to_s.strip.empty?
|
||||
errors << "#{label}: missing required field '#{field}'"
|
||||
end
|
||||
end
|
||||
|
||||
# Duplicate keynames
|
||||
keyname = provider["keyname"].to_s
|
||||
if keynames.include?(keyname)
|
||||
errors << "#{label}: duplicate keyname"
|
||||
end
|
||||
keynames << keyname
|
||||
|
||||
# URL format
|
||||
%w[authorize_url token_url].each do |url_field|
|
||||
url = provider[url_field].to_s
|
||||
next if url.empty?
|
||||
|
||||
unless url.start_with?("https://") || url.include?("${connectionConfig")
|
||||
errors << "#{label}: #{url_field} must start with https:// or contain ${connectionConfig"
|
||||
end
|
||||
end
|
||||
|
||||
# Category validation
|
||||
category = provider["category"].to_s
|
||||
unless category.empty? || VALID_CATEGORIES.include?(category)
|
||||
errors << "#{label}: invalid category '#{category}' (valid: #{VALID_CATEGORIES.join(", ")})"
|
||||
end
|
||||
|
||||
# pkce_enabled format
|
||||
pkce = provider["pkce_enabled"].to_s
|
||||
unless %w[yes no].include?(pkce)
|
||||
errors << "#{label}: pkce_enabled must be 'yes' or 'no', got '#{pkce}'"
|
||||
end
|
||||
end
|
||||
|
||||
if errors.any?
|
||||
puts "\nFAIL: #{errors.size} validation error(s)\n\n"
|
||||
errors.each { |e| puts " - #{e}" }
|
||||
exit 1
|
||||
else
|
||||
puts "PASS: All #{providers.size} providers valid"
|
||||
end
|
||||
@@ -0,0 +1,23 @@
|
||||
name: Validate Providers
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
paths:
|
||||
- 'providers.yml'
|
||||
push:
|
||||
branches: [main]
|
||||
paths:
|
||||
- 'providers.yml'
|
||||
|
||||
jobs:
|
||||
validate:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- uses: ruby/setup-ruby@v1
|
||||
with:
|
||||
ruby-version: '3.3'
|
||||
|
||||
- name: Validate providers.yml
|
||||
run: ruby .github/scripts/validate_providers.rb
|
||||
@@ -0,0 +1,36 @@
|
||||
# Contributing
|
||||
|
||||
Thanks for helping grow the OAuth2 provider list!
|
||||
|
||||
## Fixing or Removing a Provider
|
||||
|
||||
Some providers may have outdated URLs or no longer support OAuth2. If you spot one:
|
||||
|
||||
1. **Report it** — [open a broken provider issue](../../issues/new?template=broken-provider.md)
|
||||
2. **Fix it** — update the entry in `providers.yml` and open a PR
|
||||
3. **Remove it** — if the service has shut down, delete the entry and open a PR
|
||||
|
||||
## Adding a Provider
|
||||
|
||||
1. **One provider per PR** — keeps review simple
|
||||
2. Copy a similar existing entry in `providers.yml`
|
||||
3. Fill in all required fields: `keyname`, `display_name`, `category`, `authorize_url`, `token_url`, `pkce_enabled`
|
||||
4. Open a PR
|
||||
|
||||
## Naming Conventions
|
||||
|
||||
- `keyname`: lowercase, hyphenated (e.g., `google-calendar`, `hubspot`)
|
||||
- `display_name`: official product name (e.g., `Google Calendar`, `HubSpot`)
|
||||
|
||||
## PR Checklist
|
||||
|
||||
- [ ] YAML is valid (CI will check this)
|
||||
- [ ] All required fields are present
|
||||
- [ ] `keyname` is unique
|
||||
- [ ] `category` is from the valid list (see README)
|
||||
- [ ] URLs use `https://` (or contain `${connectionConfig` for dynamic URLs)
|
||||
- [ ] Tested the OAuth flow, or linked to the provider's OAuth documentation
|
||||
|
||||
## Questions?
|
||||
|
||||
Open an issue — we're happy to help.
|
||||
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2026 TRMNL (trmnl.com)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -0,0 +1,51 @@
|
||||
# OAuth2 Provider Templates
|
||||
|
||||
Community-maintained OAuth2 provider templates for [TRMNL](https://trmnl.com) private plugins.
|
||||
|
||||
These templates auto-fill OAuth configuration when users select a provider. Users still need to create their own OAuth app and enter their `client_id` / `client_secret`.
|
||||
|
||||
## Adding a Provider
|
||||
|
||||
1. Fork this repo
|
||||
2. Edit `providers.yml` — copy a similar existing entry and fill in the fields
|
||||
3. Open a PR
|
||||
|
||||
### Required Fields
|
||||
|
||||
| Field | Description |
|
||||
|-------|-------------|
|
||||
| `keyname` | Unique identifier (lowercase, hyphenated) |
|
||||
| `display_name` | Human-readable name shown in dropdown |
|
||||
| `category` | Category for grouping(see providors.yml) |
|
||||
| `authorize_url` | OAuth2 authorization endpoint |
|
||||
| `token_url` | OAuth2 token endpoint |
|
||||
| `pkce_enabled` | `'yes'` or `'no'` |
|
||||
|
||||
### Optional Fields
|
||||
|
||||
All optional fields are documented in the YAML header comments at the top of `providers.yml`.
|
||||
|
||||
## Community Help Wanted
|
||||
|
||||
This list is community-maintained and some providers may have outdated URLs or deprecated OAuth2 endpoints. We welcome contributions to keep things current:
|
||||
|
||||
- **Report a broken provider** — [open an issue](../../issues/new?template=broken-provider.md) if a provider no longer works
|
||||
- **Fix a provider** — submit a PR with corrected URLs, scopes, or fields
|
||||
- **Remove a dead provider** — if a service has shut down, open a PR to remove it
|
||||
|
||||
## Schema Reference
|
||||
|
||||
The full schema is documented in the YAML header comments at the top of `providers.yml`.
|
||||
|
||||
## Attribution
|
||||
|
||||
Part of the factual api data was ported from the aggregated lists located in:
|
||||
- Nango https://github.com/NangoHQ/nango
|
||||
- NextAuth https://github.com/nextauthjs/next-auth
|
||||
- Grant https://github.com/simov/grant
|
||||
- Handshake https://github.com/portalform/handshake
|
||||
|
||||
|
||||
## License
|
||||
|
||||
MIT — see [LICENSE](LICENSE).
|
||||
+3775
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user