Menu
About me Kontakt

Build Your Own Notification System for Smartphones/Computers (video, 32 minutes)

In today's video, Open Source Advocate discusses one of the more fascinating topics - push notifications, which can be a key tool in automation and information management. We've seen many ways to achieve them, but Advocate points to the Intify service, also known as ntfy.sh, which allows for convenient notification management. As an alternative to popular systems like Rocket Chat, ntfy.sh offers a simple and flexible configuration, ideal for both beginners and more advanced users. Advocate emphasizes the importance of having proper mechanisms to monitor our tasks and reminders, something that can be easily achieved through ntfy.sh.

Advocate also shares his personal experiences with using ntfy.sh on client servers by utilizing webhooks to notify when tasks like backups are completed. This allows him to react quickly in case of issues. He discusses the simplicity of practical usage of ntfy, highlighting its availability across various operating systems - from Debian/Ubuntu to MacOS and Windows - making it a versatile tool for developers and administrators.

There was also a practical demonstration of the installation of ntfy.sh, where Advocate walks through how to set up a Docker server and how to use various commands to publish messages. The demonstration clearly shows how to select a topic, send a notification, and receive messages on a phone, which is crucial for the effectiveness of this tool. Interestingly, Open Source Advocate encourages exploration of the documentation, which is very well-crafted, making it easy for users of any level to quickly implement this solution.

Advocate also highlights security as a key element in using ntfy.sh – particularly important in today's world. Various aspects are discussed, like the use of SSL certificates and options for creating private topics accessible only to selected users. This flexibility makes ntfy.sh an ideal solution for individuals or teams seeking to manage communication efficiently in a secure manner.

In conclusion, Open Source Advocate thanks his subscribers and points out the statistics related to the video - at the time of writing this article, the video has garnered 124837 views and 3640 likes. This demonstrates how much people value such content and how important it is in the world of open-source technology. He also encourages subscriptions and comments, emphasizing that his work aims to help others discover the potential of open software.

Toggle timeline summary

  • 00:00 Introduction by the Open Source Advocate discussing push notifications.
  • 00:12 Overview of various options for push notifications.
  • 00:26 Challenges with using Rocket Chat's notification service.
  • 00:35 Introduction to Home Assistant and other projects for push notifications.
  • 00:50 Welcome to Intify/Notify, a command line tool for sending notifications.
  • 01:07 Using Intify to send messages from a client's server.
  • 01:28 Integration of Intify with Rocket Chat for notifications.
  • 01:53 Introduction to ntfy.sh, part of the Intify initiative.
  • 02:08 Setting up notifications on iOS using ntfy.sh.
  • 02:17 Acknowledgment to subscribers and support for the channel.
  • 02:26 Encouragement to subscribe and engage with the content.
  • 02:49 Transitioning to technical setup for Intify.
  • 02:56 Discussion on using Docker or Linux binaries to install Intify.
  • 03:17 Overview of installation options for various operating systems.
  • 04:04 Setting up a test server for notifications.
  • 04:21 Explaining the necessity of SSL certification for iOS notifications.
  • 04:43 Creating topics for message subscriptions.
  • 04:56 Demonstrating message publishing with Intify.
  • 06:06 Subscribing to a message topic and demonstrating notifications.
  • 06:42 Explaining message handling and delivery to subscribed devices.
  • 07:42 Navigating the sending of notifications from a terminal.
  • 17:08 Launching Docker and configuring the notification server.
  • 18:10 Starting the ntfy server and checking listener settings.
  • 19:40 Setting up NGINX Proxy Manager for SSL configuration.
  • 20:51 Setting up mobile notifications and server URLs.
  • 26:30 Demonstrating message receipt on a mobile device.
  • 31:00 Closing thoughts and encouragement to engage with open source.

Transcription

It's your Open Source Advocate and I'm back with another video and today I wanted to talk about push notifications. So I've shown you lots of different ways that you can accomplish kind of your own rolled push notifications. You could use something like Rocket Chat and use their push notification service, but they're starting to crack down on that more and understand that, right? You can get tons and tons of people up taking something and using your push notification server, which means you've got to run a more beefy server. So I can get that. So I was looking for other options and I've shown you Home Assistant does push notifications, which is awesome. There's just tons of things out there. There's a project called Apprise that I want to cover in the future, but I was just kind of looking around to see what else was there and I came across Intify or Notify, I think is really how it's pronounced, but I say Intify, N-T-F-Y is what it is. And I've shown you this in the past. I showed you this a long time ago. It's a command line tool that you can use to send messages. And I've actually been using the webhook version of that to send myself messages from a client's server when it finishes a backup process every night so that I get a notification on my phone in the morning and I realize, hey, it worked. That's great. If it didn't work, it sends me a message to let me know like, hey, something didn't happen that should have, so I can check in and see what's going on. But most of the time, I just get the, hey, it worked, which is awesome. Now, I do that through Rocket Chat. I just have a channel that I created that's private and it sends it through a webhook to Rocket Chat, which is great. I do a similar thing with my uptime Kuma, where I have it send a webhook request also to the Rocket Chat server, so if something goes down, it sends me that, but I get it. The Rocket Chat guys are kind of like, hey, we're getting, you know, too much stuff going on that might take away that server at some point. So I was looking for something different and I found ntfy.sh, which is part of that Intify program, and they've got push notifications made easy, and you can kind of see a little running thing over here of what it looks like, and they've got it for Google Play, F-Droid, and the App Store for iOS. There is a little bit of setup to make it work with iOS, so I want to go through that today and I'm going to go through how to set this up, and it's really not that difficult. I want to say thank you to all of my subscribers and all of my patrons over at Patreon. Seriously, you guys make this so worth it for me to do these videos every week. I really, truly enjoy it, and I just can't say thank you enough. If you're enjoying these videos, subscribe. Let YouTube know that I'm doing a good job by subscribing to the channel, plus you'll get notified when I have new videos coming out. And finally, if you're enjoying what I'm doing, give it a like, just click on that thumbs up, and that way YouTube knows that you like it, and they'll pass it along to other people that might enjoy my content as well. I really appreciate it. Thank you again. Let's get started. I'm going to do the Docker version, but look here, there's Linux binaries. I know there's a lot of you guys, or there's some of you guys who don't like Docker and don't want to use that. You just want to install it straight up. So here's Linux binaries. Here's Debian Ubuntu repositories. If you keep going down, you've got Fedora, RHEL, CentOS, Alma, Rocky repositories. You've got Arch Linux if you want to do it that way. If you use NixOS or the Nix Package Manager, you've got that option as well. MacOS, and if you're on Windows, you can use Scoop to do it from there, so pretty cool. But Docker, again, that's just my preferred way, so he's got some really great examples. The documentation on this is absolutely terrific, so I definitely want to make sure to point that out. If you guys are looking for answers, if you've got questions, the documentation on here is really, really good. It breaks everything down. I've been reading through it for the last few days, trying to get everything put together for the video. There's even Kubernetes support, so if you like to run Kubernetes, you've got options there as well. So I think really, really cool, but I just wanted to go through kind of what this does and how it works. So before I get into the installation and setup, I wanted to show you what it can do. So I've already set up a test server. I'm going to go through setting up another server with you guys, but I've got this test server that I've set up, and I've got a domain pointed at it, which makes it, to me, more useful. You can do this locally if you want to, but push notifications get a little bit more tricky when you do that. You really need to have a CA-signed SSL certification on your domain so that you can get those push notifications to go through, at least on iOS. So yeah, so I've got these two topics that I've created. So one is called Brian Test, and one called My Test Topic 0212. So the topic is kind of like a thing that you create, and that's what tells your device what to look for. So this uses PubSub messaging, which is very popular these days. It makes it really nice to be able to throw a message out onto a server, and that's published. You then subscribe to those messages, and you will see those messages. So I'm going to create a new published message right here. So I'm going to go up here to all notifications, and then I'm just going to publish a new message. So right here, it says, hey, here's what the URL is going to be when you publish this. So it's pointing to my server, which is awesome. And then this thing just says, what's the topic you want? So we can create a new topic. So I'm just going to call this Video Test, and then I'm going to give it a title. This is a message for the video, and this is just a test message for the video. I think intify.sh is really awesome open source software. So forgive my spelling. I'm typing fast so that you guys don't have to just sit through that, but I created this topic. So I'm going to hit Send. Now, it goes, but you notice it's not here in the list. It's not going to be on either of these because I've not subscribed to that topic yet. So what I have to do is go here and basically say, I want to subscribe to that topic. So I'm going to put in video-test. So you need to know what that topic is. You can kind of say, generate a name if you don't want to create a topic. And then you can say, use another server and put in a different server URL. But in this case, I want the default server URL. So I'm going to say, subscribe. And as soon as I subscribe, I can see the message I just created. Now, if I send any other messages on that topic, with that topic, they'll show up here. Now, if I do it from here, if I just go here, you notice it doesn't give me the topic field. It just defaults to, I'm going to send it on this topic. So I can just create a message and send it. And it's going to be out there, and whoever subscribed to it would get it. If I go back to here, it's going to give me that topic field again. So I just have to say, video-test, and then give it another title. So my next message is even better. Make sure to subscribe and like this video on YouTube. I have a Patreon in the description if you would like to support my work. Again, forgive any misspellings, but you get the idea. I can hit Send. It's going to show up here because I'm subscribed to that topic. But I can also see that I've got a new message on this specific topic. I can click on it, and I can go and read that message. I can clear these out when I'm done with them. I don't have to leave them there. So right now it's saying there's no messages in this topic. Now, I can do the same thing from my phone, which is really great, and I can get push notifications. Now, I don't have to use the web interface to do this. This is just kind of a nice, hey, here's something that you can use in order to do this. So if I open up my terminal, I can SSH over first, and we'll just go to my test server. And I'm just going to go cd docker intify, and I'm going to clear this out so you guys can see what I'm doing here. And I'm going to type in a message of curl-d like that. And then I'm going to give it a message. So the dash d says send this message as a put or a post for an API. So I'm just going to say this is a message from the CLI. And then I'm going to give it a dash capital L because I'm using HTTPS, and I'm going to say HTTPS colon slash slash. I'm going to give it my server URL. So intify serve. Actually, I could probably just do this from intify.sh on this one. From local host. So local host. And then I'm going to give it the port number and then a slash. And this is going to be videotest as the topic. And you'll look right back here behind that screen. It popped up right away. So I was able to send that from the terminal and receive it right away here on the system. I would also get it on my phone if I was subscribed on my phone. So what I'm going to do is I'm going to open up my phone, and I'm going to start recording the screen. 3, 2, 1, recording. All right. And now I'm going to go back, and I'm going to post a message from this to my phone. So I'm going to use one of these other ones that I'm subscribed to on my phone. So we'll do the same thing. We'll give the exact same command, except instead of videotest, I'm going to say Brian test, and CLI to show on the phone. And you've actually got other options you can put, but this is just kind of a fast and dirty way to do this. So I sent it, and it shows up right here on my phone screen. And if I tap it, it will take me to the application to that topic where I can see the other things in the topic. So you can see kind of how that works here on the iPhone, which is pretty great, because again, getting push notifications is a really great way to get yourself information. The reason I show you this is I started thinking about all the things that I want to get notified about. And as I run up more servers, and I ramp up more servers, and I ramp up my network, and I'm doing different things, I want to get notified about different things happening on my systems. And a lot of times, I can write a really simple batch script and then just include a line like this that's going to give me that information. This is just something that could be so useful for so many things, and the flexibility that's built into Entify or notify.sh is really amazing. You can put actions on the notifications. You can just do so many really cool things if you just learn a little bit about how it works. Really, really awesome. So I wanted to show you guys how to set up this system today so that you can see exactly what is going on, and how I got this all running, and how I've got my domain running. You'll need a few things to do this, and we're going to get into it. All right, to get Entify up and running, you're going to need a couple of things. So you either need a machine that you want to run it on. Maybe you can run it on your desktop if you're going to leave that on all the time. That's fine, because you could use that for transmitting those messages. But you want to have something that you can run it on. I'm going to run it on a Ubuntu server, completely up to you guys how you do it. I'm going to use Docker. Now, again, if you don't want to use Docker, there's binaries, there's different repositories to get this running. I like Docker just because it's really easy, in my opinion, to get it up and running. But you need to have Docker installed, and Docker composed for the way that we're going to do this today. The other thing you might want is a domain name. So I own the domain routemehome.org. I have an A record that points routemehome.org to a public IP address. And then I can create subdomains on the fly that also point to that public IP address. That's how I'm doing this. So I've got videos on how to do that. I'll link those in the description of the show notes so that you guys can see how to do it as well if you're interested in doing that and you don't have it set up yet. But you want to have that just so that you get the push notifications. You can access this from anywhere. And really, there's a few things to think about from the security side of things. So when I'm sending these messages, so when I'm here and I'm sending these messages, remember this is a topic. I'm giving these regular names, but security through obscurity is never a great way to do things, but it is a way that you can do things. So you could just create this as more of a random set of letters and numbers. And then someone has to know, okay, first I need to know where your server is, which you know where this one is because I've created it. Second, I need to know what your topics are. So I need to understand what these topics are in order to subscribe to them. So if you use something that's hard for people to guess, it's harder for them to get into your topics and see your messages and things that are coming through. Now you can also do private topics. So if we go into settings, you'll see right here, manage users. So you can add users and give those users passwords and set things up so that topics are private to those users. And then it uses some basic authentication for those users to be able to see those topics. So there's a lot of different options built into this. It's very, very useful. Here you've got some other settings where you can set the ding and all those kind of sounds. So a lot of stuff right through this web interface you can set up, but tons of stuff through the CLI that you can also set up if you just go through and read his documentation. He just really, really lays out very well what you need. So once you've got those few things that you need set up, we'll go through and get everything ready so that we can get this running. So I'm going to exit this server that I'm on and I'm going to SSH into a different server. And I'm going to first thing, make a directory. I'm going to put dash P and then Docker slash NTFY. And that can be whatever you want. You can put NTFY dash server if you want to. It's fine. We're just giving this a folder name. So this says make a folder, check and see if the Docker folder exists. If it does use it, if it doesn't create it. So it just does everything in one command for us. Now we can see it into Docker slash NTFY server, which is great. If I do an LS, there's nothing else here yet. So I'm going to create a file called nano. I'm going to use nano text editor and I'm going to create a file called Docker compose. Make sure I spell it correctly, dot YML. It's going to open up and I'm going to grab some text and we're going to paste it in and we'll look at what all this is about. It's going to open up and I'm going to grab some text and we're going to paste it in and we'll look at what all it means. All right. So we're going to use version 2.3 of compose, which is fine. The service is going to be called notify or NTFY. It's going to pull down the image that we need. And then we're going to call this container the NTFY server. The command is serve. That's fine. Our environment variable that we're going to use is time zone. And that's for me, America, Chicago. You should change this to whatever your time zone is. Volumes. We're going to set up a couple. So now he sets these without the dot slash. I use the dot slash because I like to keep everything inside of the folder that I'm working in. And that's what this little period does right at the beginning. It says put it in the current directory and then continue on with these. So I've got dot slash var slash cache slash NTFY. And that's going to map to the container side of var slash cache slash NTFY. And the same thing for dot slash etsy slash NTFY. So inside the container it will be slash etc slash NTFY. The ports. So he maps just 80 to 80. Again, 80 is a very common port. If you're going to run this inside of your own network at home and you're going to run NGINX proxy manager or some other kind of reverse proxy, you'll have that running on port 80 most likely. So it's better to avoid port 80. I set it as 8150. You can use any port that's not in use on your system if your system isn't being expected to use for some other reason. So 8150 is fine. So here we've got health check. So this just all this just leave as it is. The only thing you need to change is make this port right here the same as what he has set. So this port right here needs to match whatever you set over here on the left. So if you change it to 8150, you need to change this one to 8150. Everything else here should just remain the same, and you should be pretty much set. So once you've got that all set and you're happy with it, just do Control-O to save. Then hit Enter to confirm, and then just double-check everything. Make sure the spacing looks good. Make sure everything looks good because YAML is space-dependent. Don't use tabs. You have to use spaces. But once you're good, once you're happy with everything, Control-X to exit out of the nanotext editor. So we're going to do a real quick just pull everything down that we need, and we're going to set this up like this. So we're going to do docker compose up, which means bring down the images and start my containers dash D, and then two ampersands, and we're going to do a second command. So that first command is docker compose up dash D. We're going to just tell it right after that run this next command, which is docker compose logs dash F, which means once you bring everything up and get it started running, show me the log output. So we're going to do this. It's going to start bringing everything down. It's not very big. So there you can see it says it's listening on port 80, but remember we're mapping to port 8150. So while it says it's listening on 80, we know that it's actually running on a different one. So what I'm going to do, I'm going to open up a new tab. I'm going to go to the IP address of that machine, and I'm going to do a colon. Make sure I get the right symbol there. And then 8150. And there we go. We've got our new NTFY server. Now, you notice it says this is notification not supported, so we have to hit the notification API. It says supported over HTTPS. So this is one of the reasons that we want to get HTTPS and SSL set up. But for now, we can see that we're here. We could actually publish a thing and subscribe to the message, and we would see it show up here in the interface. Everything would be great. But what I want to do is I want to get this set up. So let's go set it up. I'm going to open up my NGINX Proxy Manager. If you don't have an NGINX Proxy Manager and you want to get it, I have videos on how to get it set up. I have a script that will install Docker, CE, Docker Compose, and NGINX Proxy Manager all for you with no problem, probably no problem if you're running Linux. But if you're using a different reverse proxy, that's fine. Hopefully, you know how to set it up to add different things. But I'm going to go in here and say add. I'm going to give this a name, so I want this to be IntifyTest.RouteMeHome.org. Okay, make sure I spelled everything correctly. Looks good. And then I'm going to put in the IP address of my server. So my NGINX Proxy Manager runs on a different machine than the server where I'm setting this up. That's why I need to put in my IP address. If NGINX Proxy Manager was running on the same machine, I could use localhost or I could use the name of the container if I put them both in the same Docker network. That's not the default network. But in this case, I need to use the IP address. So here I'm going to put 8150. I'm going to tell it to block common exploits and give me WebSocket support. And I'm just going to say save. First thing I want to do is make sure that this actually opens up. So I'm going to go right here to IntifyTest. I'm just going to click on it. It should open up and give me that same window, and it does. But now it's running at this URL, which is great. So I'm going to come back in here, and I'm just going to go over here to the right for that entry. I'm going to click on the little three dots, click on edit. I'm going to go to the SSL tab. I'm going to say request a new certificate, force SSL, HTTP2 support. And I agree. Make sure your email is in here. And I'm just going to hit save. That's going to go out and say, hey, let's encrypt. I need to get a valid SSL certificate for this site. Can you challenge it real quick? Make sure you can hit it and then give me a certificate. And if it does, this little pop-up just goes away. But you'll now see that it says let's encrypt right here. Let's encrypt. So we're just going to click on this again. Now you notice it doesn't have the HTTPS part anymore. It just says, hey, do you want to get notifications? Say grant. Click on allow for your browser, and now you'll get the browser notifications whenever something comes in on a topic that you're subscribed to. Pretty straightforward. So this is set. We're done with this part. It's that simple. That took about five minutes for us to set up. Now there's a couple of things you need to do if you want to get push notifications on your phone. So first is knowing that on your phone you need to set this URL. So there's a little settings page when you download the intify.sh app. Go into your settings page and put in your HTTPS URL for this site. And then there's also a configuration file we need to grab. So I'm going to go back over here. I'm just going to hit Control-C to stop watching the logs here. Everything looks good. I'm going to do an LS, and you'll notice now we have a couple of folders here. So it created those folders that we told it we wanted there. So I'm going to go cd etc slash ntfy. I'm doing LS, and you'll notice there's nothing here, but there should be a server.yml file. So we're going to say sudo nano server.yml. We're going to create a special file called server.yml, and it just needs a few things in it. So it needs a base-url, and we're going to type that in, all lowercase and then colon. And then in quotations, we're just going to put in our URL. So this is https colon slash slash, and this was ntfy.test and routemehome.org. Just double-check my spelling. And then we need one called the upstream space, our hyphen base hyphen URL, and that one is going to be https colon slash slash ntfy.sh and then end quote. So it should just look like that. And then there's some caching stuff you can put. There's a lot of different parameters you can put in this file, and he's got a really excellent sample file on his GitHub page. So, again, I'll link you guys to the GitHub page so you can go look at that. But these are the things that we need in order for it to get us what we want for our push notifications for iOS. So I'm going to hit Control-O to save, hit Enter to confirm, and then Control-X to exit. So now we need to bring down our ntfy server. So we're going to do cd dot dot slash dot dot just to go back to this level where it's docker-ntfy-server. I'll clear that out so you can see what I'm typing. I'm going to do docker compose down. That's just going to take our server down real quick, and then I'm going to do docker compose up dash d, two ampersand is docker, compose logs dash f. And if you notice, it should come right back up saying listening on that port, which is great. We've got everything there. So now I'm going to go into my device. I'm going to record this on my device again. It's recording, and I'm going to go in, and I'm going to go back to the main page here. I'm going to go over to this little settings tab at the bottom, and you'll notice up here it's got the default server. So I'm going to change that default server. It's a separate server, but I'm just going to change the default for now. So I'm going to type it in, https colon slash slash, and this is going to be ntfytest. Make sure I spell it correctly. Test. There we go. Dot route me home dot org. I'm going to save that. So now that should have the correct one, and if I zoom it up for you guys, let's see. I'm zooming it up for myself. I don't know if it will zoom it up on the recording. Route me home dot org. Everything there looks good. So I'm going to go back over here, and I'm going to get rid of this. Yeah, just unsubscribe for now. And I'm going to subscribe to the new topic, and we're just going to give this a new topic here. So let's call this. Now, if I wanted to use another server, I could tap this button and fill in another server URL, but I don't. I want to use the default server, so I'm just going to hit subscribe. So now I'm subscribed to that message service. It's still recording, so I'm actually going to go publish something on it. I'm going to call this yt-test, and I'm going to put in my first message from my new server. This is awesome. I hope I can really find a lot of uses for this. And you can put tags and things like that. You can even put emojis and stuff like that in it, but for now we'll just send that. I want to make sure that we get our message. So my first message, there it is. We've got the message. So for some reason it doesn't show it right away, which is weird, even though it came in on a push notification. So we know we got it. It may take a section for this to actually start pulling from the subscriptions, but the push notification came in. This will check in eventually and start getting our actual subscriptions and our messages that we're subscribed to. We'll do another one just to prove that it's working. So we'll do it again, yt-test and new test. Hey, this is my second message. And I'll send it. And, again, you'll see the push notification come in. There it is right there on the screen. I'll tap it, and it's still saying, hey, you don't have anything here. That's kind of funny. But if we kill the app and then go back into it, maybe it will reach out. There. So now it reached out and it started pulling the messages. So there's a little bit of a funkiness with the app going on there. But now if we send one, it should also come into the app. Let's just see what happens. We'll do one more, yt-test. And, hey, here's one more. And send. So we got it. There it is. And we can even see the message right there. So if we tap back, we can see what we're subscribed to. And here we can see our messages. So this thing's working really well. I'm very excited about how well this works and how fast it is to get set up. Now, remember, there are users and things like that that you can also set up in here. So down here I can actually send a request from this machine through my server, kind of like I did before. So if I do curl-d and I put in a message, this is my message on my new server from the CLI. Whoops. And then I do dash capital L. And the reason I have to do this is to tell it, hey, curl, I need you to chase down the redirects because the HTTPS is being forced as a redirect. So I'm going to do a quote. HTTPS colon slash slash intify test dot route me home dot org colon 81. No, no. Slash. And then we're going to give it yt-test. And my phone turned off, which means it stopped recording. Let me start it recording again. I don't even exit the app this time. And we'll record. And then we're going to send this message. Yes. Oh, I don't need the quote on the URL. So we're going to take that off. There we go. This should go. And there it's going to give you some JSON output to tell you, hey, here's what I tried to send. And then on the phone screen you can see that the notification came in. And I can go here and click. And, again, for whatever reason I'm going to pull to refresh. But usually these come in on their own. So there you go. And it's bringing everything in just like you'd expect it to, which is pretty awesome. So this means that now I've got the ability to use this type of message in a script and actually get things back. And he goes into more detail in his documentation. So if you go out here and check out his docs. Sorry, that was bright. If you go out here and check out the docs on sending. So he's got subscribing. He's got publishing. So if you go to the sending messages, you can see there's a lot of different ways to do things down here. But, I mean, there's just tons of detail on what you can do. So here he shows you, you can do this from the command line. So you can do a fetch. But here you can do a curl. You can send headers. You can send body. You can send a message title with it. So you can just, I mean, so many different things you can do. But he's also got different ways that you can use this. So you can use it with curl. That's the easy way to the bash side is to use curl to do that, the command line. He's got the NTFY CLI. So you can use NTFY publish. He's got HTTPS. So if you want to do an HTTPS call, JavaScript, Go, PowerShell, Windows users, he's got PowerShell for you, okay, or Linux users who use PowerShell. He's got Python. And he's got PHP. So, I mean, really tons of ways to do these different things. And on every single one, he's got a lot of really good information on what it does, why it's there, and then he gives you lots of different code on how to use this. I mean, just so much great information on this documentation page. It's just really impressive to me that he's got so much here. All right. I have shown you the things that you need to have to get started with NTFY server. I think it's just a tremendous project, and it's an opportunity for you to get out there and really get some notifications about the different things that you're doing and know what's going on in your systems, know what's going on in your life, know what's going on with your automations, know what's going on with all kinds of different things that are out there. I hope you enjoyed this. If you did, like, subscribe, tell your friends about it so they can come along on the open source journey with us, and I'll talk to you next time. It's your open source advocate, and I'm back, and I've set up a store with a little bit of merchandise. I love being your open source advocate, but I want you guys to be the open source advocates with me, so if you want to, get out there and get some of this stuff, and if you do, let me know what you think of it. Thank you for subscribing.