<p align="center">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/camatcode/ex_doppler/refs/heads/master/assets/ex_doppler-logo-dark.svg">
<source media="(prefers-color-scheme: light)" srcset="https://raw.githubusercontent.com/camatcode/ex_doppler/refs/heads/master/assets/ex_doppler-logo-light.png">
<img alt="ex_doppler logo" src="https://raw.githubusercontent.com/camatcode/ex_doppler/refs/heads/master/assets/ex_doppler-logo-light.png" width="320">
</picture>
</p>
<p align="center">
Manage and access your Doppler secrets without leaving Elixir
</p>
<p align="center">
<a href="https://hex.pm/packages/ex_doppler">
<img alt="Hex Version" src="https://img.shields.io/hexpm/v/ex_doppler.svg">
</a>
<a href="https://hexdocs.pm/ex_doppler">
<img alt="Hex Docs" src="http://img.shields.io/badge/hex.pm-docs-green.svg?style=flat">
</a>
<!--
<a href="https://github.com/camatcode/ex_doppler/actions">
<img alt="CI Status" src="https://github.com/camatcode/ex_doppler/workflows/ci/badge.svg">
</a>
-->
<a href="https://opensource.org/licenses/Apache-2.0">
<img alt="Apache 2 License" src="https://img.shields.io/hexpm/l/oban">
</a>
<a href="https://mastodon.social/@scrum_log">
<img alt="Mastodon Follow" src="https://img.shields.io/badge/mastodon-%40scrum_log%40mastodon.social-purple?color=6364ff">
</a>
</p>
## Table of Contents
- [Installation](#installation)
- [Quick Start](#quick-start)
- [Mapping](#mapping)
- [Not Implemented](#not-implemented)
## Installation
Add `:ex_doppler` to your list of deps in `mix.exs`:
```elixir
{:ex_doppler, "~> 1.0"}
```
Then run `mix deps.get` to install ExDoppler and its dependencies.
## Quick Start
1. [Create a Doppler Token](https://docs.doppler.com/docs/service-tokens#creating-service-tokens)
2. Put your token in your environment (**NEVER** put the token anywhere in your code)
```sh
export HISTIGNORE='export DOPPLER_TOKEN*'
export DOPPLER_TOKEN='dp.st.prd.xxxx'
```
3. Use ExDoppler to access your secrets
```elixir
secret_value = ExDoppler.get_secret_raw!("example-project", "dev_personal", "DB_URL")
```
4. You're good to go. I really recommend you have a look at [the docs](https://hex.pm/packages/ex_doppler)
## Mapping
| Realm | Actions Implemented | ExDoppler Module | Notes |
|------------------|---------------------------------------------------------------------------|------------------------------------|-------|
| Activity Logs | List, Retrieve | `ExDoppler.ActivityLogs` | |
| Auths | Me, ODIC, Revoke | `ExDoppler.Auths` | |
| Config Logs | List, Retrieve, Rollback | `ExDoppler.ConfigLogs` | |
| Configs | List, Retrieve, Create, Rename, Clone, Lock, Unlock, Delete | `ExDoppler.Configs` | |
| Environments | List, Retrieve, Create, Update, Delete | `ExDoppler.Environments` | |
| Integrations | List, Retrieve, Create, Update, Get Options, Delete | `ExDoppler.Integrations` | |
| Invites | List | `ExDoppler.Invites` | |
| Project Members | List, Retrieve | `ExDoppler.ProjectMembers` | |
| Project Roles | List, Retrieve, Create | `ExDoppler.ProjectRoles` | |
| Projects | List, Retrieve, Create, Update, Delete, List Project Permissions | `ExDoppler.Projects` | |
| Secret Syncs | Retrieve, Create, Delete | `ExDoppler.SecretSyncs` | |
| Secrets | List, Retrieve, Download, List Names, Create, Update, Update Note, Delete | `ExDoppler` or `ExDoppler.Secrets` | |
| Service Accounts | List | `ExDoppler.ServiceAccounts` | |
| Service Tokens | List, Create, Delete | `ExDoppler.ServiceTokens` | |
| Shares | Plain Text | `ExDoppler.Shares` | |
| Webhooks | List, Retrieve, Enable, Disable, Create, Delete | `ExDoppler.Webhooks` | |
| Workplace Roles | List, Retrieve | `ExDoppler.WorkplaceRoles` | |
| Workplace Users | List, Retrieve, Update | `ExDoppler.WorkplaceUsers` | |
| Workplace | Retrieve, Update | `ExDoppler.Workplaces` | |
## Not Implemented
| Realm : Action | Implemented | Notes |
|-------------------------------------------------------------------------------------------------------|-------------|--------------------------------------------------------|
| [Project Roles : Create](https://docs.doppler.com/reference/project_roles-create) | ⁉️ | Requires a Team tier |
| [Project Roles : Update](https://docs.doppler.com/reference/project_roles-update) | ⁉️ | Requires a Team tier |
| [Project Members : Add](https://docs.doppler.com/reference/project_members-add) | ⁉️ | Requires a Team tier |
| [Project Members : Update](https://docs.doppler.com/reference/project_members-update) | ⁉️ | Requires a Team tier |
| [Project Members : Delete](https://docs.doppler.com/reference/project_members-delete) | ⁉️ | Requires a Team tier |
| [Project Roles : Delete](https://docs.doppler.com/reference/project_roles-delete) | ⁉️ | Requires a Team tier |
| [Trusted IPs : List](https://docs.doppler.com/reference/configs-list_trusted_ips) | ⁉️ | Requires a Team tier |
| [Trusted IPs : Add](https://docs.doppler.com/reference/configs-add_trusted_ip) | ⁉️ | Requires a Team tier |
| [Trusted IPs : Delete](https://docs.doppler.com/reference/configs-delete_trusted_ip) | ⁉️ | Requires a Team tier |
| [Groups : List](https://docs.doppler.com/reference/groups-list) | ⁉️ | Requires a Team tier |
| [Groups : Create](https://docs.doppler.com/reference/groups-create) | ⁉️ | Requires a Team tier |
| [Groups : Retrieve](https://docs.doppler.com/reference/groups-get) | ⁉️ | Requires a Team tier |
| [Groups : Update](https://docs.doppler.com/reference/groups-update) | ⁉️ | Requires a Team tier |
| [Groups : Delete](https://docs.doppler.com/reference/groups-delete) | ⁉️ | Requires a Team tier |
| [Groups : Add Member](https://docs.doppler.com/reference/groups-add_member) | ⁉️ | Requires a Team tier |
| [Groups : Delete Memeber](https://docs.doppler.com/reference/groups-delete_member) | ⁉️ | Requires a Team tier |
| [Groups : Retrieve Memeber](https://docs.doppler.com/reference/retrieve-member) | ⁉️ | Requires a Team tier |
| [Service Accounts : List](https://docs.doppler.com/reference/service_accounts-list) | ⁉️ | Requires a Team tier |
| [Service Accounts : Create](https://docs.doppler.com/reference/service_accounts-create) | ⁉️ | Requires a Team tier |
| [Service Accounts : Retrieve](https://docs.doppler.com/reference/service_accounts-get) | ⁉️ | Requires a Team tier |
| [Service Accounts : Update](https://docs.doppler.com/reference/service_accounts-update) | ⁉️ | Requires a Team tier |
| [Service Accounts : Delete](https://docs.doppler.com/reference/service_accounts-delete) | ⁉️ | Requires a Team tier |
| [Service Account Tokens : List](https://docs.doppler.com/reference/service_account_tokens-list) | ⁉️ | Requires a Team tier |
| [Service Account Tokens : Create](https://docs.doppler.com/reference/service_account_tokens-create) | ⁉️ | Requires a Team tier |
| [Service Account Tokens : Retrieve](https://docs.doppler.com/reference/service_account_tokens-get) | ⁉️ | Requires a Team tier |
| [Service Account Tokens : Delete](https://docs.doppler.com/reference/service_account_tokens-delete) | ⁉️ | Requires a Team tier |
| [Webhooks : Update](https://docs.doppler.com/reference/webhooks-update) | ⁉️ | It's...complex |
| [Workplace Roles : Create](https://docs.doppler.com/reference/workplace_roles-create) | ⁉️ | Requires a Team tier |
| [Workplace Roles : Update](https://docs.doppler.com/reference/workplace_roles-update) | ⁉️ | Requires a Team tier |
| [Workplace Roles : Delete](https://docs.doppler.com/reference/workplace_roles-delete) | ⁉️ | Requires a Team tier |
| [Configs : Inheritable](https://docs.doppler.com/reference/configs-inheritable) | ⁉️ | Requires a Team tier |
| [Configs : Inherits](https://docs.doppler.com/reference/configs-inherits) | ⁉️ | Requires a Team tier |
| [Change Request Policies : Create](https://docs.doppler.com/reference/change-request-policies-create) | ⁉️ | Requires a Team tier |
| [Change Request Policies : Retrieve](https://docs.doppler.com/reference/change-request-policies-get) | ⁉️ | Requires a Team tier |
| [Change Request Policies : Update](https://docs.doppler.com/reference/change-request-policies-update) | ⁉️ | Requires a Team tier |
| [Change Request Policies : Delete](https://docs.doppler.com/reference/change-request-policies-delete) | ⁉️ | Requires a Team tier |
| [Dynamic Secrets : Issue Lease](https://docs.doppler.com/reference/dynamic_secrets-issue_lease) | ⁉️ | Requires a Team tier |
| [Dynamic Secrets : Revoke](https://docs.doppler.com/reference/dynamic_secrets-revoke_lease) | ⁉️ | Requires a Team tier |
| [Share : E2E Encrypted](https://docs.doppler.com/reference/share-secret-encrypted) | ⁉️ | Spent hours trying to get the link to actually decrypt |