thetomester13
Posts
-
Cal.com (was Calendso) - Calendly Alternative -
FocalboardFocalpoint is 'an open source, self-hosted alternative to Trello, Notion, and Asana.' I'm hopeful with the 'alternative to Notion' part, but haven't played around with it myself so not sure how fully featured it is. That being said, the project has lots of stars on GH and looks to be plenty active.
-
Kill The Newsletterkill the newsletter (github) let's users create a unique email address, register for a newsletter with it, and instead of receiving an email with the newsletter, it'll add it to an RSS feed that it also provides for you.
I feel like this would package well alongside a TTRSS or FreshRSS instance.
-
Homebox - the inventory and organization system built for the Home UserI recently came across Homebox (site, github). Looks like they've been making steady and incremental improvements and updates to features and introducing new functionality. Not yet at a 1.0, but getting close which might make it a good candidate for a Cloudron app!
I've packaged some Go apps before but don't know it super well. I might get around to packaging this at some point, but in the meantime if someone else feels comfortable and wants to give it a whirl, don't wait for me!
-
Cloudron Non-App Store Packaged AppsI recently realized that there are quite a few apps that have been packaged by gracious developers here that aren't on the App Store for one reason or another. I started a repo to keep track of them hoping we can compile the whole lot of them!
A copy of the list is pinned here:
-
Homepage - A simple, standalone, self-hosted PHP page that is your window to your server and the web. (Source Code)
- Tests
- License
-
Standard Notes (Sync Server) - The Standard Notes syncing server (Source Code)
- Tests
- License
-
Standard Notes Web - A free, open-source, and completely encrypted notes app. (Source Code)
- Tests
- License
- NOTES: For some reason, it seems that this app doesn't backup well and often errors out in the process with a MySQL error ¯_(ツ)_/¯ I just disabled the backing up of this app since the notes themselves are backed up in the Sync Server app.
-
webhooks - webhook is a lightweight incoming webhook server to run shell commands (Source Code)
- Tests
- License
-
Zola - Server to serve up statically generated Zola sites
- Tests
- License
-
nginx app - nginx server, akin to Cloudron's LAMP
- Tests
- License
-
Outline - An open, extensible, wiki for your team built using React and Node.js.
- Tests
- License
Open to suggestions about formatting or any other pieces of data we may want to keep track of. Also, feel free to comment here about any more Apps that are packaged and they can be added to the list and repo!
-
-
Calibre (& Calibre web?)Calibre is a popular self-hosted ebook manager. Github page.
Now, Calibre is a desktop application, not a web application. But there is also Calibre-web, which is a web front end for the Calibre backend.
Should Calibre and Calibre-web be hosted through a single Cloudron application, or 2 separate applications?
Either way, I think these 2 applications could be very powerful on Cloudron.
-
Guide: Self Hosted NotificationsHello fellow Cloudron-users!
With the year about to close, I was very happy to recently be able to check off an important item for me on my self hosted checklist, 'Self hosted notifications'. I wanted to share my setup with the community for anyone else that is thinking of doing something similar.
Goals
- Self hosted (on Cloudron)
- iOS app
- Easy webhook trigger
- Open source
Why?
I want to be able to receive push notifications on my phone (iOS, important to distinguish, will touch on this later), automatically or manually with ease.
Setup
I use Matrix (server) and Element (client) for the main messages system. n8n is used to setup easy to use webhooks so I can trigger a notification from most places.
Alternatives And Why I Didn't Like These Solutions
-
Slack: I used to use Slack for notifications. They have a really solid mobile application, and easy to use webhooks, crucial for automating notifications. However, Slack is closed source and proprietary, a real deal breaker for what I'm trying to go for.
-
RocketChat: RocketChat could be used instead of Matrix. I went with Matrix because of its decentralized nature and because I already had it installed and don't have RocketChat on my Cloudron. I believe RocketChat could be used as an alternative solution. The mobile application works very well (have used it previously).
-
Gotify: Gotify has been packaged for Cloudron (unofficially) and I really wanted to use this since it's built for exactly this purpose. However, given Apple's tight grip on their hardware, Gotify doesn't have an iOS application since it requires agreeing to Apple's TOS and paying them to host an app on the App Store. Unfortunately, this was a dealbreaker for me.
- Gotify can also be used with an unofficial PushOver 'bridge' for iOS. But PushOver is closed source. Again, dealbreaker.
Guide
- Install Matrix and Element to your Cloudron.
- Install n8n to your Cloudron.
- Log in to Element using your main (LDAP) user, and create a new room that will be the place where all of your notification messages will go to, for example
#automated-messages
. In the room settings, be sure you set Notifications to 'All Messages'.
- We'll now need to create our bot user and invite it to the room created above.
- From your Cloudron dashboard, go to your Matrix application's File Manager and open the file /app/data/configs/homeserver.yaml.
- Set
enable_registration
totrue
. We'll come back and set this tofalse
later, but we need this to create our bot user. - Also set
enabled
andlocaldb_enabled
totrue
underpassword_config
. This is to ensure that newly registered users will be able to login. - Restart your Matrix application.
- Go to your Element application and register a new user. Give this 'user' (read: bot) a username that you'd want your bot to have. Keep the credentials in a secure place (probably your Cloudron's Bitwarden : ) even though you probably won't need to access this user very frequently at all.
- After the registration of the bot user, you should set
enable_registration
back tofalse
and save the config file. This way no external uninvited users can use your Matrix instance to register a new user. - Restart your Matrix application again.
- As your main user, now go to the room you created and invite your bot user.
- As your bot user, accept the invitation to the room.
- We can test your notifications proper now. Be sure you have the Element client installed on your phone and logged in as your primary user. Send a message from the bot account in the room. You should get a mobile notification! Now time to enable automation.
- As your bot user, go to your All Settings -> Help & About. Make note of your Access Token.
- If you have this token written down somewhere, you can now log out of the bot's Element account, we won't to be logged into it anymore.
- Let's create a workflow in n8n to be able to send messages with ease from our bot user! Go to n8n and create a new workflow.
- Copy the text below and paste it into your workflow.
{ "name": "Send Matrix Message", "nodes": [ { "parameters": {}, "name": "Start", "type": "n8n-nodes-base.start", "typeVersion": 1, "position": [ 240, 300 ] }, { "parameters": { "roomId": "!roomId:matrix_url.com", "text": "={{Object.keys($json[\"body\"]).length > 0 ? $json[\"body\"][\"msg\"] || JSON.stringify($json[\"body\"]) : $json[\"query\"][\"msg\"] || \"Notification triggered\"}}" }, "name": "Matrix", "type": "n8n-nodes-base.matrix", "typeVersion": 1, "position": [ 780, 120 ], "credentials": { "matrixApi": { "id": "11", "name": "Matrix Bot" } } }, { "parameters": { "httpMethod": "POST", "path": "matrix", "options": {} }, "name": "POST Webhook", "type": "n8n-nodes-base.webhook", "typeVersion": 1, "position": [ 240, 120 ], "webhookId": "5b81524e-74fb-4da2-9526-51eb20e4ccfb" }, { "parameters": { "path": "matrix", "options": {} }, "name": "GET Webhook", "type": "n8n-nodes-base.webhook", "typeVersion": 1, "position": [ 240, -40 ], "webhookId": "379725f7-f3ab-4c5e-a99b-334d70023295" }, { "parameters": { "conditions": { "boolean": [], "string": [ { "value1": "={{$json[\"query\"][\"x-matrix\"] || $json[\"headers\"][\"x-matrix\"]}}", "value2": "neo" } ] } }, "name": "IF GET", "type": "n8n-nodes-base.if", "typeVersion": 1, "position": [ 480, -40 ] }, { "parameters": { "conditions": { "boolean": [], "string": [ { "value1": "={{$json[\"headers\"][\"x-matrix\"]}}", "value2": "neo" } ] } }, "name": "IF POST", "type": "n8n-nodes-base.if", "typeVersion": 1, "position": [ 480, 120 ] } ], "connections": { "Start": { "main": [ [ { "node": "Matrix", "type": "main", "index": 0 } ] ] }, "POST Webhook": { "main": [ [ { "node": "IF POST", "type": "main", "index": 0 } ] ] }, "GET Webhook": { "main": [ [ { "node": "IF GET", "type": "main", "index": 0 } ] ] }, "IF GET": { "main": [ [ { "node": "Matrix", "type": "main", "index": 0 } ] ] }, "IF POST": { "main": [ [ { "node": "Matrix", "type": "main", "index": 0 } ] ] } }, "active": true, "settings": {}, "id": 10 }
- Be sure to create a new Credentials for Matrix using your bot's Access Token we copied from earlier and your Matrix URL, and set your workflow to use those credentials. Also be sure to update the Room ID in the workflow to the shared room created above.
- Save and Activate this workflow. This workflow enables both POST and GET requests that will send a message to your room from the bot user!
- As a precaution, we validate that the request contains a special header/parameter and only then will send the message. In this case, we want
x-matrix
to be set toneo
. If this is not present, the request will return a 200 response, but won't actually send a message/notification. - The text to send should be under the name
msg
. If nomsg
exists, we fallback to sending the text 'Notification triggered'.
- As a precaution, we validate that the request contains a special header/parameter and only then will send the message. In this case, we want
Example CURL commands to test this out from your Terminal:
- GET request with validator header:
curl "https://n8n.cloudron.url/webhook/matrix?msg=Test%20message" -H "x-matrix: neo"
- GET request with validator parameter:
curl "https://n8n.cloudron.url/webhook/matrix?msg=Test%20message&x-matrix=neo"
- Invalid GET request with no validator (returns 200 status but does not send notification):
curl "https://n8n.cloudron.url/webhook/matrix?msg=Test%20message
- POST request
curl -X POST https://n8n.cloudron.url/webhook/matrix -H 'x-matrix: neo' -H 'Content-Type: application/json' -d '{"msg": "Test message"}'
You can also simply visit a URL in your browser to send a test message: https://n8n.<cloudron_url>/webhook/matrix?msg=Test%20message&x-matrix=neo
You can now use automations to trigger a notification given the URL's and examples above!
Still Left To Figure Out
Since I want this URL to be as easy for me as possible to ping in the future, I'd like to be able to set up some sort of forwarding mechanims where
push.cloudron_url.com
goes ton8n.cloudron_url.com/webhook/matrix
. The tricky part is that the plain forwarding URL (push.cloudron_url.com) ideally would not need any path but it would forward to the path/webhook/matrix
on the actual URL. This solution would also need to forward query parameters, headers, etc with it to ensure the notification comes through properly. Open to suggestions on how to go about doing this! -
DashyI've managed to do a preliminary packaging of Dashy! You can find the code here.
Few notes (taken from the README):
- Dashy needs to access to edit some files on the filesystem to update the actual dashboards. It frequently updates /public/conf.yml (as well as creating backups of conf.yml files whenever a change is made), and it rewrites the entire /dist directory after a configuration change is made. This resulted in me having to put the entire /dashy directory in /app/data. Not sure if this is the right way to go about it, but it works.
- I noticed that when using the Update Configuration => Edit Config option, one must first Apply Locally or Preview Changes before writing the changes to the config file works properly. I'm going to assume that this is the behavior of the app itself, and not a result of my packaging
- When Dashy does rebuild its files after a configuration change, it ends up taking up a lot of memory. I've set mine to 1.5GB and haven't had issues. If you're seeing issues when trying to rebuild after a config change, try giving the app more resources.
-
App Packaging "Event"Alright, I am setup using @jdaviescoates 's BBB instance for now. We're still on for tomorrow, Wednesday the 27th at 5pm EST for writing some tests! Hope to see some people there!
-
Potential Cloudron Theme/DashboardHello all!
I've been developing/packaging what I think could be a new form of Cloudron apps, Themes (working title : ). The idea here is a simple Homepage that will display your installed Cloudron applications for easy access. You can see a working copy on my instance here! Be sure to hit space bar to toggle the menu.
Features include:
- Lightning fast loading - 97 Lighthouse Performance rating, all JS/CSS assets are local
- Toggle menu based on any key combination
- Background images from Unsplash or custom URL
- Quick link to Cloudron dashboard
- Use number keys to go directly to the first 9 apps listed when the menu is open
- Mobile friendly
- Caching of app images
- Security when it comes to your Cloudron API key and Unsplash ID
Note that this is NOT meant to replace the current Cloudron dashboard, but rather be a supplementary 'app browser'. When the menu is displayed in the Homepage App, there is a cog icon at the top right with the time stamp that will take you straight to your original Cloudron dashboard when you need full access to Backups, Logs, etc.
This app is based on the homepage-cloudron repo, which is based off of the homepage repo, both of which I am the author of. Happy to answer any questions! You can find the Cloudron packaged app here.
If this is interesting, I could work up some basic tests for this to eventually be included in the actual Cloudron App Store. Though it is important to note that for this to work properly, the setup requires creating a new Cloudron API key and updating the config.json file through the Terminal (not super user-friendly).
Thoughts/suggestions/notes welcome!
-
Astral - Organize Your GitHub Stars With EaseThe author also just linked to the Cloudron App Store version in their README for a
1-Click install
! -
Sponsored App CreationI second @murgero in that I would also be interested in being a part-time packager!
-
OneDev - All in 1 DevOps PlatformJust came across OneDev (which in and of itself is a mirror of their own dogfooding repo here). Looks like a great middle ground between Gitea (light, pure git features) and GitLab (more resource intensive and feature-filled).
Haven't looked at what's require in order to package it yet, but looks quite interesting!
-
Potential Cloudron Theme/Dashboard@marcusquinn thanks! I am trying to keep the project relatively simple so I don't want to get too deep into features. It is worth noting though that the original Homepage app does support opening links in new tabs. I could see a feature on the Cloudron app where it's an all-or-nothing boolean - all links will open in a new tab, or all links will open in the same tab. I also could see supporting non-Cloudron app links, and potentially number of columns. The way I see it, the icons should possibly adjust automatically based on the number of columns (again, this is a bit of the complexity I'm trying to avoid with a KISS app). The search bar I've also purposefully avoided this whole time, but I'm open to suggestions. It's also worth noting that you are free to create PR's into the Github repo if you want to contribute!
@robi that's an interesting point. Only admins are installing new applications indeed, but still, I'm not sure that all admins are capable or comfortable with going to an app's terminal, vim'ing (is that a verb??) the config file and adding in an API key. That being said, it's probably a good enough start for now, and could potentially revisit if/when @girish or @nebulon decide to add such a feature.
-
Scratch MapHi all!
Came across a neat self-hosted Scratch Map app recently, and since it's just a pretty small Node app, was able to package it up pretty easily, grab it if you'd like! Source code here.
Fair warning, haven't stress tested it yet, use at your own risk.
Cheers.
-
RSS-Bridge - a good complement to Fresh RSSWas just able to merge in a PR that adds an 'Install on Cloudron' button on RSS Bridge's Github!
-
What are you favourite things/ features about Cloudron?Most of the things have already been covered, but figured I might as well respond!
- Community and responsiveness of owners
- Self hosted email with catch all and aliases
- App ecosystem with plenty of examples and instructions on packaging. Plus 1-click installs!
-
Open registration@fbartels very interesting! I also like the idea of an admin being able to adjust the payload for a webhook, but of course, that adds complexity and room for error.
Another option would be to have an n8n webhook catch Baserow's payload. From n8n (also available on Cloudron), you can format the response how you want and then make multiple API calls in order to properly create the Cloudron user.
-
App Packaging "Event"Hello again! I've decided on next Wednesday the 10th at 5pm EST for Astral Testing 2.0! I was able to get over the major humps and will talk through those, but still have not completed the tests on my end, as that's the fun part that we'll get to do together
I'll do another screen recording on my end and upload, hopefully we can get the BBB to record as well, but that's out of my hands... otherwise, open to other suggestions about what you liked, didn't like, any changes I can make for this next session for you all to make the most of it!
-
Datasette