From 793ef74ed60f6276dde4c7af2a06504037df7ca3 Mon Sep 17 00:00:00 2001
From: sommerfeld <sommerfeld@sommerfeld.dev>
Date: Wed, 24 Apr 2024 15:27:02 +0100
Subject: Move man to root directory

Otherwise Github Linguist does not pick it up as docs and the project
looks like a Roff project ;)
---
 .github/workflows/release.yml |   1 +
 contrib/man/sentrum.1         | 552 ------------------------------------------
 man/sentrum.1                 | 552 ++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 553 insertions(+), 552 deletions(-)
 delete mode 100644 contrib/man/sentrum.1
 create mode 100644 man/sentrum.1

diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index f3f5984..2e62df1 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -36,6 +36,7 @@ jobs:
         cp target/release/${{ matrix.bin }} ${{ matrix.name }}
         cp sentrum.sample.toml ${{ matrix.name }}
         cp -r contrib ${{ matrix.name }}
+        cp -r man ${{ matrix.name }}
         cp LICENSE.txt ${{ matrix.name }}
         if [[ "${{ matrix.os }}" == "windows-latest" ]]
         then
diff --git a/contrib/man/sentrum.1 b/contrib/man/sentrum.1
deleted file mode 100644
index 932daca..0000000
--- a/contrib/man/sentrum.1
+++ /dev/null
@@ -1,552 +0,0 @@
-.nh
-.TH sentrum
-.PP
-
-
-
-
-
-.PP
-Daemon that monitors the Bitcoin blockchain for transactions involving your
-wallets and sends you notifications in many different channels (ntfy push
-notifications, email, telegram, nostr, arbitrary command, etc).
-
-.PP
-Example screenshot of many noifications for a single transaction:
-
-  
-
-
-.SH Installation
-.PP
-Either:
-
-.RS
-.IP \(bu 2
-Compile from source using \fBcargo install sentrum\fR (binary will be installed in
-\fB~/.cargo/bin\fR)
-.IP \(bu 2
-Download the binary from the
-releases page
-\[la]https://github.com/sommerfelddev/sentrum/releases\[ra]
-.IP \(bu 2
-If using archlinux, install it from the AUR:
-sentrum
-\[la]https://aur.archlinux.org/packages/sentrum\[ra],
-sentrum-bin
-\[la]https://aur.archlinux.org/packages/sentrum\-bin\[ra] or
-sentrum-git
-\[la]https://aur.archlinux.org/packages/sentrum\-git\[ra]
-
-.RE
-
-.SH Configuration
-.SS Config file path
-.PP
-It will look for a \fBsentrum.toml\fR configuration file located in any of these
-directories (with this priority):
-
-.RS
-.IP "  1." 5
-Current working directory
-.IP "  2." 5
-\fB$XDG_CONFIG_HOME/sentrum\fR
-.IP "  3." 5
-\fB~/.config/sentrum\fR
-.IP "  4." 5
-\fB/etc/sentrum\fR (more appropriate if running as a systemd service)
-
-.RE
-
-.PP
-Alternatively, you can pass the configuration file path as an argument in the
-invocation and that will override any of the above.
-
-.PP
-\fBStart by copying the sample configuration to where you want it.\fP E.g.
-
-.EX
-cp sentrum.sample.toml sentrum.toml
-sudo cp sentrum.sample.toml /etc/sentrum/sentrum.toml
-.EE
-
-.PP
-or
-
-.EX
-sudo cp sentrum.sample.toml /etc/sentrum/sentrum.toml
-.EE
-
-.SS What to configure
-.PP
-You can use the 
-\[la]sentrum.sample.toml\[ra] file as an
-example.
-Most options have very good defaults so you don't need to change them unless you
-want to. \fBIn the examples below, commented options showcase their defaults,
-unless explicitly said otherwise.\fP
-
-.SS Required
-.RS
-.IP \(bu 2
-\fBwallets\fR: what wallets you want to monitor
-.IP \(bu 2
-\fBactions\fR: what actions you want to take once a relevant transaction is found
-
-.RE
-
-.SS Optional
-.RS
-.IP \(bu 2
-\fBelectrum\fR: by default, public electrum servers are used. You can configure it
-to connect to your own
-.IP \(bu 2
-\fBmessage\fR: this allows you to configure the subject and body templates of the
-notification message and choose the relevant data from the transaction that
-you want to include
-
-.RE
-
-.SH Wallets
-.PP
-For each wallet you want to track, add the following configuration:
-
-.EX
-[[wallets]]
-# Identifier for naming purposes (required)
-name = "alice"
-# Wallet xpub (required)
-xpub = "xpub6CkXHzuU1NyHUFNiQZLq2bgt6QPqjZbwpJ1MDgDeo4bWZ8ZP7HZr7v9WTLCQFhxVhqiJNcw5wSKE77rkAK1SzcuHjt36ZUibBHezGzGL9h9"
-# Script kind ("legacy","nested_segwit","segwit","taproot") (optional)
-#kind = "segwit"
-.EE
-
-.PP
-It assumes a BIP84 (native segwit, \fBbc1\fR style addresses) wallet. If your wallet
-has a different script kind add the field \fBkind = "legacy"\fR (or \fBnested_segwit\fR,
-or \fBtaproot\fR).
-
-.PP
-More complex wallet types are supported by providing \fBprimary = "<desc>"\fR and
-\fBchange = "<desc>"\fR wallet descriptors instead of \fBxpub =\fR and \fBkind =\fR\&.
-
-.SH Actions
-.PP
-For each new relevant transaction, you can take multiple actions. For each
-action you desire to take, you need to add the configuration:
-
-.EX
-[[actions]]
-# Action type (required)
-type =  "<INSERT ACTION KIND>"
-<.... INSERT ACTION SPECIFIC CONFIGURATION HERE...>
-.EE
-
-.PP
-Below we explain the configuration for each action kind. You can have multiple
-actions of the same kind (e.g. you want to send multiple emails from different
-accounts for some reason).
-
-.SS ntfy
-.PP
-This is the best straightforward way to get push notifications on a smartphone.
-
-.RS
-.IP "  1." 5
-Install the android/iOS app following the relevant links in https://ntfy.sh
-.IP "  2." 5
-If you don't run your own ntfy self-hosted server, create an account at
-ntfy.sh
-.IP "  3." 5
-Open the app, give it the needed permissions and configure your account
-credentials
-.IP "  4." 5
-Click on the \fB+\fR button and create a "topic", preferably named \fBsentrum\fR
-since that's what will be used by default.
-
-.RE
-
-.PP
-Then you just need to add the relevant configuration:
-
-.EX
-[[actions]]
-type =  "ntfy"
-# Credentials (required if you use a public server like the default one)
-credentials.username = "<YOUR USERNAME HERE>"
-credentials.password = "<YOUR PASSWORD HERE>"
-# ntfy server (optional)
-#url = "https://ntfy.sh"
-# notification channel name (optional)
-#topic = "sentrum"
-# Proxy used to connect (optional, defaults to None)
-#proxy = "socks5://127.0.0.1:9050"
-# Priority ("max", "high", "default", "low", "min") (optional)
-#priority = "default"
-.EE
-
-.SS nostr
-.PP
-Get notified by a nostr NIP04 encrypted
-DM
-\[la]https://github.com/nostr\-protocol/nips/blob/master/04.md\[ra] (leaks metadata
-but widely supported) or a
-NIP59 GiftWrap sealed sender DM
-\[la]https://github.com/nostr\-protocol/nips/blob/master/59.md\[ra]
-(more private but not supported by many clients). Add:
-
-.EX
-[[actions]]
-type = "nostr"
-# Which npub to send the DM (required)
-recipient = "<YOUR npub, hex pubkey, nprofile or nip05>"
-# If NIP59 giftwrap DMs should be used instead of NIP04 (optional)
-#sealed_dm = false
-# Which relays to use to send DMs
-#relays = ["wss://nostr.bitcoiner.social", "wss://nostr.oxtr.dev", "wss://nostr.orangepill.dev", "wss://relay.damus.io"]
-.EE
-
-.SS email
-.PP
-You need to add the configuration below and essentially configure an
-authenticated connection to your email provider's SMTP server. I cannot help you
-out with every provider's weird rules (maybe you need to allow 3rd party apps
-for gmail, who knows).
-
-.EX
-[[actions]]
-type =  "email"
-# SMTP server (required)
-server = "<insert smtp server url (e.g. smtp.gmail.com)"
-# SMTP connection type ("tls", "starttls" or "plain") (optional)
-#connection = "tls"
-# SMTP port (optional, defaults to 587 for TLS, 465 for STARTTLS and 25 for plain connections
-#port = 1025
-# SMTP credentials (required in most cases)
-credentials.authentication_identity = "<insert login email>"
-credentials.secret = "<insert password>"
-# Accept self signed certificates (needed if you are using protonmail-bridge) (optional)
-#self_signed_cert = false
-# Configure sender (required)
-from = "sentrum <youremailhere@host.tld>"
-# Configure recipient (optional, defaults to the same as the "from" sender)
-#to = "sentrum <youremailhere@host.tld>"
-.EE
-
-.SS telegram
-.RS
-.IP "  1." 5
-Create a new bot using @Botfather
-\[la]https://t.me/botfather\[ra] to get a token in the format \fB123456789:blablabla\fR\&.
-.IP "  2." 5
-Optionally configure the bot (name, profile pic, etc) with @Botfather
-.IP "  3." 5
-Open a chat with your bot
-.IP "  4." 5
-Add the relevant config:
-
-.RE
-
-.EX
-[[actions]]
-type =  "telegram"
-# Auth token of the bot created with @Botfather (required)
-bot_token = "<insert bot token>"
-# 10-digit user id of the DM recipient, go to your profile to get it (required)
-user_id = 1234567890
-.EE
-
-.SS command
-.PP
-Runs an external command where you can use transaction details as arguments.
-You can check what parameters (such as \fB{wallet}\fR or \fB{tx_net}\fR you can use in
-the message
-\[la]#message\[ra] configuration, since they are the same.
-
-.EX
-[[actions]]
-type = "command"
-cmd = "notify-send"
-args = ["[{wallet}] new tx: {tx_net} sats"]
-.EE
-
-.SS terminal_print
-.PP
-Justs prints the notification text in the terminal. You can potentially pipe it
-to something else.
-
-.EX
-[[actions]]
-type =  "terminal_print"
-.EE
-
-.SS desktop_notification
-.PP
-Displays the transaction message as a native desktop notification on the same
-computer sentrum is running.
-
-.EX
-[[actions]]
-type =  "desktop_notification"
-.EE
-
-.SH Message
-.PP
-You can configure the message template and it applies to almost every action
-type. This configuration is entirely optional since the default templates will
-be used if omitted.
-
-.PP
-Here is the default template:
-
-.EX
-[message]
-subject = "[{wallet}] new transaction"
-body = "net: {tx_net} sats, balance: {total_balance} sats, txid: {txid_short}"
-# Can be "plain", "markdown" or "html"
-format = "plain"
-# Configure blockexplorer urls. This is used to create the {tx_url} parameter
-block_explorers.mainnet = "https://mempool.space/tx/{txid}"
-block_explorers.testnet = "https://mempool.space/testnet/tx/{txid}"
-block_explorers.signet = "https://mempool.space/signet/tx/{txid}"
-.EE
-
-.PP
-In the subject and body templates, you can use the following parameters:
-
-.RS
-.IP \(bu 2
-\fB{tx_net}\fR: difference between the owned outputs and owned inputs
-.IP \(bu 2
-\fB{wallet}\fR: name of the configured wallet
-.IP \(bu 2
-\fB{total_balance}\fR: total balance of the wallet
-.IP \(bu 2
-\fB{txid}\fR: txid of the transaction
-.IP \(bu 2
-\fB{txid_short}\fR: truncated txid, easier on the eyes
-.IP \(bu 2
-\fB{received}\fR: sum of owned outputs
-.IP \(bu 2
-\fB{sent}\fR: sum of owned inputs
-.IP \(bu 2
-\fB{fee}\fR: transaction fee
-.IP \(bu 2
-\fB{current_height}\fR: current blockheight
-.IP \(bu 2
-\fB{tx_height}\fR: blockheight transaction confirmation
-.IP \(bu 2
-\fB{confs}\fR: number of transaction confirmations (0 for unconfirmed)
-.IP \(bu 2
-\fB{conf_timestamp}\fR: timestamp of the first confirmation in the \fB%Y-%m-%d %H:%M:%S\fR format
-.IP \(bu 2
-\fB{tx_url}\fR: a block explorer URL to the transaction
-
-.RE
-
-.SH Electrum server
-.PP
-By default, public electrum servers will be used. I \fBstrongly suggest
-configuring your own electrum server if you want privacy (as you should)\fP\&.
-
-.PP
-The defaults are:
-
-.EX
-[electrum]
-# Defaults:
-# - mainnet: ssl://fulcrum.sethforprivacy.com:50002
-# - testnet: ssl://electrum.blockstream.info:60002
-# - signet: ssl://mempool.space:60602
-# Use "tcp://" if you are connecting without SSL (e.g. "tcp://localhost:50001"
-# or "tcp://fwafiuesngirdghrdhgiurdhgirdgirdhgrd.onion:50001"
-url = "ssl://fulcrum.sethforprivacy.com:50002"
-# blockchain network ("bitcoin", "testnet", "signet", "regtest")
-network = "bitcoin"
-# Optional socks5 proxy (defaults to None)
-#socks5 = 127.0.0.1:9050
-# If using ssl with a trusted certificate, set this to true
-certificate_validation = false
-.EE
-
-
-.SH Usage
-.PP
-Just run \fBsentrum\fR without arguments (uses default config search paths) or
-\fBsentrum <path/to/config/file>\fR\&.
-
-.PP
-You can pass the \fB--test\fR flag to send a single test notification to all
-configured actions.
-
-.PP
-By default, only new transactions can trigger actions. If you pass
-\fB--notify-past-txs\fR, it will send notifications of past transactions
-in the initial wallet sync. If you have a long transaction history, this will
-spam your notification channels for every transaction.
-
-.SH systemd service
-.PP
-The ideal use-case is as a long running daemon, so it makes sense to configure
-it as a systemd service.
-
-.PP
-If you installed sentrum from the AUR, you just need to edit
-\fB/etc/sentrum/sentrum.conf\fR and do \fBsudo systemclt enable --now sentrum.service\fR
-
-.PP
-If you are installing \fBsentrum\fR manually (e.g. from the releases page or \fBcargo
-install\fR), you should (either from the cloned repository or from inside the
-extracted release archive):
-
-.RS
-.IP "  1." 5
-Copy systemd files to appropriate places:
-
-.RE
-
-.EX
-sudo cp contrib/systemd/sentrum.service
-sudo cp contrib/systemd/sentrum.sysusers /etc/sysusers.d/sentrum.conf
-sudo cp contrib/systemd/sentrum.tmpfiles /etc/tmpfiles.d/sentrum.conf
-.EE
-
-.RS
-.IP "  1." 5
-Reload systemd daemon, sysusers and tmpfiles:
-
-.RE
-
-.EX
-sudo systemclt daemon-reload
-sudo systemd-sysusers
-sudo systemd-tmpfiles --create
-.EE
-
-.RS
-.IP "  1." 5
-Place the \fBsentrum.toml\fR (or \fBsentrum.sample.toml\fR) configuration file in
-\fB/etc/sentrum\fR and make sure the \fBsentrum\fR user owns it:
-
-.RE
-
-.EX
-sudo cp sentrum.toml /etc/sentrum
-sudo chown sentrum:sentrum /etc/sentrum/sentrum.toml
-.EE
-
-.RS
-.IP "  1." 5
-Enable and start the service:
-
-.RE
-
-.EX
-sudo systemclt enable --now sentrum.service
-.EE
-
-.RS
-.IP "  1." 5
-Check if everything is fine with \fBsystemctl status sentrum\fR
-.IP "  2." 5
-Check the logs with \fBjournalctl -fu sentrum\fR
-
-.RE
-
-.SH Docker
-.PP
-To run sentrum using Docker, you can either build the image yourself or use the prebuilt image.
-
-.SS Building the image
-.PP
-To build the image from source, run the following:
-
-.EX
-git clone https://github.com/sommerfelddev/sentrum.git
-cd sentrum
-docker build -t sentrum:local .
-.EE
-
-.PP
-To use the prebuilt image, simply pull from GHCR:
-
-.EX
-docker pull docker pull ghcr.io/sommerfelddev/sentrum:latest
-.EE
-
-.PP
-Note that there are two types of tags:
-
-.PP
-\fBlatest\fR: a tag from the latest commit to master
-\fBx.x.x\fR: (i.e. \fB0.1.1\fR) a tag of the corresponding sentrum version
-
-.SS Running the image
-.PP
-To run the image, simply run the following, passing in the \fBsentrum.toml\fR file you created and configured earlier:
-
-.EX
-docker run --rm -it --volume ./sentrum.toml:/sentrum.toml ghcr.io/sommerfelddev/sentrum:latest
-.EE
-
-.PP
-If using Docker compose, you can configure the service as follows:
-
-.EX
-services:
-  sentrum:
-    container_name: sentrum
-    image: ghcr.io/sommerfelddev/sentrum:latest
-    restart: unless-stopped
-    volumes:
-      - ./sentrum.toml:/sentrum.toml
-.EE
-
-.SH Future Work
-.RS
-.IP \(bu 2
-More action types:
-.RS
-.IP \(bu 2
-Matrix DM
-.IP \(bu 2
-SimpleX chat DM
-.IP \(bu 2
-IRC
-.IP \(bu 2
-XMPP
-.IP \(bu 2
-Whatsapp/Signal using linked devices (harder)
-.IP \(bu 2
-HTTP request
-
-.RE
-
-.IP \(bu 2
-More wallet types:
-.RS
-.IP \(bu 2
-Single Address (blocked by
-https://github.com/bitcoindevkit/bdk/issues/759)
-.IP \(bu 2
-Collections of wallets as a single entity
-
-.RE
-
-.IP \(bu 2
-Notifications for the first tx confirmation and after N confirmations
-.IP \(bu 2
-Filtering notifications by the transaction amounts (e.g. no action for
-transactions smaller than 1M sats)
-.IP \(bu 2
-Debian package (using \fBcargo-deb\fR)
-.IP \(bu 2
-Allow per wallet actions
-.IP \(bu 2
-Support other blockchain backends (bitcoind-rpc, explora, block filters, dojo)
-.IP \(bu 2
-Maybe create a little web UI that helps with writing the configuration
-.IP \(bu 2
-Incentivize node distributions to package sentrum
-
-.RE
diff --git a/man/sentrum.1 b/man/sentrum.1
new file mode 100644
index 0000000..932daca
--- /dev/null
+++ b/man/sentrum.1
@@ -0,0 +1,552 @@
+.nh
+.TH sentrum
+.PP
+
+
+
+
+
+.PP
+Daemon that monitors the Bitcoin blockchain for transactions involving your
+wallets and sends you notifications in many different channels (ntfy push
+notifications, email, telegram, nostr, arbitrary command, etc).
+
+.PP
+Example screenshot of many noifications for a single transaction:
+
+  
+
+
+.SH Installation
+.PP
+Either:
+
+.RS
+.IP \(bu 2
+Compile from source using \fBcargo install sentrum\fR (binary will be installed in
+\fB~/.cargo/bin\fR)
+.IP \(bu 2
+Download the binary from the
+releases page
+\[la]https://github.com/sommerfelddev/sentrum/releases\[ra]
+.IP \(bu 2
+If using archlinux, install it from the AUR:
+sentrum
+\[la]https://aur.archlinux.org/packages/sentrum\[ra],
+sentrum-bin
+\[la]https://aur.archlinux.org/packages/sentrum\-bin\[ra] or
+sentrum-git
+\[la]https://aur.archlinux.org/packages/sentrum\-git\[ra]
+
+.RE
+
+.SH Configuration
+.SS Config file path
+.PP
+It will look for a \fBsentrum.toml\fR configuration file located in any of these
+directories (with this priority):
+
+.RS
+.IP "  1." 5
+Current working directory
+.IP "  2." 5
+\fB$XDG_CONFIG_HOME/sentrum\fR
+.IP "  3." 5
+\fB~/.config/sentrum\fR
+.IP "  4." 5
+\fB/etc/sentrum\fR (more appropriate if running as a systemd service)
+
+.RE
+
+.PP
+Alternatively, you can pass the configuration file path as an argument in the
+invocation and that will override any of the above.
+
+.PP
+\fBStart by copying the sample configuration to where you want it.\fP E.g.
+
+.EX
+cp sentrum.sample.toml sentrum.toml
+sudo cp sentrum.sample.toml /etc/sentrum/sentrum.toml
+.EE
+
+.PP
+or
+
+.EX
+sudo cp sentrum.sample.toml /etc/sentrum/sentrum.toml
+.EE
+
+.SS What to configure
+.PP
+You can use the 
+\[la]sentrum.sample.toml\[ra] file as an
+example.
+Most options have very good defaults so you don't need to change them unless you
+want to. \fBIn the examples below, commented options showcase their defaults,
+unless explicitly said otherwise.\fP
+
+.SS Required
+.RS
+.IP \(bu 2
+\fBwallets\fR: what wallets you want to monitor
+.IP \(bu 2
+\fBactions\fR: what actions you want to take once a relevant transaction is found
+
+.RE
+
+.SS Optional
+.RS
+.IP \(bu 2
+\fBelectrum\fR: by default, public electrum servers are used. You can configure it
+to connect to your own
+.IP \(bu 2
+\fBmessage\fR: this allows you to configure the subject and body templates of the
+notification message and choose the relevant data from the transaction that
+you want to include
+
+.RE
+
+.SH Wallets
+.PP
+For each wallet you want to track, add the following configuration:
+
+.EX
+[[wallets]]
+# Identifier for naming purposes (required)
+name = "alice"
+# Wallet xpub (required)
+xpub = "xpub6CkXHzuU1NyHUFNiQZLq2bgt6QPqjZbwpJ1MDgDeo4bWZ8ZP7HZr7v9WTLCQFhxVhqiJNcw5wSKE77rkAK1SzcuHjt36ZUibBHezGzGL9h9"
+# Script kind ("legacy","nested_segwit","segwit","taproot") (optional)
+#kind = "segwit"
+.EE
+
+.PP
+It assumes a BIP84 (native segwit, \fBbc1\fR style addresses) wallet. If your wallet
+has a different script kind add the field \fBkind = "legacy"\fR (or \fBnested_segwit\fR,
+or \fBtaproot\fR).
+
+.PP
+More complex wallet types are supported by providing \fBprimary = "<desc>"\fR and
+\fBchange = "<desc>"\fR wallet descriptors instead of \fBxpub =\fR and \fBkind =\fR\&.
+
+.SH Actions
+.PP
+For each new relevant transaction, you can take multiple actions. For each
+action you desire to take, you need to add the configuration:
+
+.EX
+[[actions]]
+# Action type (required)
+type =  "<INSERT ACTION KIND>"
+<.... INSERT ACTION SPECIFIC CONFIGURATION HERE...>
+.EE
+
+.PP
+Below we explain the configuration for each action kind. You can have multiple
+actions of the same kind (e.g. you want to send multiple emails from different
+accounts for some reason).
+
+.SS ntfy
+.PP
+This is the best straightforward way to get push notifications on a smartphone.
+
+.RS
+.IP "  1." 5
+Install the android/iOS app following the relevant links in https://ntfy.sh
+.IP "  2." 5
+If you don't run your own ntfy self-hosted server, create an account at
+ntfy.sh
+.IP "  3." 5
+Open the app, give it the needed permissions and configure your account
+credentials
+.IP "  4." 5
+Click on the \fB+\fR button and create a "topic", preferably named \fBsentrum\fR
+since that's what will be used by default.
+
+.RE
+
+.PP
+Then you just need to add the relevant configuration:
+
+.EX
+[[actions]]
+type =  "ntfy"
+# Credentials (required if you use a public server like the default one)
+credentials.username = "<YOUR USERNAME HERE>"
+credentials.password = "<YOUR PASSWORD HERE>"
+# ntfy server (optional)
+#url = "https://ntfy.sh"
+# notification channel name (optional)
+#topic = "sentrum"
+# Proxy used to connect (optional, defaults to None)
+#proxy = "socks5://127.0.0.1:9050"
+# Priority ("max", "high", "default", "low", "min") (optional)
+#priority = "default"
+.EE
+
+.SS nostr
+.PP
+Get notified by a nostr NIP04 encrypted
+DM
+\[la]https://github.com/nostr\-protocol/nips/blob/master/04.md\[ra] (leaks metadata
+but widely supported) or a
+NIP59 GiftWrap sealed sender DM
+\[la]https://github.com/nostr\-protocol/nips/blob/master/59.md\[ra]
+(more private but not supported by many clients). Add:
+
+.EX
+[[actions]]
+type = "nostr"
+# Which npub to send the DM (required)
+recipient = "<YOUR npub, hex pubkey, nprofile or nip05>"
+# If NIP59 giftwrap DMs should be used instead of NIP04 (optional)
+#sealed_dm = false
+# Which relays to use to send DMs
+#relays = ["wss://nostr.bitcoiner.social", "wss://nostr.oxtr.dev", "wss://nostr.orangepill.dev", "wss://relay.damus.io"]
+.EE
+
+.SS email
+.PP
+You need to add the configuration below and essentially configure an
+authenticated connection to your email provider's SMTP server. I cannot help you
+out with every provider's weird rules (maybe you need to allow 3rd party apps
+for gmail, who knows).
+
+.EX
+[[actions]]
+type =  "email"
+# SMTP server (required)
+server = "<insert smtp server url (e.g. smtp.gmail.com)"
+# SMTP connection type ("tls", "starttls" or "plain") (optional)
+#connection = "tls"
+# SMTP port (optional, defaults to 587 for TLS, 465 for STARTTLS and 25 for plain connections
+#port = 1025
+# SMTP credentials (required in most cases)
+credentials.authentication_identity = "<insert login email>"
+credentials.secret = "<insert password>"
+# Accept self signed certificates (needed if you are using protonmail-bridge) (optional)
+#self_signed_cert = false
+# Configure sender (required)
+from = "sentrum <youremailhere@host.tld>"
+# Configure recipient (optional, defaults to the same as the "from" sender)
+#to = "sentrum <youremailhere@host.tld>"
+.EE
+
+.SS telegram
+.RS
+.IP "  1." 5
+Create a new bot using @Botfather
+\[la]https://t.me/botfather\[ra] to get a token in the format \fB123456789:blablabla\fR\&.
+.IP "  2." 5
+Optionally configure the bot (name, profile pic, etc) with @Botfather
+.IP "  3." 5
+Open a chat with your bot
+.IP "  4." 5
+Add the relevant config:
+
+.RE
+
+.EX
+[[actions]]
+type =  "telegram"
+# Auth token of the bot created with @Botfather (required)
+bot_token = "<insert bot token>"
+# 10-digit user id of the DM recipient, go to your profile to get it (required)
+user_id = 1234567890
+.EE
+
+.SS command
+.PP
+Runs an external command where you can use transaction details as arguments.
+You can check what parameters (such as \fB{wallet}\fR or \fB{tx_net}\fR you can use in
+the message
+\[la]#message\[ra] configuration, since they are the same.
+
+.EX
+[[actions]]
+type = "command"
+cmd = "notify-send"
+args = ["[{wallet}] new tx: {tx_net} sats"]
+.EE
+
+.SS terminal_print
+.PP
+Justs prints the notification text in the terminal. You can potentially pipe it
+to something else.
+
+.EX
+[[actions]]
+type =  "terminal_print"
+.EE
+
+.SS desktop_notification
+.PP
+Displays the transaction message as a native desktop notification on the same
+computer sentrum is running.
+
+.EX
+[[actions]]
+type =  "desktop_notification"
+.EE
+
+.SH Message
+.PP
+You can configure the message template and it applies to almost every action
+type. This configuration is entirely optional since the default templates will
+be used if omitted.
+
+.PP
+Here is the default template:
+
+.EX
+[message]
+subject = "[{wallet}] new transaction"
+body = "net: {tx_net} sats, balance: {total_balance} sats, txid: {txid_short}"
+# Can be "plain", "markdown" or "html"
+format = "plain"
+# Configure blockexplorer urls. This is used to create the {tx_url} parameter
+block_explorers.mainnet = "https://mempool.space/tx/{txid}"
+block_explorers.testnet = "https://mempool.space/testnet/tx/{txid}"
+block_explorers.signet = "https://mempool.space/signet/tx/{txid}"
+.EE
+
+.PP
+In the subject and body templates, you can use the following parameters:
+
+.RS
+.IP \(bu 2
+\fB{tx_net}\fR: difference between the owned outputs and owned inputs
+.IP \(bu 2
+\fB{wallet}\fR: name of the configured wallet
+.IP \(bu 2
+\fB{total_balance}\fR: total balance of the wallet
+.IP \(bu 2
+\fB{txid}\fR: txid of the transaction
+.IP \(bu 2
+\fB{txid_short}\fR: truncated txid, easier on the eyes
+.IP \(bu 2
+\fB{received}\fR: sum of owned outputs
+.IP \(bu 2
+\fB{sent}\fR: sum of owned inputs
+.IP \(bu 2
+\fB{fee}\fR: transaction fee
+.IP \(bu 2
+\fB{current_height}\fR: current blockheight
+.IP \(bu 2
+\fB{tx_height}\fR: blockheight transaction confirmation
+.IP \(bu 2
+\fB{confs}\fR: number of transaction confirmations (0 for unconfirmed)
+.IP \(bu 2
+\fB{conf_timestamp}\fR: timestamp of the first confirmation in the \fB%Y-%m-%d %H:%M:%S\fR format
+.IP \(bu 2
+\fB{tx_url}\fR: a block explorer URL to the transaction
+
+.RE
+
+.SH Electrum server
+.PP
+By default, public electrum servers will be used. I \fBstrongly suggest
+configuring your own electrum server if you want privacy (as you should)\fP\&.
+
+.PP
+The defaults are:
+
+.EX
+[electrum]
+# Defaults:
+# - mainnet: ssl://fulcrum.sethforprivacy.com:50002
+# - testnet: ssl://electrum.blockstream.info:60002
+# - signet: ssl://mempool.space:60602
+# Use "tcp://" if you are connecting without SSL (e.g. "tcp://localhost:50001"
+# or "tcp://fwafiuesngirdghrdhgiurdhgirdgirdhgrd.onion:50001"
+url = "ssl://fulcrum.sethforprivacy.com:50002"
+# blockchain network ("bitcoin", "testnet", "signet", "regtest")
+network = "bitcoin"
+# Optional socks5 proxy (defaults to None)
+#socks5 = 127.0.0.1:9050
+# If using ssl with a trusted certificate, set this to true
+certificate_validation = false
+.EE
+
+
+.SH Usage
+.PP
+Just run \fBsentrum\fR without arguments (uses default config search paths) or
+\fBsentrum <path/to/config/file>\fR\&.
+
+.PP
+You can pass the \fB--test\fR flag to send a single test notification to all
+configured actions.
+
+.PP
+By default, only new transactions can trigger actions. If you pass
+\fB--notify-past-txs\fR, it will send notifications of past transactions
+in the initial wallet sync. If you have a long transaction history, this will
+spam your notification channels for every transaction.
+
+.SH systemd service
+.PP
+The ideal use-case is as a long running daemon, so it makes sense to configure
+it as a systemd service.
+
+.PP
+If you installed sentrum from the AUR, you just need to edit
+\fB/etc/sentrum/sentrum.conf\fR and do \fBsudo systemclt enable --now sentrum.service\fR
+
+.PP
+If you are installing \fBsentrum\fR manually (e.g. from the releases page or \fBcargo
+install\fR), you should (either from the cloned repository or from inside the
+extracted release archive):
+
+.RS
+.IP "  1." 5
+Copy systemd files to appropriate places:
+
+.RE
+
+.EX
+sudo cp contrib/systemd/sentrum.service
+sudo cp contrib/systemd/sentrum.sysusers /etc/sysusers.d/sentrum.conf
+sudo cp contrib/systemd/sentrum.tmpfiles /etc/tmpfiles.d/sentrum.conf
+.EE
+
+.RS
+.IP "  1." 5
+Reload systemd daemon, sysusers and tmpfiles:
+
+.RE
+
+.EX
+sudo systemclt daemon-reload
+sudo systemd-sysusers
+sudo systemd-tmpfiles --create
+.EE
+
+.RS
+.IP "  1." 5
+Place the \fBsentrum.toml\fR (or \fBsentrum.sample.toml\fR) configuration file in
+\fB/etc/sentrum\fR and make sure the \fBsentrum\fR user owns it:
+
+.RE
+
+.EX
+sudo cp sentrum.toml /etc/sentrum
+sudo chown sentrum:sentrum /etc/sentrum/sentrum.toml
+.EE
+
+.RS
+.IP "  1." 5
+Enable and start the service:
+
+.RE
+
+.EX
+sudo systemclt enable --now sentrum.service
+.EE
+
+.RS
+.IP "  1." 5
+Check if everything is fine with \fBsystemctl status sentrum\fR
+.IP "  2." 5
+Check the logs with \fBjournalctl -fu sentrum\fR
+
+.RE
+
+.SH Docker
+.PP
+To run sentrum using Docker, you can either build the image yourself or use the prebuilt image.
+
+.SS Building the image
+.PP
+To build the image from source, run the following:
+
+.EX
+git clone https://github.com/sommerfelddev/sentrum.git
+cd sentrum
+docker build -t sentrum:local .
+.EE
+
+.PP
+To use the prebuilt image, simply pull from GHCR:
+
+.EX
+docker pull docker pull ghcr.io/sommerfelddev/sentrum:latest
+.EE
+
+.PP
+Note that there are two types of tags:
+
+.PP
+\fBlatest\fR: a tag from the latest commit to master
+\fBx.x.x\fR: (i.e. \fB0.1.1\fR) a tag of the corresponding sentrum version
+
+.SS Running the image
+.PP
+To run the image, simply run the following, passing in the \fBsentrum.toml\fR file you created and configured earlier:
+
+.EX
+docker run --rm -it --volume ./sentrum.toml:/sentrum.toml ghcr.io/sommerfelddev/sentrum:latest
+.EE
+
+.PP
+If using Docker compose, you can configure the service as follows:
+
+.EX
+services:
+  sentrum:
+    container_name: sentrum
+    image: ghcr.io/sommerfelddev/sentrum:latest
+    restart: unless-stopped
+    volumes:
+      - ./sentrum.toml:/sentrum.toml
+.EE
+
+.SH Future Work
+.RS
+.IP \(bu 2
+More action types:
+.RS
+.IP \(bu 2
+Matrix DM
+.IP \(bu 2
+SimpleX chat DM
+.IP \(bu 2
+IRC
+.IP \(bu 2
+XMPP
+.IP \(bu 2
+Whatsapp/Signal using linked devices (harder)
+.IP \(bu 2
+HTTP request
+
+.RE
+
+.IP \(bu 2
+More wallet types:
+.RS
+.IP \(bu 2
+Single Address (blocked by
+https://github.com/bitcoindevkit/bdk/issues/759)
+.IP \(bu 2
+Collections of wallets as a single entity
+
+.RE
+
+.IP \(bu 2
+Notifications for the first tx confirmation and after N confirmations
+.IP \(bu 2
+Filtering notifications by the transaction amounts (e.g. no action for
+transactions smaller than 1M sats)
+.IP \(bu 2
+Debian package (using \fBcargo-deb\fR)
+.IP \(bu 2
+Allow per wallet actions
+.IP \(bu 2
+Support other blockchain backends (bitcoind-rpc, explora, block filters, dojo)
+.IP \(bu 2
+Maybe create a little web UI that helps with writing the configuration
+.IP \(bu 2
+Incentivize node distributions to package sentrum
+
+.RE
-- 
cgit v1.2.3-70-g09d2