From 19d2a46457d19a3f8580884e6c667b033e78d762 Mon Sep 17 00:00:00 2001
From: Philipp Heckel <pheckel@datto.com>
Date: Mon, 9 May 2022 19:46:32 -0400
Subject: [PATCH] Build for Windows

---
 .goreleaser.yml       | 37 ++++++++++++-------
 Makefile              | 84 ++++++++++++++++++++++---------------------
 docs/develop.md       | 32 +++++++++--------
 docs/subscribe/cli.md | 23 ++++++------
 4 files changed, 98 insertions(+), 78 deletions(-)

diff --git a/.goreleaser.yml b/.goreleaser.yml
index d41eae78..42b5554c 100644
--- a/.goreleaser.yml
+++ b/.goreleaser.yml
@@ -4,7 +4,7 @@ before:
     - go mod tidy
 builds:
   -
-    id: ntfy_amd64
+    id: ntfy_linux_amd64
     binary: ntfy
     env:
       - CGO_ENABLED=1 # required for go-sqlite3
@@ -17,7 +17,7 @@ builds:
       post:
         - upx "{{ .Path }}" # apt install upx
   -
-    id: ntfy_armv6
+    id: ntfy_linux_armv6
     binary: ntfy
     env:
       - CGO_ENABLED=1 # required for go-sqlite3
@@ -28,10 +28,9 @@ builds:
     goos: [linux]
     goarch: [arm]
     goarm: [6]
-    # No "upx", since it causes random core dumps, see
-    # https://github.com/binwiederhier/ntfy/issues/191#issuecomment-1083406546
+    # No "upx" for ARM, see https://github.com/binwiederhier/ntfy/issues/191#issuecomment-1083406546
   -
-    id: ntfy_armv7
+    id: ntfy_linux_armv7
     binary: ntfy
     env:
       - CGO_ENABLED=1 # required for go-sqlite3
@@ -42,10 +41,9 @@ builds:
     goos: [linux]
     goarch: [arm]
     goarm: [7]
-    # No "upx", since it causes random core dumps, see
-    # https://github.com/binwiederhier/ntfy/issues/191#issuecomment-1083406546
+    # No "upx" for ARM, see https://github.com/binwiederhier/ntfy/issues/191#issuecomment-1083406546
   -
-    id: ntfy_arm64
+    id: ntfy_linux_arm64
     binary: ntfy
     env:
       - CGO_ENABLED=1 # required for go-sqlite3
@@ -55,14 +53,12 @@ builds:
       - "-linkmode=external -extldflags=-static -s -w -X main.version={{.Version}} -X main.commit={{.Commit}} -X main.date={{.Date}}"
     goos: [linux]
     goarch: [arm64]
-    # No "upx", since it causes random core dumps, see
-    # https://github.com/binwiederhier/ntfy/issues/191#issuecomment-1083406546
+    # No "upx" for ARM, see https://github.com/binwiederhier/ntfy/issues/191#issuecomment-1083406546
   -
     id: ntfy_windows_amd64
     binary: ntfy
     env:
       - CGO_ENABLED=0 # explicitly disable, since we don't need go-sqlite3
-    tags: []
     ldflags:
       - "-X main.version={{.Version}} -X main.commit={{.Commit}} -X main.date={{.Date}}"
     goos: [windows]
@@ -107,6 +103,12 @@ nfpms:
       postremove: "scripts/postrm.sh"
 archives:
   -
+    id: ntfy_linux
+    builds:
+      - ntfy_linux_amd64
+      - ntfy_linux_armv6
+      - ntfy_linux_armv7
+      - ntfy_linux_arm64
     wrap_in_directory: true
     files:
       - LICENSE
@@ -116,7 +118,18 @@ archives:
       - client/client.yml
       - client/ntfy-client.service
     replacements:
-      386: i386
+      amd64: x86_64
+  -
+    id: ntfy_windows
+    builds:
+      - ntfy_windows_amd64
+    format: zip
+    wrap_in_directory: true
+    files:
+      - LICENSE
+      - README.md
+      - client/client.yml
+    replacements:
       amd64: x86_64
 checksum:
   name_template: 'checksums.txt'
diff --git a/Makefile b/Makefile
index 8a5d9c32..375b6523 100644
--- a/Makefile
+++ b/Makefile
@@ -5,8 +5,8 @@ VERSION := $(shell git describe --tag)
 help:
 	@echo "Typical commands (more see below):"
 	@echo "  make build                   - Build web app, documentation and server/client (sloowwww)"
-	@echo "  make server-amd64            - Build server/client binary (amd64, no web app or docs)"
-	@echo "  make install-amd64           - Install ntfy binary to /usr/bin/ntfy (amd64)"
+	@echo "  make cli-linux-amd64         - Build server/client binary (amd64, no web app or docs)"
+	@echo "  make install-linux-amd64     - Install ntfy binary to /usr/bin/ntfy (amd64)"
 	@echo "  make web                     - Build the web app"
 	@echo "  make docs                    - Build the documentation"
 	@echo "  make check                   - Run all tests, vetting/formatting checks and linters"
@@ -16,11 +16,12 @@ help:
 	@echo "  make clean                   - Clean build/dist folders"
 	@echo
 	@echo "Build server & client (not release version):"
-	@echo "  make server                  - Build server & client (all architectures)"
-	@echo "  make server-amd64            - Build server & client (amd64 only)"
-	@echo "  make server-armv6            - Build server & client (armv6 only)"
-	@echo "  make server-armv7            - Build server & client (armv7 only)"
-	@echo "  make server-arm64            - Build server & client (arm64 only)"
+	@echo "  make cli                     - Build server & client (all architectures)"
+	@echo "  make cli-linux-amd64         - Build server & client (Linux, amd64 only)"
+	@echo "  make cli-linux-armv6         - Build server & client (Linux, armv6 only)"
+	@echo "  make cli-linux-armv7         - Build server & client (Linux, armv7 only)"
+	@echo "  make cli-linux-arm64         - Build server & client (Linux, arm64 only)"
+	@echo "  make cli-windows-amd64       - Build client (Windows, amd64 only)"
 	@echo
 	@echo "Build web app:"
 	@echo "  make web                     - Build the web app"
@@ -51,14 +52,14 @@ help:
 	@echo "  make release-snapshot        - Create a test release"
 	@echo
 	@echo "Install locally (requires sudo):"
-	@echo "  make install-amd64           - Copy amd64 binary from dist/ to /usr/bin/ntfy"
-	@echo "  make install-armv6           - Copy armv6 binary from dist/ to /usr/bin/ntfy"
-	@echo "  make install-armv7           - Copy armv7 binary from dist/ to /usr/bin/ntfy"
-	@echo "  make install-arm64           - Copy arm64 binary from dist/ to /usr/bin/ntfy"
-	@echo "  make install-deb-amd64       - Install .deb from dist/ (amd64 only)"
-	@echo "  make install-deb-armv6       - Install .deb from dist/ (armv6 only)"
-	@echo "  make install-deb-armv7       - Install .deb from dist/ (armv7 only)"
-	@echo "  make install-deb-arm64       - Install .deb from dist/ (arm64 only)"
+	@echo "  make install-linux-amd64     - Copy amd64 binary from dist/ to /usr/bin/ntfy"
+	@echo "  make install-linux-armv6     - Copy armv6 binary from dist/ to /usr/bin/ntfy"
+	@echo "  make install-linux-armv7     - Copy armv7 binary from dist/ to /usr/bin/ntfy"
+	@echo "  make install-linux-arm64     - Copy arm64 binary from dist/ to /usr/bin/ntfy"
+	@echo "  make install-linux-deb-amd64 - Install .deb from dist/ (amd64 only)"
+	@echo "  make install-linux-deb-armv6 - Install .deb from dist/ (armv6 only)"
+	@echo "  make install-linux-deb-armv7 - Install .deb from dist/ (armv7 only)"
+	@echo "  make install-linux-deb-arm64 - Install .deb from dist/ (arm64 only)"
 
 
 # Building everything
@@ -101,36 +102,39 @@ web-build:
 
 # Main server/client build
 
-server: server-deps
+cli: cli-deps
 	goreleaser build --snapshot --rm-dist --debug
 
-server-amd64: server-deps-static-sites
-	goreleaser build --snapshot --rm-dist --debug --id ntfy_amd64
+cli-linux-amd64: cli-deps-static-sites
+	goreleaser build --snapshot --rm-dist --debug --id ntfy_linux_amd64
 
-server-armv6: server-deps-static-sites server-deps-gcc-armv6-armv7
-	goreleaser build --snapshot --rm-dist --debug --id ntfy_armv6
+cli-linux-armv6: cli-deps-static-sites cli-deps-gcc-armv6-armv7
+	goreleaser build --snapshot --rm-dist --debug --id ntfy_linux_armv6
 
-server-armv7: server-deps-static-sites server-deps-gcc-armv6-armv7
-	goreleaser build --snapshot --rm-dist --debug --id ntfy_armv7
+cli-linux-armv7: cli-deps-static-sites cli-deps-gcc-armv6-armv7
+	goreleaser build --snapshot --rm-dist --debug --id ntfy_linux_armv7
 
-server-arm64: server-deps-static-sites server-deps-gcc-arm64
-	goreleaser build --snapshot --rm-dist --debug --id ntfy_arm64
+cli-linux-arm64: cli-deps-static-sites cli-deps-gcc-arm64
+	goreleaser build --snapshot --rm-dist --debug --id ntfy_linux_arm64
 
-server-deps: server-deps-static-sites server-deps-all server-deps-gcc
+cli-windows-amd64: cli-deps-static-sites
+	goreleaser build --snapshot --rm-dist --debug --id ntfy_windows_amd64
 
-server-deps-gcc: server-deps-gcc-armv6-armv7 server-deps-gcc-arm64
+cli-deps: cli-deps-static-sites cli-deps-all cli-deps-gcc
 
-server-deps-static-sites:
+cli-deps-gcc: cli-deps-gcc-armv6-armv7 cli-deps-gcc-arm64
+
+cli-deps-static-sites:
 	mkdir -p server/docs server/site
 	touch server/docs/index.html server/site/app.html
 
-server-deps-all:
+cli-deps-all:
 	which upx || { echo "ERROR: upx not installed. On Ubuntu, run: apt install upx"; exit 1; }
 
-server-deps-gcc-armv6-armv7:
+cli-deps-gcc-armv6-armv7:
 	which arm-linux-gnueabi-gcc || { echo "ERROR: ARMv6/ARMv7 cross compiler not installed. On Ubuntu, run: apt install gcc-arm-linux-gnueabi"; exit 1; }
 
-server-deps-gcc-arm64:
+cli-deps-gcc-arm64:
 	which aarch64-linux-gnu-gcc || { echo "ERROR: ARM64 cross compiler not installed. On Ubuntu, run: apt install gcc-aarch64-linux-gnu"; exit 1; }
 
 
@@ -184,10 +188,10 @@ staticcheck: .PHONY
 
 # Releasing targets
 
-release: clean server-deps release-check-tags docs web check
+release: clean cli-deps release-check-tags docs web check
 	goreleaser release --rm-dist --debug
 
-release-snapshot: clean server-deps docs web check
+release-snapshot: clean cli-deps docs web check
 	goreleaser release --snapshot --skip-publish --rm-dist --debug
 
 release-check-tags:
@@ -204,31 +208,31 @@ release-check-tags:
 
 # Installing targets
 
-install-amd64: remove-binary
+install-linux-amd64: remove-binary
 	sudo cp -a dist/ntfy_amd64_linux_amd64_v1/ntfy /usr/bin/ntfy
 
-install-armv6: remove-binary
+install-linux-armv6: remove-binary
 	sudo cp -a dist/ntfy_armv6_linux_arm_6/ntfy /usr/bin/ntfy
 
-install-armv7: remove-binary
+install-linux-armv7: remove-binary
 	sudo cp -a dist/ntfy_armv7_linux_arm_7/ntfy /usr/bin/ntfy
 
-install-arm64: remove-binary
+install-linux-arm64: remove-binary
 	sudo cp -a dist/ntfy_arm64_linux_arm64/ntfy /usr/bin/ntfy
 
 remove-binary:
 	sudo rm -f /usr/bin/ntfy
 
-install-amd64-deb: purge-package
+install-linux-amd64-deb: purge-package
 	sudo dpkg -i dist/ntfy_*_linux_amd64.deb
 
-install-armv6-deb: purge-package
+install-linux-armv6-deb: purge-package
 	sudo dpkg -i dist/ntfy_*_linux_armv6.deb
 
-install-armv7-deb: purge-package
+install-linux-armv7-deb: purge-package
 	sudo dpkg -i dist/ntfy_*_linux_armv7.deb
 
-install-arm64-deb: purge-package
+install-linux-arm64-deb: purge-package
 	sudo dpkg -i dist/ntfy_*_linux_arm64.deb
 
 purge-package:
diff --git a/docs/develop.md b/docs/develop.md
index 6de4af2b..61ae9b17 100644
--- a/docs/develop.md
+++ b/docs/develop.md
@@ -112,8 +112,8 @@ by typing `make`:
 $ make 
 Typical commands (more see below):
   make build                   - Build web app, documentation and server/client (sloowwww)
-  make server-amd64            - Build server/client binary (amd64, no web app or docs)
-  make install-amd64           - Install ntfy binary to /usr/bin/ntfy (amd64)
+  make cli-linux-amd64         - Build server/client binary (amd64, no web app or docs)
+  make install-linux-amd64     - Install ntfy binary to /usr/bin/ntfy (amd64)
   make web                     - Build the web app
   make docs                    - Build the documentation
   make check                   - Run all tests, vetting/formatting checks and linters
@@ -158,45 +158,47 @@ $ make release-snapshot
 During development, you may want to be more picky and build only certain things. Here are a few examples.
 
 ### Build the ntfy binary
-To build only the `ntfy` binary **without the web app or documentation**, use the `make server-...` targets:
+To build only the `ntfy` binary **without the web app or documentation**, use the `make cli-...` targets:
 
 ``` shell
 $ make
 Build server & client (not release version):
-  make server                  - Build server & client (all architectures)
-  make server-amd64            - Build server & client (amd64 only)
-  make server-armv7            - Build server & client (armv7 only)
-  make server-arm64            - Build server & client (arm64 only)
+  make cli                     - Build server & client (all architectures)
+  make cli-linux-amd64         - Build server & client (Linux, amd64 only)
+  make cli-linux-armv6         - Build server & client (Linux, armv6 only)
+  make cli-linux-armv7         - Build server & client (Linux, armv7 only)
+  make cli-linux-arm64         - Build server & client (Linux, arm64 only)
+  make cli-windows-amd64       - Build client (Windows, amd64 only)
 ```
 
-So if you're on an amd64/x86_64-based machine, you may just want to run `make server-amd64` during testing. On a modern
-system, this shouldn't take longer than 5-10 seconds. I often combine it with `install-amd64` so I can run the binary
+So if you're on an amd64/x86_64-based machine, you may just want to run `make cli-linux-amd64` during testing. On a modern
+system, this shouldn't take longer than 5-10 seconds. I often combine it with `install-linux-amd64` so I can run the binary
 right away:
 
 ``` shell
-$ make server-amd64 install-amd64
+$ make cli-linux-amd64 install-linux-amd64
 $ ntfy serve
 ```
 
 **During development of the main app, you can also just use `go run main.go`**, as long as you run 
-`make server-deps-static-sites`at least once and `CGO_ENABLED=1`:
+`make cli-deps-static-sites`at least once and `CGO_ENABLED=1`:
 
 ``` shell
 $ export CGO_ENABLED=1
-$ make server-deps-static-sites
+$ make cli-deps-static-sites
 $ go run main.go serve
 2022/03/18 08:43:55 Listening on :2586[http]
 ...
 ```
 
-If you don't run `server-deps-static-sites`, you may see an error *`pattern ...: no matching files found`*:
+If you don't run `cli-deps-static-sites`, you may see an error *`pattern ...: no matching files found`*:
 ```
 $ go run main.go serve
 server/server.go:85:13: pattern docs: no matching files found
 ```
 
 This is because we use `go:embed` to embed the documentation and web app, so the Go code expects files to be
-present at `server/docs` and `server/site`. If they are not, you'll see the above error. The `server-deps-static-sites`
+present at `server/docs` and `server/site`. If they are not, you'll see the above error. The `cli-deps-static-sites`
 target creates dummy files that ensures that you'll be able to build.
 
 
@@ -210,7 +212,7 @@ $ make web
 ```
 
 This will build the web app using Create React App and then **copy the production build to the `server/site` folder**, so 
-that when you `make server` (or `make server-amd64`, ...), you will have the web app included in the `ntfy` binary.
+that when you `make cli` (or `make cli-linux-amd64`, ...), you will have the web app included in the `ntfy` binary.
 
 If you're developing on the web app, it's best to just `cd web` and run `npm start` manually. This will open your browser
 at `http://127.0.0.1:3000` with the web app, and as you edit the source files, they will be recompiled and the browser 
diff --git a/docs/subscribe/cli.md b/docs/subscribe/cli.md
index 85468166..8e5709f9 100644
--- a/docs/subscribe/cli.md
+++ b/docs/subscribe/cli.md
@@ -123,7 +123,7 @@ which will read the `subscribe` config from the config file. Please also check o
 
 Here's an example config file that subscribes to three different topics, executing a different command for each of them:
 
-=== "~/.config/ntfy/client.yml"
+=== "~/.config/ntfy/client.yml (Linux)"
     ```yaml
     subscribe:
     - topic: echo-this
@@ -145,26 +145,27 @@ Here's an example config file that subscribes to three different topics, executi
             fi
     ```
 
-    === "%AppData%\ntfy\client.yml"
-    ```
+=== "%AppData%\ntfy\client.yml (Windows)"
+    ```yaml
     subscribe:
     - topic: echo-this
       command: 'echo Message received: %message%'
-    - topic: calc
-      command: calc
+    - topic: alerts
+      command: |
+        notifu /m "%NTFY_MESSAGE%"
+        exit 0
       if:
         priority: high,urgent
-    - topic: toastthis
-      command: |
-        notifu /p "a title: %NTFY_TITLE%" /m "%NTFY_MESSAGE%"
-        exit 0
+    - topic: calc
+      command: calc
     ```
 
 In this example, when `ntfy subscribe --from-config` is executed:
 
 * Messages to `echo-this` simply echos to standard out
-* Messages to `alerts` display as desktop notification for high priority messages using [notify-send](https://manpages.ubuntu.com/manpages/focal/man1/notify-send.1.html)
-* Messages to `calc` open the gnome calculator 😀 (*because, why not*)
+* Messages to `alerts` display as desktop notification for high priority messages using [notify-send](https://manpages.ubuntu.com/manpages/focal/man1/notify-send.1.html) (Linux) 
+  or [notifu](https://www.paralint.com/projects/notifu/) (Windows) 
+* Messages to `calc` open the calculator 😀 (*because, why not*)
 * Messages to `print-temp` execute an inline script and print the CPU temperature (Linux version only)
 
 I hope this shows how powerful this command is. Here's a short video that demonstrates the above example: