1
0
Fork 0

Adding upstream version 0.8.9.

Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
Daniel Baumann 2025-05-22 10:16:14 +02:00
parent 3b2c48b5e4
commit c0c4addb85
Signed by: daniel
GPG key ID: FBB4F0E80A80222F
285 changed files with 25880 additions and 0 deletions

19
docs/examples/generic.md Normal file
View file

@ -0,0 +1,19 @@
# Examples
Examples of service URLs that can be used with [the generic service](../../services/generic) together with common service providers.
## Home Assistant
The service URL needs to be:
```
generic://HAIPAddress:HAPort/api/webhook/WebhookIDFromHA?template=json
```
And, if you need http://
```
generic://HAIPAddress:HAPort/api/webhook/WebhookIDFromHA?template=json&disabletls=yes
```
Then, in HA, use `{{ trigger.json.message }}` to get the message sent from the JSON.
_Credit [@JeffCrum1](https://github.com/JeffCrum1), source: [https://github.com/nicholas-fedor/shoutrrr/issues/325#issuecomment-1460105065]_

BIN
docs/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

20
docs/generators/basic.md Normal file
View file

@ -0,0 +1,20 @@
# Basic generator
The basic generator looks at the `key:""`, `desc:""` and `default:""` tags on service configuration structs and uses them to ask the user to fill in their corresponding values.
Example:
```shell
$ shoutrrr generate telegram
```
```yaml
Generating URL for telegram using basic generator
Enter the configuration values as prompted
Token: 110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw
Preview[Yes]: No
Notification[Yes]:
ParseMode[None]:
Channels: @mychannel
URL: telegram://110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw@telegram?channels=@mychannel&notification=Yes&parsemode=None&preview=No
```

View file

@ -0,0 +1,10 @@
# Generators
Generators are used to create service configurations via the command line.
The main generator is the reflection based [Basic generator](./basic) that aims to be able to generator configurations for all the core services via a set of simple questions.
## Usage
```bash
$ shoutrrr generate [OPTIONS] -g <GENERATOR> <SERVICE>
```

156
docs/getting-started.md Normal file
View file

@ -0,0 +1,156 @@
# Getting started
## As a package
Using shoutrrr is easy! There is currently two ways of using it as a package.
### Using the direct send command
Easiest to use, but very limited.
```go
url := "slack://token-a/token-b/token-c"
err := shoutrrr.Send(url, "Hello world (or slack channel) !")
```
### Using a sender
Using a sender gives you the ability to preconfigure multiple notification services and send to all of them with the same `Send(message, params)` method.
```go
urlA := "slack://token-a/token-b/token-c"
urlB := "telegram://110201543:AAHdqTcvCH1vGWJxfSeofSAs0K5PALDsaw@telegram?channels=@mychannel"
sender, err := shoutrrr.CreateSender(urlA, urlB)
// Send notifications instantly to all services
sender.Send("Hello world (or slack/telegram channel)!", map[string]string { "title": "He-hey~!" })
// ...or bundle notifications...
func doWork() error {
// ...and send them when leaving the scope
defer sender.Flush(map[string]string { "title": "Work Result" })
sender.Enqueue("Started doing %v", stuff)
// Maybe get creative...?
defer func(start time.Time) {
sender.Enqueue("Elapsed: %v", time.Now().Sub(start))
}(time.Now())
if err := doMoreWork(); err != nil {
sender.Enqueue("Oh no! %v", err)
// This will send the currently queued up messages...
return
}
sender.Enqueue("Everything went very well!")
// ...or this:
}
```
## Through the CLI
Start by running the `build.sh` script.
You may then run the shoutrrr executable:
```shell
$ ./shoutrrr
Usage:
./shoutrrr <ActionVerb> [...]
Possible actions: send, verify, generate
```
On a system with Go installed you can install the latest Shoutrrr CLI
command with:
```shell
go install github.com/nicholas-fedor/shoutrrr/shoutrrr@latest
```
### Commands
#### Send
Send a notification using the supplied notification service url.
```bash
$ shoutrrr send \
--url "<SERVICE_URL>" \
--message "<MESSAGE BODY>"
```
#### Verify
Verify the validity of a notification service url.
```bash
$ shoutrrr verify \
--url "<SERVICE_URL>"
```
#### Generate
Generate and display the configuration for a notification service url.
```bash
$ shoutrrr generate [OPTIONS] <SERVICE>
```
| Flags | Description |
| ---------------------------- | ------------------------------------------------|
| `-g, --generator string` | The generator to use (default "basic") |
| `-p, --property stringArray` | Configuration property in key=value format |
| `-s, --service string` | The notification service to generate a URL for |
**Note**: Service can either be supplied as the first argument or using the `-s` flag.
For more information on generators, see [Generators](./generators/overview.md).
### Options
#### Debug
Enables debug output from the CLI.
| Flags | Env. | Default | Required |
| --------------- | ---------------- | ------- | -------- |
| `--debug`, `-d` | `SHOUTRRR_DEBUG` | `false` | |
#### URL
The target url for the notifications generated, see [overview](./services/overview).
| Flags | Env. | Default | Required |
| ------------- | -------------- | ------- | -------- |
| `--url`, `-u` | `SHOUTRRR_URL` | N/A | ✅ |
## From a GitHub Actions workflow
You can also use Shoutrrr from a GitHub Actions workflow.
See this example and the [action on GitHub
Marketplace](https://github.com/marketplace/actions/shoutrrr-action):
```yaml
name: Deploy
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Some other steps needed for deploying
run: ...
- name: Shoutrrr
uses: nicholas-fedor/shoutrrr-action@v1
with:
url: ${{ secrets.SHOUTRRR_URL }}
title: Deployed ${{ github.sha }}
message: See changes at ${{ github.event.compare }}.
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

View file

@ -0,0 +1,47 @@
# Slack Guides
Guides for setting up the [Slack](../../services/slack.md) service
## Getting a token
To enable all features, either the Legacy Webhook- (deprecated and might stop working) or the bot API tokens needs to
be used. Only use the non-legacy Webhook if you don't need to customize the bot name or icon.
### Bot API (preferred)
1. Create a new App for your bot using the [Basic app setup guide](https://api.slack.com/authentication/basics)
2. Install the App into your workspace ([slack docs](https://api.slack.com/authentication/basics#installing)).
3. From [Apps](https://api.slack.com/apps), select your new App and go to **Oauth & Permissions**
<figure><img alt="Slack app management menu screenshot" src="app-api-oauth-menu.png" height="248" /></figure>
4. Copy the Bot User OAuth Token
<figure><img alt="Copy OAuth token screenshot" src="app-api-copy-oauth-token.png" height="209" /></figure>
!!! example
Given the API token
<pre><code><b>xoxb</b>-<b>123456789012</b>-<b>1234567890123</b>-<b>4mt0t4l1YL3g1T5L4cK70k3N</b></code></pre>
and the channel ID `C001CH4NN3L` (obtained by using the [guide below](#getting_the_channel_id)), the Shoutrrr URL
should look like this:
<pre><code>slack://<b>xoxb</b>:<b>123456789012</b>-<b>1234567890123</b>-<b>4mt0t4l1YL3g1T5L4cK70k3N</b>@<b>C001CH4NN3L</b></code></pre>
### Webhook tokens
Get a Webhook URL using the legacy [WebHooks Integration](https://slack.com/apps/new/A0F7XDUAZ-incoming-webhooks),
or by using the [Getting started with Incoming Webhooks](https://api.slack.com/messaging/webhooks#getting_started) guide and
replace the initial `https://hooks.slack.com/services/` part of the webhook URL with `slack://hook:` to get your Shoutrrr URL.
!!! info "Slack Webhook URL"
<code>https://hooks.slack.com/services/<b>T00000000</b>/<b>B00000000</b>/<b>XXXXXXXXXXXXXXXXXXXXXXXX</b></code>
!!! info "Shoutrrr URL"
<code>slack://hook:<b>T00000000</b>-<b>B00000000</b>-<b>XXXXXXXXXXXXXXXXXXXXXXXX</b>@webhook</code>
## Getting the Channel ID
!!! note ""
Only needed for API token. Use `webhook` as the channel for webhook tokens.
1. In the channel you wish to post to, open **Channel Details** by clicking on the channel title.
<figure><img alt="Opening channel details screenshot" src="app-api-select-channel.png" height="270" /></figure>
2. Copy the Channel ID from the bottom of the popup and append it to your Shoutrrr URL
<figure><img alt="Copy channel ID screenshot" src="app-api-channel-details-id.png" height="99" /></figure>

43
docs/index.md Normal file
View file

@ -0,0 +1,43 @@
# Shoutrrr
<div align="center">
<img src="https://raw.githubusercontent.com/nicholas-fedor/shoutrrr/main/docs/shoutrrr-logotype.png" height="450" width="450" />
</div>
<p align="center">
Notification library for gophers and their furry friends.<br />
Heavily inspired by <a href="https://github.com/caronc/apprise">caronc/apprise</a>.
</p>
<p align="center" class="badges">
<a target="_blank" rel="noopener noreferrer" href="https://github.com/nicholas-fedor/shoutrrr/workflows/Main%20Workflow/badge.svg">
<img src="https://github.com/nicholas-fedor/shoutrrr/workflows/Main%20Workflow/badge.svg" alt="github actions workflow status">
</a>
<a href="https://codecov.io/gh/nicholas-fedor/shoutrrr" rel="nofollow">
<img alt="codecov" src="https://codecov.io/gh/nicholas-fedor/shoutrrr/branch/main/graph/badge.svg">
</a>
<a href="https://www.codacy.com/gh/nicholas-fedor/shoutrrr/dashboard?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=nicholas-fedor/shoutrrr&amp;utm_campaign=Badge_Grade" rel="nofollow">
<img alt="Codacy Badge" src="https://app.codacy.com/project/badge/Grade/47eed72de79448e2a6e297d770355544">
</a>
<a href="https://goreportcard.com/badge/github.com/nicholas-fedor/shoutrrr" rel="nofollow">
<img alt="report card" src="https://goreportcard.com/badge/github.com/nicholas-fedor/shoutrrr">
</a>
<a href="https://pkg.go.dev/github.com/nicholas-fedor/shoutrrr" rel="nofollow">
<img alt="go.dev reference" src="https://img.shields.io/badge/go.dev-reference-007d9c?logo=go&amp;logoColor=white&amp;style=flat-square">
</a>
<a href="https://hub.docker.com/r/nickfedor/shoutrrr" rel="nofollow">
<img alt="Pulls from DockerHub" src="https://img.shields.io/docker/pulls/nickfedor/shoutrrr.svg">
</a>
<a href="https://github.com/nicholas-fedor/shoutrrr">
<img alt="github code size in bytes" src="https://img.shields.io/github/languages/code-size/nicholas-fedor/shoutrrr.svg?style=flat-square">
</a>
<a href="https://github.com/nicholas-fedor/shoutrrr/blob/main/LICENSE">
<img alt="license" src="https://img.shields.io/github/license/nicholas-fedor/shoutrrr.svg?style=flat-square">
</a>
</p>
To make it easy and streamlined to consume shoutrrr regardless of the notification service you want to use,
we've implemented a notification service url schema. To send notifications, instantiate the `ShoutrrrClient` using one of
the service urls from the [overview](services/overview.md).

9
docs/overrides/main.html Normal file
View file

@ -0,0 +1,9 @@
{% extends "base.html" %}
{% block outdated %}
You're not viewing the latest version.
<a href="{{ '../' ~ base_url }}">
<strong>Click here to go to latest.</strong>
</a>
{% endblock %}

21
docs/proxy.md Normal file
View file

@ -0,0 +1,21 @@
To use a proxy with shoutrrr, you could either set the proxy URL in the environment variable `HTTP_PROXY` or override the default HTTP client like this:
```go
proxyurl, err := url.Parse("socks5://localhost:1337")
if err != nil {
log.Fatalf("Error parsing proxy URL: %q", err)
}
http.DefaultClient.Transport = &http.Transport{
Proxy: http.ProxyURL(proxyurl),
DialContext: (&net.Dialer{
Timeout: 30 * time.Second,
KeepAlive: 30 * time.Second,
}).DialContext,
ForceAttemptHTTP2: true,
MaxIdleConns: 100,
IdleConnTimeout: 90 * time.Second,
TLSHandshakeTimeout: 10 * time.Second,
ExpectContinueTimeout: 1 * time.Second,
}
```

7
docs/services/bark.md Normal file
View file

@ -0,0 +1,7 @@
# Bark
Upstream docs: https://github.com/Finb/Bark
## URL Format
--8<-- "docs/services/bark/config.md"

52
docs/services/discord.md Normal file
View file

@ -0,0 +1,52 @@
# Discord
## URL Format
Your Discord Webhook-URL will look like this:
!!! info ""
https://discord.com/api/webhooks/__`webhookid`__/__`token`__
The shoutrrr service URL should look like this:
!!! info ""
discord://__`token`__@__`webhookid`__[?thread_id=__`threadid`__]
### Thread Support
To send messages to a specific thread in a Discord channel, include the `thread_id` query parameter in the service URL with the ID of the target thread. For example:
!!! info ""
discord://__`token`__@__`webhookid`__?thread_id=123456789
You can obtain the `thread_id` by right-clicking a thread in Discord and selecting "Copy ID" (requires Developer Mode to be enabled in Discord settings).
--8<-- "docs/services/discord/config.md"
## Creating a webhook in Discord
1. Open your channel settings by first clicking on the gear icon next to the name of the channel.
![Screenshot 1](discord/sc-1.png)
2. In the menu on the left, click on *Integrations*.
![Screenshot 2](discord/sc-2.png)
3. In the menu on the right, click on *Create Webhook*.
![Screenshot 3](discord/sc-3.png)
4. Set the name, channel, and icon to your liking and click the *Copy Webhook URL* button.
![Screenshot 4](discord/sc-4.png)
5. Press the *Save Changes* button.
![Screenshot 5](discord/sc-5.png)
6. Format the service URL:
```
https://discord.com/api/webhooks/693853386302554172/W3dE2OZz4C13_4z_uHfDOoC7BqTW288s-z1ykqI0iJnY_HjRqMGO8Sc7YDqvf_KVKjhJ
└────────────────┘ └──────────────────────────────────────────────────────────────────┘
webhook id token
discord://W3dE2OZz4C13_4z_uHfDOoC7BqTW288s-z1ykqI0iJnY_HjRqMGO8Sc7YDqvf_KVKjhJ@693853386302554172?thread_id=123456789
└──────────────────────────────────────────────────────────────────┘ └────────────────┘ └─────────────────┘
token webhook id thread id
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 107 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

8
docs/services/email.md Normal file
View file

@ -0,0 +1,8 @@
# Email
## URL Format
!!! info ""
smtp://__`username`__:__`password`__@__`host`__:__`port`__/?from=__`fromAddress`__&to=__`recipient1`__[,__`recipient2`__,...]
--8<-- "docs/services/smtp/config.md"

76
docs/services/generic.md Normal file
View file

@ -0,0 +1,76 @@
# Generic
The Generic service can be used for any target that is not explicitly supported by Shoutrrr, as long as it
supports receiving the message via a POST request.
Usually, this requires customization on the receiving end to interpret the payload that it receives, and might
not be a viable approach.
Common examples for use with service providers can be found under [examples](../examples/generic.md).
## Custom headers
You can add additional HTTP headers to your request by adding query variables prefixed with `@` (`@key=value`).
Using
```url
generic://example.com?@acceptLanguage=tlh-Piqd
```
would result in the additional header being added:
```http
Accept-Language: tlh-Piqd
```
## JSON template
By using the built in `JSON` template (`template=json`) you can create a generic JSON payload. The keys used for `title` and `message` can be overriden
by supplying the params/query values `titleKey` and `messageKey`.
!!! example
```json
{
"title": "Oh no!",
"message": "The thing happened and now there is stuff all over the area!"
}
```
### Custom data fields
When using the JSON template, you can add additional key/value pairs to the JSON object by adding query variables prefixed with `$` (`$key=value`).
!!! example
Using `generic://example.com?$projection=retroazimuthal` would yield:
```json
{
"title": "Amazing opportunities!",
"message": "New map book available for purchase.",
"projection": "retroazimuthal"
}
```
## Shortcut URL
You can just add `generic+` as a prefix to your target URL to use it with the generic service, so
```url
https://example.com/api/v1/postStuff
```
would become
```url
generic+https://example.com/api/v1/postStuff
```
!!! note
Any query variables added to the URL will be escaped so that they can be forwarded to the remote server. That means that you cannot use `?template=json` with the `generic+https://`, just use `generic://` instead!
## Forwarded query variables
All query variables that are not listed in the [Query/Param Props](#queryparam_props) section will be
forwarded to the target endpoint.
If you need to pass a query variable that _is_ reserved, you can prefix it with an underscore (`_`).
!!! example
The URL `generic+https://example.com/api/v1/postStuff?contenttype=text/plain` would send a POST message
to `https://example.com/api/v1/postStuff` using the `Content-Type: text/plain` header.
If instead escaped, `generic+https://example.com/api/v1/postStuff?_contenttype=text/plain` would send a POST message
to `https://example.com/api/v1/postStuff?contenttype=text/plain` using the `Content-Type: application/json` header (as it's the default).
## URL Format
--8<-- "docs/services/generic/config.md"

View file

@ -0,0 +1,37 @@
# Google Chat
## URL Format
Your Google Chat Incoming Webhook URL will look like this:
!!! info ""
https://chat.googleapis.com/v1/spaces/__`FOO`__/messages?key=__`bar`__&token=__`baz`__
The shoutrrr service URL should look like this:
!!! info ""
googlechat://chat.googleapis.com/v1/spaces/__`FOO`__/messages?key=__`bar`__&token=__`baz`__
In other words the incoming webhook URL with `https` replaced by `googlechat`.
Google Chat was previously known as Hangouts Chat. Using `hangouts` in
the service URL instead `googlechat` is still supported, although
deprecated.
## Creating an incoming webhook in Google Chat
1. Open the room you would like to add Shoutrrr to and open the chat
room menu.
![Screenshot 1](googlechat/hangouts-1.png)
2. Then click on *Configure webhooks*.
![Screenshot 2](googlechat/hangouts-2.png)
3. Name the webhook and save.
![Screenshot 3](googlechat/hangouts-3.png)
4. Copy the URL.
![Screenshot 4](googlechat/hangouts-4.png)
5. Format the service URL by replacing `https` with `googlechat`.

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 150 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 135 KiB

18
docs/services/gotify.md Normal file
View file

@ -0,0 +1,18 @@
# Gotify
## URL Format
--8<-- "docs/services/gotify/config.md"
## Examples
!!! example "Common usage"
```uri
gotify://gotify.example.com:443/AzyoeNS.D4iJLVa/?title=Great+News&priority=1
```
!!! example "With subpath"
```uri
gotify://example.com:443/path/to/gotify/AzyoeNS.D4iJLVa/?title=Great+News&priority=1
```

View file

@ -0,0 +1,7 @@
# Hangouts Chat
Google Chat was previously known as *Hangouts Chat*. See [Google
Chat](googlechat.md).
Using `hangouts` in the service URL instead `googlechat` is still
supported, although deprecated.

8
docs/services/ifttt.md Normal file
View file

@ -0,0 +1,8 @@
# IFTTT
## URL Format
!!! info ""
ifttt://__`key`__/?events=__`event1`__[,__`event2`__,...]&value1=__`value1`__&value2=__`value2`__&value3=__`value3`__
--8<-- "docs/services/ifttt/config.md"

21
docs/services/join.md Normal file
View file

@ -0,0 +1,21 @@
# Join
## URL Format
!!! info ""
join://shoutrrr:__`api-key`__@join/?devices=__`device1`__[,__`device2`__, ...][&icon=__`icon`__][&title=__`title`__]
--8<-- "docs/services/join/config.md"
## Guide
1. Go to the [Join Webapp](https://joinjoaomgcd.appspot.com/)
2. Select your device
3. Click **Join API**
4. Your `deviceId` is shown in the top
5. Click **Show** next to `API Key` to see your key
6. Your Shoutrrr URL will then be:
`join://shoutrrr:`__`api-key`__`@join/?devices=`__`deviceId`__
!!! note ""
Multiple `deviceId`s can be combined with a `,` (repeat steps 2-4).

46
docs/services/lark.md Normal file
View file

@ -0,0 +1,46 @@
# Lark
Send notifications to Lark using a custom bot webhook.
## URL Format
!!! info ""
lark://__`host`__/__`token`__?secret=__`secret`__&title=__`title`__&link=__`url`__
--8<-- "docs/services/lark/config.md"
- `host`: The bot API host (`open.larksuite.com` for Lark, `open.feishu.cn` for Feishu).
- `token`: The bot webhook token (required).
- `secret`: Optional bot secret for signed requests.
- `title`: Optional message title (switches to post format if set).
- `link`: Optional URL to include as a clickable link in the message.
### Example URL
```url
lark://open.larksuite.com/abc123?secret=xyz789&title=Alert&link=https://example.com
```
## Create a Custom Bot in Lark
Official Documentation: [Custom Bot Guide](https://open.larksuite.com/document/client-docs/bot-v3/add-custom-bot)
1. __Invite the Custom Bot to a Group__:
a. Open the target group, click `More` in the upper-right corner, and then select `Settings`.
b. In the `Settings` panel, click `Group Bot`.
c. Click `Add a Bot` under `Group Bot`.
d. In the `Add Bot` dialog, locate `Custom Bot` and select it.
e. Set the bots name and description, then click `Add`.
f. Copy the webhook address and click `Finish`.
2. __Get Host and Token__:
- For __Lark__: Use `host = open.larksuite.com`.
- For __Feishu__: Use `host = open.feishu.cn`.
- The `token` is the last segment of the webhook URL.
For example, in `https://open.larksuite.com/open-apis/bot/v2/hook/xxxxxxxxxxxxxxxxx`, the token is `xxxxxxxxxxxxxxxxx`.
3. __Get Secret (Optional)__:
a. In group settings, open the bot list, find your custom bot, and select it to access its configuration.
b. Under `Security Settings`, enable `Signature Verification`.
c. Click `Copy` to save the secret.
d. Click `Save` to apply the changes.

6
docs/services/logger.md Normal file
View file

@ -0,0 +1,6 @@
# Logger
No configuration options are available for this service.
It simply emits notifications to the Shoutrrr log which is
configured by the consumer.

44
docs/services/matrix.md Normal file
View file

@ -0,0 +1,44 @@
# Matrix
!!! note Usage of the `title` parameter
Do note that Matrix will discard any information put in the `title` parameter as the service has no analogue to a
a title. Instead, use a custom message format to supply your wanted title as part of the message.
## URL Format
*matrix://__`user`__:__`password`__@__`host`__:__`port`__/[?rooms=__`!roomID1`__[,__`roomAlias2`__]][&disableTLS=yes]*
--8<-- "docs/services/matrix/config.md"
## Authentication
If no `user` is specified, the `password` is treated as the authentication token. This means that no matter what login
flow your server uses, if you can manually retrieve a token, then Shoutrrr can use it.
### Password Login Flow
If a `user` and `password` is supplied, the `m.login.password` login flow is attempted if the server supports it.
## Rooms
If `rooms` are *not* specified, the service will send the message to all the rooms that the user has currently joined.
Otherwise, the service will only send the message to the specified rooms. If the user is *not* in any of those rooms,
but have been invited to it, it will automatically accept that invite.
**Note**: The service will **not** join any rooms unless they are explicitly specified in `rooms`. If you need the user
to join those rooms, you can send a notification with `rooms` explicitly set once.
### Room Lookup
Rooms specified in `rooms` will be treated as room IDs if the start with a `!` and used directly to identify rooms. If
they have no such prefix (or use a *correctly escaped* `#`) they will instead be treated as aliases, and a directory
lookup will be used to resolve their corresponding IDs.
**Note**: Don't use unescaped `#` for the channel aliases as that will be treated as the `fragment` part of the URL.
Either omit them or URL encode them, I.E. `rooms=%23alias:server` or `rooms=alias:server`
### TLS
If you do not have TLS enabled on the server you can disable it by providing `disableTLS=yes`. This will effectively
use `http` intead of `https` for the API calls.

View file

@ -0,0 +1,69 @@
# MatterMost
## URL Format
!!! info ""
mattermost://[__`username`__@]__`mattermost-host`__/__`token`__[/__`channel`__][?icon=__`smiley`__&disabletls=__`yes`__]
--8<-- "docs/services/mattermost/config.md"
## Creating a Webhook in MatterMost
1. Open up the Integrations page by clicking on *Integrations* within the menu
![Screenshot 1](mattermost/1.PNG)
2. Click *Incoming Webhooks*
![Screenshot 2](mattermost/2.PNG)
3. Click *Add Incoming Webhook*
![Screenshot 3](mattermost/3.PNG)
4. Fill in the information for the webhook and click *Save*
![Screenshot 4](mattermost/4.PNG)
5. If you did everything correctly, MatterMost will give you the *URL* to your newly created webhook
![Screenshot 5](mattermost/5.PNG)
6. Format the service URL
```
https://your-domain.com/hooks/bywsw8zt5jgpte3nm65qjiru6h
└────────────────────────┘
token
mattermost://your-domain.com/bywsw8zt5jgpte3nm65qjiru6h
└────────────────────────┘
token
```
## Additional URL configuration
Mattermost provides functionality to post as another user or to another channel, compared to the webhook configuration.
<br/>
To do this, you can add a *user* and/or *channel* to the service URL.
```
mattermost://shoutrrrUser@your-domain.com/bywsw8zt5jgpte3nm65qjiru6h/shoutrrrChannel
└──────────┘ └────────────────────────┘ └─────────────┘
user token channel
```
## Passing parameters via code
If you want to, you also have the possibility to pass parameters to the `send` function.
<br/>
The following example contains all parameters that are currently supported.
```gotemplate
params := (*types.Params)(
&map[string]string{
"username": "overwriteUserName",
"channel": "overwriteChannel",
"icon": "overwriteIcon",
},
)
service.Send("this is a message", params)
```
This will overwrite any options, that you passed via URL.

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

7
docs/services/ntfy.md Normal file
View file

@ -0,0 +1,7 @@
# Ntfy
Upstream docs: https://docs.ntfy.sh/publish/
## URL Format
--8<-- "docs/services/ntfy/config.md"

66
docs/services/opsgenie.md Normal file
View file

@ -0,0 +1,66 @@
# OpsGenie
## URL Format
--8<-- "docs/services/opsgenie/config.md"
## Creating a REST API endpoint in OpsGenie
1. Open up the Integration List page by clicking on *Settings => Integration List* within the menu
![Screenshot 1](opsgenie/1.png)
2. Click *API => Add*
3. Make sure *Create and Update Access* and *Enabled* are checked and click *Save Integration*
![Screenshot 2](opsgenie/2.png)
4. Copy the *API Key*
5. Format the service URL
The host can be either api.opsgenie.com or api.eu.opsgenie.com depending on the location of your instance. See
the [OpsGenie documentation](https://docs.opsgenie.com/docs/alert-api) for details.
```
opsgenie://api.opsgenie.com/eb243592-faa2-4ba2-a551q-1afdf565c889
└───────────────────────────────────┘
token
```
## Passing parameters via code
If you want to, you can pass additional parameters to the `send` function.
<br/>
The following example contains all parameters that are currently supported.
```go
service.Send("An example alert message", &types.Params{
"alias": "Life is too short for no alias",
"description": "Every alert needs a description",
"responders": `[{"id":"4513b7ea-3b91-438f-b7e4-e3e54af9147c","type":"team"},{"name":"NOC","type":"team"}]`,
"visibleTo": `[{"id":"4513b7ea-3b91-438f-b7e4-e3e54af9147c","type":"team"},{"name":"rocket_team","type":"team"}]`,
"actions": "An action",
"tags": "tag1 tag2",
"details": `{"key1": "value1", "key2": "value2"}`,
"entity": "An example entity",
"source": "The source",
"priority": "P1",
"user": "Dracula",
"note": "Here is a note",
})
```
## Optional parameters
You can optionally specify the parameters in the URL:
!!! info ""
opsgenie://api.opsgenie.com/eb243592-faa2-4ba2-a551q-1afdf565c889?alias=Life+is+too+short+for+no+alias&description=Every+alert+needs+a+description&actions=An+action&tags=["tag1","tag2"]&entity=An+example+entity&source=The+source&priority=P1&user=Dracula&note=Here+is+a+note
Example using the command line:
```shell
shoutrrr send -u 'opsgenie://api.eu.opsgenie.com/token?tags=["tag1","tag2"]&description=testing&responders=[{"username":"superuser", "type": "user"}]&entity=Example Entity&source=Example Source&actions=["asdf", "bcde"]' -m "Hello World6"
```

Binary file not shown.

After

Width:  |  Height:  |  Size: 186 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

32
docs/services/overview.md Normal file
View file

@ -0,0 +1,32 @@
# Services overview
Click on the service for a more thorough explanation. <!-- @formatter:off -->
| Service | URL format |
| --------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| [Bark](./bark.md) | *bark://__`devicekey`__@__`host`__* |
| [Discord](./discord.md) | *discord://__`token`__@__`id`__[?thread_id=__`threadid`__]* |
| [Email](./email.md) | *smtp://__`username`__:__`password`__@__`host`__:__`port`__/?from=__`fromAddress`__&to=__`recipient1`__[,__`recipient2`__,...]* |
| [Gotify](./gotify.md) | *gotify://__`gotify-host`__/__`token`__* |
| [Google Chat](./googlechat.md) | *googlechat://chat.googleapis.com/v1/spaces/FOO/messages?key=bar&token=baz* |
| [IFTTT](./ifttt.md) | *ifttt://__`key`__/?events=__`event1`__[,__`event2`__,...]&value1=__`value1`__&value2=__`value2`__&value3=__`value3`__* |
| [Join](./join.md) | *join://shoutrrr:__`api-key`__@join/?devices=__`device1`__[,__`device2`__, ...][&icon=__`icon`__][&title=__`title`__]* |
| [Mattermost](./mattermost.md) | *mattermost://[__`username`__@]__`mattermost-host`__/__`token`__[/__`channel`__]* |
| [Matrix](./matrix.md) | *matrix://__`username`__:__`password`__@__`host`__:__`port`__/[?rooms=__`!roomID1`__[,__`roomAlias2`__]]* |
| [Ntfy](./ntfy.md) | *ntfy://__`username`__:__`password`__@ntfy.sh/__`topic`__* |
| [OpsGenie](./opsgenie.md) | *opsgenie://__`host`__/token?responders=__`responder1`__[,__`responder2`__]* |
| [Pushbullet](./pushbullet.md) | *pushbullet://__`api-token`__[/__`device`__/#__`channel`__/__`email`__]* |
| [Pushover](./pushover.md) | *pushover://shoutrrr:__`apiToken`__@__`userKey`__/?devices=__`device1`__[,__`device2`__, ...]* |
| [Rocketchat](./rocketchat.md) | *rocketchat://[__`username`__@]__`rocketchat-host`__/__`token`__[/__`channel`&#124;`@recipient`__]* |
| [Slack](./slack.md) | *slack://[__`botname`__@]__`token-a`__/__`token-b`__/__`token-c`__* |
| [Teams](./teams.md) | *teams://__`group`__@__`tenant`__/__`altId`__/__`groupOwner`__?host=__`organization`__.webhook.office.com* |
| [Telegram](./telegram.md) | *telegram://__`token`__@telegram?chats=__`@channel-1`__[,__`chat-id-1`__,...]* |
| [Zulip Chat](./zulip.md) | *zulip://__`bot-mail`__:__`bot-key`__@__`zulip-domain`__/?stream=__`name-or-id`__&topic=__`name`__* |
| [Lark](./lark.md) | *lark://__`host`__/__`token`__?secret=__`secret`__&title=__`title`__&link=__`url`__* |
## Specialized services
| Service | Description |
| --------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| [Logger](./logger.md) | Writes notification to a configured go `log.Logger` |
| [Generic Webhook](./generic.md) | Sends notifications directly to a webhook |

View file

@ -0,0 +1,8 @@
# Pushbullet
## URL Format
!!! info ""
pushbullet://__`api-token`__[/__`device`__/#__`channel`__/__`email`__]
--8<-- "docs/services/pushbullet/config.md"

32
docs/services/pushover.md Normal file
View file

@ -0,0 +1,32 @@
# Pushover
## URL Format
!!! info ""
pushover://shoutrrr:__`apiToken`__@__`userKey`__/?devices=__`device1`__[,__`device2`__, ...]
--8<-- "docs/services/pushover/config.md"
## Getting the keys from Pushover
At your [Pushover dashboard](https://pushover.net/) you can view your __`userKey`__ in the top right.
![Screenshot 1](pushover/po-1.png)
The `Name` column of the device list is what is used to refer to your devices (__`device1`__ etc.)
![Screenshot 4](pushover/po-4.png)
At the bottom of the same page there are links your _applications_, where you can find your __`apiToken`__
![Screenshot 2](pushover/po-2.png)
The __`apiToken`__ is displayed at the top of the application page.
![Screenshot 3](pushover/po-3.png)
## Optional parameters
You can optionally specify the __`title`__ and __`priority`__ parameters in the URL:
*pushover://shoutrrr:__`token`__@__`userKey`__/?devices=__`device`__&title=Custom+Title&priority=1*
!!! note
Only supply priority values between -1 and 1, since 2 requires additional parameters that are not supported yet.
Please refer to the [Pushover API documentation](https://pushover.net/api#messages) for more information.

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

View file

@ -0,0 +1,66 @@
# Rocket.chat
## URL Format
!!! info ""
rocketchat://[__`username`__@]__`rocketchat-host`__/__`token`__[/__`channel`&#124;`@recipient`__]*
--8<-- "docs/services/rocketchat/config.md"
## Creating a Webhook in Rocket.chat
1. Open up the chat Administration by clicking on *Administration* menu
![Screenshot 1](rocketchat/1.png)
2. Open *Integrations* and then click *New*
![Screenshot 2](rocketchat/2.png)
3. Fill in the information for the webhook and click *Save*. Please don't forget to Enable your integration.
![Screenshot 3](rocketchat/3.png)
5. If you did everything correctly, Rocket.chat will give you the *URL* and *Token* to your newly created webhook.
![Screenshot 4](rocketchat/4.png)
6. Format the service URL
```
rocketchat://your-domain.com/8eGdRzc9r4YYNyvge/2XYQcX9NBwJBKfQnphpebPcnXZcPEi32Nt4NKJfrnbhsbRfX
└────────────────────────────────────────────────────────────────┘
token
```
## Additional URL configuration
Rocket.chat provides functionality to post as another user or to another channel / user, compared to the webhook configuration.
<br/>
To do this, you can add a *sender* and/or *channel* / *receiver* to the service URL.
```
rocketchat://shoutrrrUser@your-domain.com/8eGdRzc9r4YYNyvge/2XYQcX9NBwJBKfQnphpebPcnXZcPEi32Nt4NKJfrnbhsbRfX/shoutrrrChannel
└──────────┘ └────────────────────────────────────────────────────────────────┘ └─────────────┘
sender token channel
rocketchat://shoutrrrUser@your-domain.com/8eGdRzc9r4YYNyvge/2XYQcX9NBwJBKfQnphpebPcnXZcPEi32Nt4NKJfrnbhsbRfX/@shoutrrrReceiver
└──────────┘ └────────────────────────────────────────────────────────────────┘ └───────────────┘
sender token receiver
```
## Passing parameters via code
If you want to, you also have the possibility to pass parameters to the `send` function.
<br/>
The following example contains all parameters that are currently supported.
```gotemplate
params := (*types.Params)(
&map[string]string{
"username": "overwriteUserName",
"channel": "overwriteChannel",
},
)
service.Send("this is a message", params)
```
This will overwrite any options, that you passed via URL.
For more Rocket.chat Webhooks options see [official guide](https://docs.rocket.chat/guides/administrator-guides/integrations).

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 147 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 185 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 126 KiB

36
docs/services/slack.md Normal file
View file

@ -0,0 +1,36 @@
# Slack
!!! attention "New URL format"
The URL format for Slack has been changed to allow for API- as well as webhook tokens.
Using the old format (`slack://xxxx/yyyy/zzzz`) will still work as before and will automatically be upgraded to
the new format when used.
The Slack notification service uses either [Slack Webhooks](https://api.slack.com/messaging/webhooks) or the
[Bot API](https://api.slack.com/methods/chat.postMessage) to send messages.
See the [guides](../guides/slack/index.md) for information on how to get your *token* and *channel*.
## URL Format
!!! note ""
Note that the token uses a prefix to determine the type, usually either `hook` (for webhooks) or `xoxb` (for bot API).
--8<-- "docs/services/slack/config.md"
!!! info "Color format"
The format for the `Color` prop follows the [slack docs](https://api.slack.com/reference/messaging/attachments#fields)
but `#` needs to be escaped as `%23` when passed in a URL.
So <span style="background:#ff8000;width:.9em;height:.9em;display:inline-block;vertical-align:middle"></span><code>#ff8000</code> would be `%23ff8000` etc.
## Examples
!!! example "Bot API"
```uri
slack://xoxb:123456789012-1234567890123-4mt0t4l1YL3g1T5L4cK70k3N@C001CH4NN3L?color=good&title=Great+News&icon=man-scientist&botname=Shoutrrrbot
```
!!! example "Webhook"
```uri
slack://hook:WNA3PBYV6-F20DUQND3RQ-Webc4MAvoacrpPakR8phF0zi@webhook?color=good&title=Great+News&icon=man-scientist&botname=Shoutrrrbot
```

69
docs/services/teams.md Normal file
View file

@ -0,0 +1,69 @@
# Teams
!!! attention "New webhook URL format only"
Shoutrrr now only supports the new Teams webhook URL format with an
organization-specific domain.
You must specify your organization domain using:
```text
?host=example.webhook.office.com
```
Where `example` is your organization's short name.
Legacy webhook formats (e.g., `outlook.office.com`) are no longer supported.
## URL Format
```
teams://group@tenant/altId/groupOwner/extraId?host=organization.webhook.office.com[&color=color][&title=title]
```
Where:
- `group`: The first UUID component from the webhook URL.
- `tenant`: The second UUID component from the webhook URL.
- `altId`: The third component (hex string) from the webhook URL.
- `groupOwner`: The fourth UUID component from the webhook URL.
- `extraId`: The fifth component at the end of the webhook URL.
- `organization`: Your organization name for the webhook domain (required).
- `color`: Optional hex color code for the message card (e.g., `FF0000` for red).
- `title`: Optional title for the message card.
--8<-- "docs/services/teams/config.md"
## Setting up a webhook
To use the Microsoft Teams notification service, you need to set up a custom
incoming webhook. Follow the instructions in [this Microsoft guide](https://learn.microsoft.com/en-us/microsoftteams/platform/webhooks-and-connectors/how-to/add-incoming-webhook#create-an-incoming-webhook).
## Extracting the token
The token is extracted from your webhook URL:
<pre><code>https://<b>&lt;organization&gt;</b>.webhook.office.com/webhookb2/<b>&lt;group&gt;</b>@<b>&lt;tenant&gt;</b>/IncomingWebhook/<b>&lt;altId&gt;</b>/<b>&lt;groupOwner&gt;</b>/<b>&lt;extraId&gt;</b></code></pre>
!!! note "Important components"
All parts of the webhook URL are required:
- `organization`: Your organization name (e.g., `contoso`).
- `group`: First UUID component.
- `tenant`: Second UUID component.
- `altId`: Third component (hex string).
- `groupOwner`: Fourth UUID component.
- `extraId`: Fifth component.
## Example
```
# Original webhook URL:
https://contoso.webhook.office.com/webhookb2/11111111-4444-4444-8444-cccccccccccc@22222222-4444-4444-8444-cccccccccccc/IncomingWebhook/33333333012222222222333333333344/44444444-4444-4444-8444-cccccccccccc/V2ESyij_gAljSoUQHvZoZYzlpAoAXExyOl26dlf1xHEx05
# Shoutrrr URL:
teams://11111111-4444-4444-8444-cccccccccccc@22222222-4444-4444-8444-cccccccccccc/33333333012222222222333333333344/44444444-4444-4444-8444-cccccccccccc/V2ESyij_gAljSoUQHvZoZYzlpAoAXExyOl26dlf1xHEx05?host=contoso.webhook.office.com&color=FF0000&title=Alert
```
In this example:
- `color=FF0000` sets a red theme.
- `title=Alert` adds a custom title to the message card.

73
docs/services/telegram.md Normal file
View file

@ -0,0 +1,73 @@
# Telegram
## URL Format
!!! info ""
telegram://__`token`__@telegram?chats=__`channel-1`__[,__`chat-id-1`__,...]
--8<-- "docs/services/telegram/config.md"
## Getting a token for Telegram
Talk to [the botfather](https://core.telegram.org/bots#6-botfather).
## Identifying the target chats/channels
The `chats` param consists of one or more `Chat ID`s or `channel name`s.
### Public Channels
The channel names can be retrieved in the telegram client in the `Channel info` section for public channels.
Replace the `t.me/` prefix from the link with a `@`.
!!! note
Channels names need to be prefixed by `@` to identify them as such.
!!! note
If your channel only has an invite link (starting with `t.me/+`), you have to use it's Chat ID (see below)
!!! note
A `message_thread_id` param ([reference](https://core.telegram.org/bots/api#sendmessage)) can be added, with the format of `$chat_id:$message_thread_id`. [More info](https://stackoverflow.com/questions/74773675/how-to-get-topic-id-for-telegram-group-chat/75178418#75178418) on how to obtain the `message_thread_id`.
### Chats
Private channels, Group chats and private chats are identified by `Chat ID`s. Unfortunatly, they are generally not visible in the
telegram clients.
The easiest way to retrieve them is by using the `shoutrrr generate telegram` command which will guide you through
creating a URL with your target chats.
!!! tip
You can use the `nickfedor/shoutrrr` image in docker to run it without download/installing the `shoutrrr` CLI using:
```
docker run --rm -it nickfedor/shoutrrr generate telegram
```
### Asking @shoutrrrbot
Another way of retrieving the Chat IDs, is by forwarding a message from the target chat to the [@shoutrrrbot](https://t.me/shoutrrrbot).
It will reply with the Chat ID for the chat where the forwarded message was originally posted.
Note that it will not work correctly for Group chats, as those messages are just seen as being posted by a user, not in a specific chat.
Instead you can use the second method, which is to invite the @shoutrrrbot into your group chat and address a message to it (start the message with @shoutrrrbot). You can then safely kick the bot from the group.
The bot should be constantly online, unless it's usage exceeds the free tier on GCP. It's source is available at [github.com/nicholas-fedor/shoutrrrbot](https://github.com/nicholas-fedor/shoutrrrbot).
## Optional parameters
You can optionally specify the __`notification`__, __`parseMode`__ and __`preview`__ parameters in the URL:
!!! info ""
<pre>telegram://__`token`__@__`telegram`__/?channels=__`channel`__&notification=no&preview=false&parseMode=html</pre>
See [the telegram documentation](https://core.telegram.org/bots/api#sendmessage) for more information.
!!! note
`preview` and `notification` are inverted in regards to their API counterparts (`disable_web_page_preview` and `disable_notification`)
### Parse Mode and Title
If a parse mode is specified, the message needs to be escaped as per the corresponding sections in
[Formatting options](https://core.telegram.org/bots/api#formatting-options).
When a title has been specified, it will be prepended to the message, but this is only supported for
the `HTML` parse mode. Note that, if no parse mode is specified, the message will be escaped and sent using `HTML`.
Since the markdown modes are really hard to escape correctly, it's recommended to stick to `HTML` parse mode.

29
docs/services/zulip.md Normal file
View file

@ -0,0 +1,29 @@
# Zulip Chat
## URL Format
The shoutrrr service URL should look like this:
!!! info ""
zulip://__`botmail`__:__`botkey`__@__`host`__/?stream=__`stream`__&topic=__`topic`__
--8<-- "docs/services/zulip/config.md"
!!! note
Since __`botmail`__ is a mail address you need to URL escape the `@` in it to `%40`.
### Examples
Stream and topic are both optional and can be given as parameters to the Send method:
```go
sender, _ := shoutrrr.CreateSender(url)
params := make(types.Params)
params["stream"] = "mystream"
params["topic"] = "This is my topic"
sender.Send(message, &params)
```
!!! example "Example service URL"
zulip://my-bot%40zulipchat.com:correcthorsebatterystable@example.zulipchat.com?stream=foo&topic=bar

BIN
docs/shoutrrr-180px.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
docs/shoutrrr-logotype.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 132 KiB

269
docs/shoutrrr-logotype.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 144 KiB

BIN
docs/shoutrrr.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

View file

@ -0,0 +1,30 @@
.md-typeset li img {
display: inline-block;
}
.md-typeset figure {
background: var(--md-code-bg-color);
display: block;
width: 100%;
}
.md-typeset figure img {
box-shadow: 2px 2px 4px #00000080;
padding: 3px;
background: var(--md-code-bg-color);
}
.md-typeset li img:last-child {
margin: 10px 0;
}
.badges img {
height: 20px;
max-width: 100%;
display: inline-block;
padding: 0;
background: transparent;
border-radius: 3px;
}

View file

@ -0,0 +1,8 @@
[data-md-color-scheme="shoutrrr"] {
--md-primary-fg-color: hsl(193, 100%, 44%);
--md-primary-fg-color--light: hsl(193, 100%, 55%);
--md-primary-fg-color--dark: hsl(193, 76%, 33%);
--md-accent-fg-color: hsl(39, 84%, 44%);
--md-accent-fg-color--transparent: hsla(39, 84%, 58%, 0.1);
--md-typeset-a-color: var(--md-primary-fg-color--dark);
}