diff --git a/heimdall/config/.migrations b/heimdall/config/.migrations
new file mode 100755
index 0000000..588a613
--- /dev/null
+++ b/heimdall/config/.migrations
@@ -0,0 +1,2 @@
+01-nginx-site-confs-default
+02-default-location
diff --git a/heimdall/config/keys/cert.crt b/heimdall/config/keys/cert.crt
new file mode 100755
index 0000000..229a8be
--- /dev/null
+++ b/heimdall/config/keys/cert.crt
@@ -0,0 +1,22 @@
+-----BEGIN CERTIFICATE-----
+MIIDsTCCApmgAwIBAgIUB5SMEqlvO75Mdp2q3mkdcUfsYXkwDQYJKoZIhvcNAQEL
+BQAwaDELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMREwDwYDVQQHDAhDYXJsc2Jh
+ZDEXMBUGA1UECgwOTGludXhzZXJ2ZXIuaW8xFDASBgNVBAsMC0xTSU8gU2VydmVy
+MQowCAYDVQQDDAEqMB4XDTIxMTEyMDEwMTY1M1oXDTMxMTExODEwMTY1M1owaDEL
+MAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMREwDwYDVQQHDAhDYXJsc2JhZDEXMBUG
+A1UECgwOTGludXhzZXJ2ZXIuaW8xFDASBgNVBAsMC0xTSU8gU2VydmVyMQowCAYD
+VQQDDAEqMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2VWGIt/JZHus
+E7sZvdk6JkRfjrhG8FRPOGC4FwETNgCN8F6psNk0lOsCBXKzgr9NWCGoYCC9objg
+xpaeq4r5/u+NQE2sKl62ZZFIiMndHADZtQyCe1sGoS2Fc9lGOFcAztt+3NIERqcX
+OqlJLbMmvjnTYrk+QAUl+9WVyXkyUOZGci1EMQ4DxzMdkoQrtTcJ0B7Ho7M2DR+q
+AbNh9Vrp/S0dhy01lmm4cE7bAgarF8mTem6nBdQ6fvnuqUVa0o7m36OhSNgekIbq
+s8op91pWB12WIaIcTAB3ZPK5QcRpJ/hK07MISKKloorhE5h81VSC34oFHZNpZMrb
+H90BDmRF0wIDAQABo1MwUTAdBgNVHQ4EFgQUbp8VDmWndREkce7etru5J1NfFFow
+HwYDVR0jBBgwFoAUbp8VDmWndREkce7etru5J1NfFFowDwYDVR0TAQH/BAUwAwEB
+/zANBgkqhkiG9w0BAQsFAAOCAQEAN6OufAIhlYHUc/VpP2aDnJ/0n1K2HxpW3nxO
+B8S2NAky9psMRb/0DEGI3LOb8cchxYUPDbNeeqCV7u9+hWCjz4ut6dCpqBM3McHN
+5VxSEkn/BArHmuadGSXc7iTNu65avFyZN2hWC+K/7KmAsN9fCdRRwMWT9faZh2zR
+KpQcmydV+mAxn16MAnsgbISenjs5qrOX0IcL4InaF8pjNG7SqP0IRzTiPy4CQjcc
+lBOpW0lBKKXHzEGYvcCpaiH0KjvKDcXYTSk2YvOaZuYZv7PKsISAWyw1eHbB80T1
+4JZzWqzeJ7ir0mXisW28nEGcw4CvvecUDl8qpFI8rwGr4+5Idg==
+-----END CERTIFICATE-----
diff --git a/heimdall/config/keys/cert.key b/heimdall/config/keys/cert.key
new file mode 100755
index 0000000..b454610
--- /dev/null
+++ b/heimdall/config/keys/cert.key
@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDZVYYi38lke6wT
+uxm92TomRF+OuEbwVE84YLgXARM2AI3wXqmw2TSU6wIFcrOCv01YIahgIL2huODG
+lp6rivn+741ATawqXrZlkUiIyd0cANm1DIJ7WwahLYVz2UY4VwDO237c0gRGpxc6
+qUktsya+OdNiuT5ABSX71ZXJeTJQ5kZyLUQxDgPHMx2ShCu1NwnQHsejszYNH6oB
+s2H1Wun9LR2HLTWWabhwTtsCBqsXyZN6bqcF1Dp++e6pRVrSjubfo6FI2B6Qhuqz
+yin3WlYHXZYhohxMAHdk8rlBxGkn+ErTswhIoqWiiuETmHzVVILfigUdk2lkytsf
+3QEOZEXTAgMBAAECggEBAMW3JVlypz+PtwMYMpnhFiKcDybChF69BHjwnGjpJHX7
+WSV0qQFnCIv1pBgaui5XJODpdclF395RV8OyYNUEkNwZSDJYtyiwk1ShMBCpPEru
+hyBLKiVYsRZOWFsFLfmxRN3rF2WCdjtkZSCLwzQdCEEEUEc+6N/LDzwkmaj5Zgnr
+VrpzeSWM4pMlK9l0viv4tlqcUfNW0Mnn5l3Rrg3SCl5i0M83sR1LMrtr2s8r5KIj
+oEot6YjnHtf61YfEGQquxmhMm8rsgYWguf4d7ZEP0qqh4AmArqLJR7oBldCwPqa6
+7jcfD9csf6GmPEXJFYdfELUsKrSm8sOCicTreGvLVrECgYEA7V/La9EVxionYzLX
+tUdWbbez5INsi4anhXQwye9qfjU3Pbit47GIPOtLuwGZ0kauOBJeCV5DzuDCQRBw
+AI+dxPRhj6nldHLg59fmXOnj5kwkzhPWqDzAz1zr5X7XGHx3qs8PhVO7WOlsTdP9
+94FxleR5drYvig31lHaAYclVnxkCgYEA6mMtdVsPzwooCF87sS/H9kWr0dy6Jry5
+AOt5p5uFfwulnkHru3uR6gfMaramjDcqMc4Ibt/f1uKSW0Cfl0Oo5ui7tz0XVxPh
+CQRUP4MddjM7GxcAd9pvdyvNGi2rnC9WITJQmlo9YeZCt2KIM8CYEl2f9fQjQfhI
+VvwOC1oUpcsCgYAhfwMVk8ueyxQDy4jk68wmb2XTOTh39+hrzJmV5VMBvECvVQA0
+wTiYYBuvp+os4gxznSPn7oVjDBRdWhRz/9AjmtipjS/z3sId9TlsoxSlytjmu6Xu
+16Pdnx8qo1t2+Rlp4Q4vokEtqsK9uMx9wKZmoHcDaXIL6SxeZtp28hJDAQKBgDjg
+LiS/Hxvva/10FokNfildiK8ZL7a8ruvxOAka7Q8CJYM8ndZVyveOQuVWQx3dOQjy
+5Qr6mleLjVZFXTSYf4Dg0sRJN8OymDXW7hanW1vWXK5bK4rp34h8gX2rvWvd9LmD
+exmpciGyfVgAuepM/tneDDXjszaL6AnrigDpL/93AoGAJhoVBYQ20vBgTtwCvj5i
+JJVsCOjEOvgpp012Q0Wg4ec7E+7FBimtVHkF/2qdcN0CpXx47RS8PfDOAVSEDS6a
++HMSZRRMfA/e4qApUEMohkQm9CoCno8C/ICDVsJ181GffZqgsnQ4uf3EDSFTGM8X
+RcGOvwssGGgPx0Wp2O6gPIE=
+-----END PRIVATE KEY-----
diff --git a/heimdall/config/nginx/dhparams.pem b/heimdall/config/nginx/dhparams.pem
new file mode 100755
index 0000000..eed4c41
--- /dev/null
+++ b/heimdall/config/nginx/dhparams.pem
@@ -0,0 +1,13 @@
+-----BEGIN DH PARAMETERS-----
+MIICCAKCAgEA//////////+t+FRYortKmq/cViAnPTzx2LnFg84tNpWp4TZBFGQz
++8yTnc4kmz75fS/jY2MMddj2gbICrsRhetPfHtXV/WVhJDP1H18GbtCFY2VVPe0a
+87VXE15/V8k1mE8McODmi3fipona8+/och3xWKE2rec1MKzKT0g6eXq8CrGCsyT7
+YdEIqUuyyOP7uWrat2DX9GgdT0Kj3jlN9K5W7edjcrsZCwenyO4KbXCeAvzhzffi
+7MA0BM0oNC9hkXL+nOmFg/+OTxIy7vKBg8P+OxtMb61zO7X8vC7CIAXFjvGDfRaD
+ssbzSibBsu/6iGtCOGEfz9zeNVs7ZRkDW7w09N75nAI4YbRvydbmyQd62R0mkff3
+7lmMsPrBhtkcrv4TCYUTknC0EwyTvEN5RPT9RFLi103TZPLiHnH1S/9croKrnJ32
+nuhtK8UiNjoNq8Uhl5sN6todv5pC1cRITgq80Gv6U93vPBsg7j/VnXwl5B0rZp4e
+8W5vUsMWTfT7eTDp5OWIV7asfV9C1p9tGHdjzx1VA0AEh/VbpX4xzHpxNciG77Qx
+iu1qHgEtnmgyqQdgCpGBMMRtx3j5ca0AOAkpmaMzy4t6Gh25PXFAADwqTs6p+Y0K
+zAqCkc3OyX3Pjsm1Wn+IpGtNtahR9EGC4caKAH5eZV9q//////////8CAQI=
+-----END DH PARAMETERS-----
\ No newline at end of file
diff --git a/heimdall/config/nginx/nginx.conf b/heimdall/config/nginx/nginx.conf
new file mode 100755
index 0000000..476fd8f
--- /dev/null
+++ b/heimdall/config/nginx/nginx.conf
@@ -0,0 +1,98 @@
+user abc;
+worker_processes 4;
+pid /run/nginx.pid;
+include /etc/nginx/modules/*.conf;
+
+events {
+ worker_connections 768;
+ # multi_accept on;
+}
+
+http {
+
+ ##
+ # Basic Settings
+ ##
+
+ sendfile on;
+ tcp_nopush on;
+ tcp_nodelay on;
+ keepalive_timeout 65;
+ types_hash_max_size 2048;
+ # server_tokens off;
+
+ # server_names_hash_bucket_size 64;
+ # server_name_in_redirect off;
+
+ client_max_body_size 0;
+
+ include /etc/nginx/mime.types;
+ default_type application/octet-stream;
+
+ ##
+ # Logging Settings
+ ##
+
+ access_log /config/log/nginx/access.log;
+ error_log /config/log/nginx/error.log;
+
+ ##
+ # Gzip Settings
+ ##
+
+ gzip on;
+ gzip_disable "msie6";
+
+ # gzip_vary on;
+ # gzip_proxied any;
+ # gzip_comp_level 6;
+ # gzip_buffers 16 8k;
+ # gzip_http_version 1.1;
+ # gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
+
+ ##
+ # nginx-naxsi config
+ ##
+ # Uncomment it if you installed nginx-naxsi
+ ##
+
+ #include /etc/nginx/naxsi_core.rules;
+
+ ##
+ # nginx-passenger config
+ ##
+ # Uncomment it if you installed nginx-passenger
+ ##
+
+ #passenger_root /usr;
+ #passenger_ruby /usr/bin/ruby;
+
+ ##
+ # Virtual Host Configs
+ ##
+ include /etc/nginx/conf.d/*.conf;
+ include /config/nginx/site-confs/*.conf;
+}
+
+
+#mail {
+# # See sample authentication script at:
+# # http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
+#
+# # auth_http localhost/auth.php;
+# # pop3_capabilities "TOP" "USER";
+# # imap_capabilities "IMAP4rev1" "UIDPLUS";
+#
+# server {
+# listen localhost:110;
+# protocol pop3;
+# proxy on;
+# }
+#
+# server {
+# listen localhost:143;
+# protocol imap;
+# proxy on;
+# }
+#}
+daemon off;
diff --git a/heimdall/config/nginx/nginx.conf.sample b/heimdall/config/nginx/nginx.conf.sample
new file mode 100755
index 0000000..e57699a
--- /dev/null
+++ b/heimdall/config/nginx/nginx.conf.sample
@@ -0,0 +1,84 @@
+## Version 2024/05/27 - Changelog: https://github.com/linuxserver/docker-baseimage-alpine-nginx/commits/master/root/defaults/nginx/nginx.conf.sample
+
+### Based on alpine defaults
+# https://git.alpinelinux.org/aports/tree/main/nginx/nginx.conf?h=3.20-stable
+
+user abc;
+
+# Set number of worker processes automatically based on number of CPU cores.
+include /config/nginx/worker_processes.conf;
+
+# Enables the use of JIT for regular expressions to speed-up their processing.
+pcre_jit on;
+
+# Configures default error logger.
+error_log /config/log/nginx/error.log;
+
+# Includes files with directives to load dynamic modules.
+include /etc/nginx/modules/*.conf;
+
+# Include files with config snippets into the root context.
+include /etc/nginx/conf.d/*.conf;
+
+events {
+ # The maximum number of simultaneous connections that can be opened by
+ # a worker process.
+ worker_connections 1024;
+}
+
+http {
+ # Includes mapping of file name extensions to MIME types of responses
+ # and defines the default type.
+ include /etc/nginx/mime.types;
+ default_type application/octet-stream;
+
+ # Name servers used to resolve names of upstream servers into addresses.
+ # It's also needed when using tcpsocket and udpsocket in Lua modules.
+ #resolver 1.1.1.1 1.0.0.1 2606:4700:4700::1111 2606:4700:4700::1001;
+ include /config/nginx/resolver.conf;
+
+ # Don't tell nginx version to the clients. Default is 'on'.
+ server_tokens off;
+
+ # Specifies the maximum accepted body size of a client request, as
+ # indicated by the request header Content-Length. If the stated content
+ # length is greater than this size, then the client receives the HTTP
+ # error code 413. Set to 0 to disable. Default is '1m'.
+ client_max_body_size 0;
+
+ # Sendfile copies data between one FD and other from within the kernel,
+ # which is more efficient than read() + write(). Default is off.
+ sendfile on;
+
+ # Causes nginx to attempt to send its HTTP response head in one packet,
+ # instead of using partial frames. Default is 'off'.
+ tcp_nopush on;
+
+ # all ssl related config moved to ssl.conf
+ # included in server blocks where listen 443 is defined
+
+ # Enable gzipping of responses.
+ #gzip on;
+
+ # Set the Vary HTTP header as defined in the RFC 2616. Default is 'off'.
+ gzip_vary on;
+
+ # Helper variable for proxying websockets.
+ map $http_upgrade $connection_upgrade {
+ default upgrade;
+ '' close;
+ }
+
+ # Enable http2 by default for all servers
+ http2 on;
+
+ # Sets the path, format, and configuration for a buffered log write.
+ access_log /config/log/nginx/access.log;
+
+ # Includes virtual hosts configs.
+ include /etc/nginx/http.d/*.conf;
+ include /config/nginx/site-confs/*.conf;
+}
+
+daemon off;
+pid /run/nginx.pid;
diff --git a/heimdall/config/nginx/resolver.conf b/heimdall/config/nginx/resolver.conf
new file mode 100755
index 0000000..1ae22e7
--- /dev/null
+++ b/heimdall/config/nginx/resolver.conf
@@ -0,0 +1,3 @@
+# This file is auto-generated only on first start, based on the container's /etc/resolv.conf file. Feel free to modify it as you wish.
+
+resolver 127.0.0.11 valid=30s;
diff --git a/heimdall/config/nginx/site-confs/default.conf b/heimdall/config/nginx/site-confs/default.conf
new file mode 100755
index 0000000..4c431da
--- /dev/null
+++ b/heimdall/config/nginx/site-confs/default.conf
@@ -0,0 +1,43 @@
+## Version 2018/03/06 - Changelog: https://github.com/linuxserver/docker-heimdall/commits/master/root/defaults/default
+
+server {
+ listen 80 default_server;
+
+ listen 443 ssl;
+
+ root /app/www/public;
+ index index.php index.html index.htm;
+
+ server_name _;
+
+ ssl_certificate /config/keys/cert.crt;
+ ssl_certificate_key /config/keys/cert.key;
+
+ client_max_body_size 0;
+
+ error_page 599 = @noauth;
+
+ location / {
+ if (!-f /config/nginx/.htpasswd) {
+ return 599;
+ }
+ auth_basic "Restricted";
+ auth_basic_user_file /config/nginx/.htpasswd;
+ try_files $uri $uri/ /index.php?$args;
+ }
+
+ location @noauth {
+ try_files $uri $uri/ /index.php?$args;
+ }
+
+ location ~ \.php$ {
+ fastcgi_split_path_info ^(.+\.php)(/.+)$;
+ # With php5-cgi alone:
+ fastcgi_pass 127.0.0.1:9000;
+ # With php5-fpm:
+ #fastcgi_pass unix:/var/run/php5-fpm.sock;
+ fastcgi_index index.php;
+ include /etc/nginx/fastcgi_params;
+
+ }
+}
diff --git a/heimdall/config/nginx/site-confs/default.conf.sample b/heimdall/config/nginx/site-confs/default.conf.sample
new file mode 100755
index 0000000..626004d
--- /dev/null
+++ b/heimdall/config/nginx/site-confs/default.conf.sample
@@ -0,0 +1,44 @@
+## Version 2024/07/16 - Changelog: https://github.com/linuxserver/docker-baseimage-alpine-nginx/commits/master/root/defaults/nginx/site-confs/default.conf.sample
+
+server {
+ listen 80 default_server;
+ listen [::]:80 default_server;
+ listen 443 ssl default_server;
+ listen [::]:443 ssl default_server;
+
+ server_name _;
+
+ include /config/nginx/ssl.conf;
+
+ set $root /app/www/public;
+ if (!-d /app/www/public) {
+ set $root /config/www;
+ }
+ root $root;
+ index index.html index.htm index.php;
+
+ location / {
+ # enable for basic auth
+ #auth_basic "Restricted";
+ #auth_basic_user_file /config/nginx/.htpasswd;
+
+ try_files $uri $uri/ /index.html /index.htm /index.php$is_args$args;
+ }
+
+ location ~ ^(.+\.php)(.*)$ {
+ # enable the next two lines for http auth
+ #auth_basic "Restricted";
+ #auth_basic_user_file /config/nginx/.htpasswd;
+
+ fastcgi_split_path_info ^(.+\.php)(.*)$;
+ if (!-f $document_root$fastcgi_script_name) { return 404; }
+ fastcgi_pass 127.0.0.1:9000;
+ fastcgi_index index.php;
+ include /etc/nginx/fastcgi_params;
+ }
+
+ # deny access to .htaccess/.htpasswd files
+ location ~ /\.ht {
+ deny all;
+ }
+}
diff --git a/heimdall/config/nginx/ssl.conf b/heimdall/config/nginx/ssl.conf
new file mode 100755
index 0000000..2cc2368
--- /dev/null
+++ b/heimdall/config/nginx/ssl.conf
@@ -0,0 +1,39 @@
+## Version 2022/08/20 - Changelog: https://github.com/linuxserver/docker-baseimage-alpine-nginx/commits/master/root/defaults/nginx/ssl.conf.sample
+
+### Mozilla Recommendations
+# generated 2022-08-05, Mozilla Guideline v5.6, nginx 1.17.7, OpenSSL 1.1.1k, intermediate configuration
+# https://ssl-config.mozilla.org/#server=nginx&version=1.17.7&config=intermediate&openssl=1.1.1k&guideline=5.6
+
+ssl_certificate /config/keys/cert.crt;
+ssl_certificate_key /config/keys/cert.key;
+ssl_session_timeout 1d;
+ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
+ssl_session_tickets off;
+
+# curl https://ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam
+ssl_dhparam /config/nginx/dhparams.pem;
+
+# intermediate configuration
+ssl_protocols TLSv1.2 TLSv1.3;
+ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
+ssl_prefer_server_ciphers off;
+
+# HSTS (ngx_http_headers_module is required) (63072000 seconds)
+#add_header Strict-Transport-Security "max-age=63072000" always;
+
+# OCSP stapling
+#ssl_stapling on;
+#ssl_stapling_verify on;
+
+# verify chain of trust of OCSP response using Root CA and Intermediate certs
+#ssl_trusted_certificate /config/keys/cert.crt;
+
+# Optional additional headers
+#add_header Cache-Control "no-transform" always;
+#add_header Content-Security-Policy "upgrade-insecure-requests; frame-ancestors 'self'";
+#add_header Permissions-Policy "interest-cohort=()";
+#add_header Referrer-Policy "same-origin" always;
+#add_header X-Content-Type-Options "nosniff" always;
+#add_header X-Frame-Options "SAMEORIGIN" always;
+#add_header X-UA-Compatible "IE=Edge" always;
+#add_header X-XSS-Protection "1; mode=block" always;
diff --git a/heimdall/config/nginx/ssl.conf.sample b/heimdall/config/nginx/ssl.conf.sample
new file mode 100755
index 0000000..f1483ad
--- /dev/null
+++ b/heimdall/config/nginx/ssl.conf.sample
@@ -0,0 +1,39 @@
+## Version 2023/08/13 - Changelog: https://github.com/linuxserver/docker-baseimage-alpine-nginx/commits/master/root/defaults/nginx/ssl.conf.sample
+
+### Mozilla Recommendations
+# generated 2023-06-25, Mozilla Guideline v5.7, nginx 1.24.0, OpenSSL 3.1.1, intermediate configuration
+# https://ssl-config.mozilla.org/#server=nginx&version=1.24.0&config=intermediate&openssl=3.1.1&guideline=5.7
+
+ssl_certificate /config/keys/cert.crt;
+ssl_certificate_key /config/keys/cert.key;
+ssl_session_timeout 1d;
+ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
+ssl_session_tickets off;
+
+# curl https://ssl-config.mozilla.org/ffdhe2048.txt > /path/to/dhparam
+ssl_dhparam /config/nginx/dhparams.pem;
+
+# intermediate configuration
+ssl_protocols TLSv1.2 TLSv1.3;
+ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;
+ssl_prefer_server_ciphers off;
+
+# HSTS (ngx_http_headers_module is required) (63072000 seconds)
+#add_header Strict-Transport-Security "max-age=63072000" always;
+
+# OCSP stapling
+#ssl_stapling on;
+#ssl_stapling_verify on;
+
+# verify chain of trust of OCSP response using Root CA and Intermediate certs
+#ssl_trusted_certificate /config/keys/cert.crt;
+
+# Optional additional headers
+#add_header Cache-Control "no-transform" always;
+#add_header Content-Security-Policy "upgrade-insecure-requests; frame-ancestors 'self'" always;
+#add_header Permissions-Policy "interest-cohort=()" always;
+#add_header Referrer-Policy "same-origin" always;
+#add_header X-Content-Type-Options "nosniff" always;
+#add_header X-Frame-Options "SAMEORIGIN" always;
+#add_header X-UA-Compatible "IE=Edge" always;
+#add_header X-XSS-Protection "1; mode=block" always;
diff --git a/heimdall/config/nginx/worker_processes.conf b/heimdall/config/nginx/worker_processes.conf
new file mode 100755
index 0000000..94de038
--- /dev/null
+++ b/heimdall/config/nginx/worker_processes.conf
@@ -0,0 +1,3 @@
+# This file is auto-generated only on first start, based on the cpu cores detected. Feel free to change it to any other number or to auto to let nginx handle it automatically.
+
+worker_processes 2;
diff --git a/heimdall/config/php/php-local.ini b/heimdall/config/php/php-local.ini
new file mode 100755
index 0000000..8087616
--- /dev/null
+++ b/heimdall/config/php/php-local.ini
@@ -0,0 +1,3 @@
+; Edit this file to override php.ini directives and restart the container
+
+date.timezone = Europe/Paris
diff --git a/heimdall/config/php/www2.conf b/heimdall/config/php/www2.conf
new file mode 100755
index 0000000..13fc59d
--- /dev/null
+++ b/heimdall/config/php/www2.conf
@@ -0,0 +1,5 @@
+; Edit this file to override www.conf and php-fpm.conf directives and restart the container
+
+; Pool name
+[www]
+
diff --git a/heimdall/config/www/.env b/heimdall/config/www/.env
new file mode 100755
index 0000000..fa545ab
--- /dev/null
+++ b/heimdall/config/www/.env
@@ -0,0 +1,31 @@
+APP_NAME=Heimdall
+APP_ENV=local
+APP_KEY=base64:b4dz4c5W2PVJo6dxJJsE4PNo3JgK+K/M0MDHJ1qGHFY=
+APP_DEBUG=true
+APP_LOG_LEVEL=debug
+APP_URL=http://localhost
+
+DB_CONNECTION=sqlite
+DB_DATABASE=app.sqlite
+
+BROADCAST_DRIVER=log
+CACHE_DRIVER=file
+SESSION_DRIVER=file
+SESSION_LIFETIME=120
+QUEUE_DRIVER=database
+
+REDIS_HOST=127.0.0.1
+REDIS_PASSWORD=null
+REDIS_PORT=6379
+
+MAIL_DRIVER=smtp
+MAIL_HOST=smtp.mailtrap.io
+MAIL_PORT=2525
+MAIL_USERNAME=null
+MAIL_PASSWORD=null
+MAIL_ENCRYPTION=null
+
+PUSHER_APP_ID=
+PUSHER_APP_KEY=
+PUSHER_APP_SECRET=
+PUSHER_APP_CLUSTER=mt1
diff --git a/heimdall/config/www/SupportedApps/AMP/AMP.php b/heimdall/config/www/SupportedApps/AMP/AMP.php
new file mode 100755
index 0000000..6b5a8de
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/AMP/AMP.php
@@ -0,0 +1,5 @@
+jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
+ }
+
+ public function test()
+ {
+ $test = parent::appTest($this->url('status'));
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = 'inactive';
+ $res = parent::execute($this->url('status'));
+ $details = json_decode($res->getBody());
+
+ $data = [];
+ return parent::getLiveStats($status, $data);
+
+ }
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url).$endpoint;
+ return $api_url;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/AWX/app.json b/heimdall/config/www/SupportedApps/AWX/app.json
new file mode 100755
index 0000000..d691f67
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/AWX/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "47bf44c0ec908654f16bacf131107a5aac3ae7b4",
+ "name": "AWX",
+ "website": "https://github.com/ansible/awx",
+ "license": "Apache License 2.0",
+ "description": "AWX provides a web-based user interface, REST API, and task engine built on top of Ansible. It is the upstream project for Tower, a commercial derivative of AWX.",
+ "enhanced": true,
+ "tile_background": "dark",
+ "icon": "awx.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/AWX/awx.png b/heimdall/config/www/SupportedApps/AWX/awx.png
new file mode 100755
index 0000000..084864e
Binary files /dev/null and b/heimdall/config/www/SupportedApps/AWX/awx.png differ
diff --git a/heimdall/config/www/SupportedApps/AWX/config.blade.php b/heimdall/config/www/SupportedApps/AWX/config.blade.php
new file mode 100755
index 0000000..51278e3
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/AWX/config.blade.php
@@ -0,0 +1,19 @@
+
\\s*([^<]+)<\/td>\\s* ([^<]+)<\/td><\/tr>/mi";
+ preg_match_all($exp, $tunersBody, $matches, PREG_SET_ORDER, 0);;
+ $inUse = 0;
+ $totalTuners = 0;
+ $match_count = count($matches);
+ for ($i = 0; $i < $match_count; $i++) {
+ if (count($matches[$i]) >= 2) {
+ if ($matches[$i][2] != "none" && $matches[$i][2] != "not in use") {
+ $inUse++;
+ }
+ }
+ $totalTuners++;
+ }
+ $data['tuners_in_use'] = number_format($inUse);
+ $data['tuners_total'] = number_format($totalTuners);
+ $status = 'active';
+ }
+ return parent::getLiveStats($status, $data);
+
+ }
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url).$endpoint;
+ return $api_url;
+ }
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/HDHomeRun/app.json b/heimdall/config/www/SupportedApps/HDHomeRun/app.json
new file mode 100755
index 0000000..7990394
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/HDHomeRun/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "8fe021dbb159e76695ab080421f68fac90579b0c",
+ "name": "HDHomeRun",
+ "website": "https://www.silicondust.com/",
+ "license": "Proprietary",
+ "description": "The DVR reimagined. Watch and Record all of your favorite live TV. Your way.",
+ "enhanced": true,
+ "tile_background": "dark",
+ "icon": "hdhomerun.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/HDHomeRun/config.blade.php b/heimdall/config/www/SupportedApps/HDHomeRun/config.blade.php
new file mode 100755
index 0000000..5b88f16
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/HDHomeRun/config.blade.php
@@ -0,0 +1,11 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', (isset($item) ? $item->getconfig()->override_url : null), array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ Test
+
+
diff --git a/heimdall/config/www/SupportedApps/HDHomeRun/hdhomerun.png b/heimdall/config/www/SupportedApps/HDHomeRun/hdhomerun.png
new file mode 100755
index 0000000..d09e40a
Binary files /dev/null and b/heimdall/config/www/SupportedApps/HDHomeRun/hdhomerun.png differ
diff --git a/heimdall/config/www/SupportedApps/HDHomeRun/livestats.blade.php b/heimdall/config/www/SupportedApps/HDHomeRun/livestats.blade.php
new file mode 100755
index 0000000..61fe39e
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/HDHomeRun/livestats.blade.php
@@ -0,0 +1,10 @@
+
+
+ Channels
+ {!! $number_of_channels !!}
+
+
+ Tuners In Use
+ {!! $tuners_in_use !!} of {!! $tuners_total !!}
+
+
diff --git a/heimdall/config/www/SupportedApps/Handbrake.zip b/heimdall/config/www/SupportedApps/Handbrake.zip
new file mode 100755
index 0000000..923fe2a
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Handbrake.zip
@@ -0,0 +1,88 @@
+
+
+
+
+
+ Page not found · GitHub Pages
+
+
+
+
+
+
+
404
+
File not found
+
+
+ The site configured at this address does not
+ contain the requested file.
+
+
+
+ If this is your site, make sure that the filename case matches the URL.
+ For root URLs (like http://example.com/) you must provide an
+ index.html file.
+
+
+
+ Read the full documentation
+ for more information about using GitHub Pages .
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/heimdall/config/www/SupportedApps/Handbrake/Handbrake.php b/heimdall/config/www/SupportedApps/Handbrake/Handbrake.php
new file mode 100755
index 0000000..c65312d
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Handbrake/Handbrake.php
@@ -0,0 +1,5 @@
+url('health'));
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = 'inactive';
+ $res = parent::execute($this->url('health'));
+
+ if ($res->getStatusCode() > 299) {
+ $data = [
+ 'error' => true,
+ 'statusCode' => $res->getStatusCode(),
+ 'items' => 0,
+ 'users' => 0,
+ ];
+ return parent::getLiveStats($status, $data);
+ }
+
+ $details = json_decode($res->getBody());
+
+ $data = [
+ 'error' => false,
+ 'statusCode' => $res->getStatusCode(),
+ 'items' => $details->items,
+ 'users' => $details->users,
+ ];
+
+ return parent::getLiveStats($status, $data);
+ }
+
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url) . $endpoint;
+ return $api_url;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/Heimdall/app.json b/heimdall/config/www/SupportedApps/Heimdall/app.json
new file mode 100755
index 0000000..2ef606c
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Heimdall/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "b2005b3bb19b3916425998c0edd72b97667ec1fc",
+ "name": "Heimdall",
+ "website": "https://heimdall.site/",
+ "license": "MIT License",
+ "description": "As the name suggests Heimdall Application Dashboard is a dashboard for all your web applications. It doesn't need to be limited to applications though, you can add links to anything you like.\r\nHeimdall is an elegant solution to organise all your web applications. It’s dedicated to this purpose so you won’t lose your links in a sea of bookmarks.\r\nWhy not use it as your browser start page? It even has the ability to include a search bar using either Google, Bing or DuckDuckGo.",
+ "enhanced": true,
+ "tile_background": "dark",
+ "icon": "heimdall.png"
+}
diff --git a/heimdall/config/www/SupportedApps/Heimdall/config.blade.php b/heimdall/config/www/SupportedApps/Heimdall/config.blade.php
new file mode 100755
index 0000000..216f377
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Heimdall/config.blade.php
@@ -0,0 +1,11 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', null, array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ Test
+
+
+
diff --git a/heimdall/config/www/SupportedApps/Heimdall/livestats.blade.php b/heimdall/config/www/SupportedApps/Heimdall/livestats.blade.php
new file mode 100755
index 0000000..6381a34
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Heimdall/livestats.blade.php
@@ -0,0 +1,17 @@
+
+ @if($error === true)
+
+ Error
+ {!! $statusCode !!}
+
+ @else
+
+ Users
+ {!! $users !!}
+
+
+ Items
+ {!! $items !!}
+
+ @endif
+
diff --git a/heimdall/config/www/SupportedApps/HomeAssistant/HomeAssistant.php b/heimdall/config/www/SupportedApps/HomeAssistant/HomeAssistant.php
new file mode 100755
index 0000000..1cd3af6
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/HomeAssistant/HomeAssistant.php
@@ -0,0 +1,35 @@
+jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
+ }
+
+ public function test()
+ {
+ $test = parent::appTest($this->url('status'));
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = 'inactive';
+ $res = parent::execute($this->url('status'));
+ $details = json_decode($res->getBody());
+
+ $data = [];
+ return parent::getLiveStats($status, $data);
+
+ }
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url).$endpoint;
+ return $api_url;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/HomeAssistant/app.json b/heimdall/config/www/SupportedApps/HomeAssistant/app.json
new file mode 100755
index 0000000..373c1ba
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/HomeAssistant/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "5c81a4f5ee23ebffa0724a22a040c54e6cb9d7c5",
+ "name": "HomeAssistant",
+ "website": "https://www.home-assistant.io/",
+ "license": "Apache License 2.0",
+ "description": "Open source home automation that puts local control and privacy first. Powered by a worldwide community of tinkerers and DIY enthusiasts.",
+ "enhanced": true,
+ "tile_background": "dark",
+ "icon": "homeassistant.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/HomeAssistant/config.blade.php b/heimdall/config/www/SupportedApps/HomeAssistant/config.blade.php
new file mode 100755
index 0000000..51278e3
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/HomeAssistant/config.blade.php
@@ -0,0 +1,19 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', null, array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ {{ __('app.apps.username') }}
+ {!! Form::text('config[username]', null, array('placeholder' => __('app.apps.username'), 'data-config' => 'username', 'class' => 'form-control config-item')) !!}
+
+
+ {{ __('app.apps.password') }}
+ {!! Form::text('config[password]', null, array('placeholder' => __('app.apps.password'), 'data-config' => 'password', 'class' => 'form-control config-item')) !!}
+
+
+ Test
+
+
+
diff --git a/heimdall/config/www/SupportedApps/HomeAssistant/homeassistant.png b/heimdall/config/www/SupportedApps/HomeAssistant/homeassistant.png
new file mode 100755
index 0000000..6f77c74
Binary files /dev/null and b/heimdall/config/www/SupportedApps/HomeAssistant/homeassistant.png differ
diff --git a/heimdall/config/www/SupportedApps/HomeAssistant/homeassistant.svg b/heimdall/config/www/SupportedApps/HomeAssistant/homeassistant.svg
new file mode 100755
index 0000000..73b25a8
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/HomeAssistant/homeassistant.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/HomeAssistant/livestats.blade.php b/heimdall/config/www/SupportedApps/HomeAssistant/livestats.blade.php
new file mode 100755
index 0000000..4fa2c8b
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/HomeAssistant/livestats.blade.php
@@ -0,0 +1,10 @@
+
+
+ Queue
+ {!! $queue_size !!}
+
+
+ Speed
+ {!! $current_speed !!}
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Homebridge/Homebridge.php b/heimdall/config/www/SupportedApps/Homebridge/Homebridge.php
new file mode 100755
index 0000000..da1c1b6
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Homebridge/Homebridge.php
@@ -0,0 +1,35 @@
+jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
+ }
+
+ public function test()
+ {
+ $test = parent::appTest($this->url('status'));
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = 'inactive';
+ $res = parent::execute($this->url('status'));
+ $details = json_decode($res->getBody());
+
+ $data = [];
+ return parent::getLiveStats($status, $data);
+
+ }
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url).$endpoint;
+ return $api_url;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/Homebridge/app.json b/heimdall/config/www/SupportedApps/Homebridge/app.json
new file mode 100755
index 0000000..d2a1920
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Homebridge/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "7d9fd30322f354d733c7c3b1b395f1655d12beb0",
+ "name": "Homebridge",
+ "website": "https://homebridge.io/",
+ "license": "Apache License 2.0",
+ "description": "Homebridge is a lightweight NodeJS server you can run on your home network that emulates the iOS HomeKit API. It supports Plugins, which are community-contributed modules that provide a basic bridge from HomeKit to various 3rd-party APIs provided by manufacturers of \"smart home\" devices.\r\n\r\nSince Siri supports devices added through HomeKit, this means that with Homebridge you can ask Siri to control devices that don't have any support for HomeKit at all.",
+ "enhanced": true,
+ "tile_background": "dark",
+ "icon": "homebridge.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Homebridge/config.blade.php b/heimdall/config/www/SupportedApps/Homebridge/config.blade.php
new file mode 100755
index 0000000..51278e3
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Homebridge/config.blade.php
@@ -0,0 +1,19 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', null, array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ {{ __('app.apps.username') }}
+ {!! Form::text('config[username]', null, array('placeholder' => __('app.apps.username'), 'data-config' => 'username', 'class' => 'form-control config-item')) !!}
+
+
+ {{ __('app.apps.password') }}
+ {!! Form::text('config[password]', null, array('placeholder' => __('app.apps.password'), 'data-config' => 'password', 'class' => 'form-control config-item')) !!}
+
+
+ Test
+
+
+
diff --git a/heimdall/config/www/SupportedApps/Homebridge/homebridge.png b/heimdall/config/www/SupportedApps/Homebridge/homebridge.png
new file mode 100755
index 0000000..81a0533
Binary files /dev/null and b/heimdall/config/www/SupportedApps/Homebridge/homebridge.png differ
diff --git a/heimdall/config/www/SupportedApps/Homebridge/livestats.blade.php b/heimdall/config/www/SupportedApps/Homebridge/livestats.blade.php
new file mode 100755
index 0000000..4fa2c8b
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Homebridge/livestats.blade.php
@@ -0,0 +1,10 @@
+
+
+ Queue
+ {!! $queue_size !!}
+
+
+ Speed
+ {!! $current_speed !!}
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Homer/Homer.php b/heimdall/config/www/SupportedApps/Homer/Homer.php
new file mode 100755
index 0000000..90b1748
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Homer/Homer.php
@@ -0,0 +1,5 @@
+
+image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/InfluxDB/InfluxDB.php b/heimdall/config/www/SupportedApps/InfluxDB/InfluxDB.php
new file mode 100755
index 0000000..166e9b4
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/InfluxDB/InfluxDB.php
@@ -0,0 +1,5 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/heimdall/config/www/SupportedApps/Infoblox/Infoblox.php b/heimdall/config/www/SupportedApps/Infoblox/Infoblox.php
new file mode 100755
index 0000000..99abf42
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Infoblox/Infoblox.php
@@ -0,0 +1,5 @@
+url, "/");
+ $q = urlencode($query);
+ return redirect($url . "#search=" . $q);
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/Jackett/app.json b/heimdall/config/www/SupportedApps/Jackett/app.json
new file mode 100755
index 0000000..b2b7897
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Jackett/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "9d24b65315557ddd848ba44b09191a6ab305966f",
+ "name": "Jackett",
+ "website": "https://github.com/Jackett/Jackett",
+ "license": "GNU General Public License v2.0 only",
+ "description": "Jackett works as a proxy server: it translates queries from apps (Sonarr, Radarr, SickRage, CouchPotato, Mylar, DuckieTV, etc) into tracker-site-specific http queries, parses the html response, then sends results back to the requesting software.",
+ "enhanced": false,
+ "tile_background": "light",
+ "icon": "jackett.svg"
+}
diff --git a/heimdall/config/www/SupportedApps/Jackett/jackett.png b/heimdall/config/www/SupportedApps/Jackett/jackett.png
new file mode 100755
index 0000000..fe687a4
Binary files /dev/null and b/heimdall/config/www/SupportedApps/Jackett/jackett.png differ
diff --git a/heimdall/config/www/SupportedApps/Jaeger/Jaeger.php b/heimdall/config/www/SupportedApps/Jaeger/Jaeger.php
new file mode 100755
index 0000000..fa8bbdc
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Jaeger/Jaeger.php
@@ -0,0 +1,77 @@
+config->service;
+ $operation = $this->config->operation;
+ $tags = $this->config->tags;
+ $lookback = $this->config->lookback;
+ $minDuration = $this->config->minDuration;
+ $maxDuration = $this->config->maxDuration;
+ $limit = $this->config->limit;
+
+ $endpoint = 'api/traces?service='.urlencode($service);
+ if (!empty($operation)) $endpoint .= '&operation='.urlencode($operation);
+ if (!empty($tags)) $endpoint .= '&tags='. urlencode($tags);
+ if (!empty($lookback)) {
+ $lookbackFormatted = str_replace('d', ' days', str_replace('h', ' hours', $lookback));
+ $timestampForOffset = time();
+ $offset = $timestampForOffset - strtotime('-'.$lookbackFormatted, $timestampForOffset);
+
+ $timestamp = microtime(true);
+ $end = sprintf('%0.0f', $timestamp * 1000000);
+ $start = sprintf('%0.0f', ($timestamp - $offset) * 1000000);
+ $endpoint .= '&lookback='.urlencode($lookback);
+ $endpoint .= '&start='.$start;
+ $endpoint .= '&end='.$end;
+ }
+ if (!empty($minDuration)) $endpoint .= '&minDuration='.urlencode($minDuration);
+ if (!empty($maxDuration)) $endpoint .= '&maxDuration='.urlencode($maxDuration);
+ if (!empty($limit)) $endpoint .= '&limit='.urlencode($limit);
+ return $this->url($endpoint);
+ }
+
+ public function test()
+ {
+ $test = parent::appTest($this->tracesUrl());
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = 'inactive';
+ $res = parent::execute($this->tracesUrl());
+ $details = json_decode($res->getBody());
+
+ $data = [];
+
+ if($details) {
+ $status = 'active';
+ $data['traces'] = count($details->data);
+ $data['avg_duration'] = 0;
+ if ($data['traces'] > 0) {
+ $durations = array_map(function($dataItem) {
+ $max = 0;
+ foreach ($dataItem->spans as $spanItem) {
+ $max = max($max, $spanItem->duration);
+ }
+ return $max;
+ }, $details->data);
+ $data['avg_duration'] = round(array_sum($durations)/$data['traces']/1000, 1);
+ }
+ }
+ return parent::getLiveStats($status, $data);
+
+ }
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url).$endpoint;
+ return $api_url;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/Jaeger/app.json b/heimdall/config/www/SupportedApps/Jaeger/app.json
new file mode 100755
index 0000000..ac72775
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Jaeger/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "917883dc82d936304725edacb6bf11e5cf537be6",
+ "name": "Jaeger",
+ "website": "https://www.jaegertracing.io/",
+ "license": "Apache License 2.0",
+ "description": "Jaeger is a distributed tracing platform, which can be used for monitoring microservices-based distributed systems.",
+ "enhanced": true,
+ "tile_background": "light",
+ "icon": "jaeger.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Jaeger/config.blade.php b/heimdall/config/www/SupportedApps/Jaeger/config.blade.php
new file mode 100755
index 0000000..ddae07f
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Jaeger/config.blade.php
@@ -0,0 +1,42 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', (isset($item) ? $item->getconfig()->override_url : null), array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ Service
+ {!! Form::text('config[service]', (isset($item) ? $item->getconfig()->service : 'jaeger-query'), array('placeholder' => 'Service, e.g. jaeger-query', 'data-config' => 'service', 'class' => 'form-control config-item')) !!}
+
+
+ Operation
+ {!! Form::text('config[operation]', (isset($item) ? $item->getconfig()->operation : null), array('placeholder' => 'Operation, e.g. /api/traces', 'data-config' => 'operation', 'class' => 'form-control config-item')) !!}
+
+
+
+
+ {{ __('app.apps.tags') }}
+ {!! Form::text('config[tags]', (isset($item) ? $item->getconfig()->tags : null), array('placeholder' => __('app.apps.tags'), 'data-config' => 'tags', 'class' => 'form-control config-item')) !!}
+
+
+ Lookback
+ {!! Form::select('config[lookback]', array('1h' => 'Last Hour', '2h' => 'Last 2 Hours', '3h' => 'Last 3 Hours', '6h' => 'Last 6 Hours', '12h' => 'Last 12 Hours', '24h' => 'Last 24 Hours', '2d' => 'Last 2 Days'), (isset($item) ? $item->getconfig()->lookback : null), array('data-config' => 'lookback', 'class' => 'form-control config-item')) !!}
+
+
+ Limit
+ {!! Form::text('config[limit]', (isset($item) ? $item->getconfig()->limit : 100), array('placeholder' => 'Limit results', 'data-config' => 'limit', 'class' => 'form-control config-item')) !!}
+
+
+
+
+ Min Duration
+ {!! Form::text('config[minDuration]', (isset($item) ? $item->getconfig()->minDuration : null), array('placeholder' => 'e.g. 1.2s, 100ms, 500us', 'data-config' => 'minDuration', 'class' => 'form-control config-item')) !!}
+
+
+ MaxDuration
+ {!! Form::text('config[maxDuration]', (isset($item) ? $item->getconfig()->maxDuration : null), array('placeholder' => 'e.g. 1.2s, 100ms, 500us', 'data-config' => 'maxDuration', 'class' => 'form-control config-item')) !!}
+
+
+ Test
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Jaeger/jaeger.png b/heimdall/config/www/SupportedApps/Jaeger/jaeger.png
new file mode 100755
index 0000000..1e17e50
Binary files /dev/null and b/heimdall/config/www/SupportedApps/Jaeger/jaeger.png differ
diff --git a/heimdall/config/www/SupportedApps/Jaeger/livestats.blade.php b/heimdall/config/www/SupportedApps/Jaeger/livestats.blade.php
new file mode 100755
index 0000000..d6db562
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Jaeger/livestats.blade.php
@@ -0,0 +1,10 @@
+
+
+ Traces
+ {!! $traces !!}
+
+
+ Duration
+ {!! $avg_duration !!} ms
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Jeedom/Jeedom.php b/heimdall/config/www/SupportedApps/Jeedom/Jeedom.php
new file mode 100755
index 0000000..534c366
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Jeedom/Jeedom.php
@@ -0,0 +1,5 @@
+url("System/Info/Public"),
+ $this->getAttrs()
+ );
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = "inactive";
+ $res = parent::execute($this->url("Items/Counts"), $this->getAttrs());
+ $result = json_decode($res->getBody());
+ $details = ["visiblestats" => []];
+ foreach ($this->config->availablestats as $stat) {
+ $newstat = new \stdClass();
+ $newstat->title = self::getAvailableStats()[$stat];
+ $newstat->value = $result->{$stat};
+ $details["visiblestats"][] = $newstat;
+ }
+ return parent::getLiveStats($status, $details);
+ }
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url) . $endpoint;
+ return $api_url;
+ }
+
+ private function getAttrs()
+ {
+ return [
+ "headers" => [
+ "X-MediaBrowser-Token" => $this->config->password,
+ ],
+ ];
+ }
+
+ public static function getAvailableStats()
+ {
+ return [
+ "MovieCount" => "Movies",
+ "SeriesCount" => "Series",
+ "EpisodeCount" => "Episodes",
+ "ArtistCount" => "Artists",
+ "ProgramCount" => "Programs",
+ "TrailerCount" => "Trailers",
+ "SongCount" => "Songs",
+ "AlbumCount" => "Albums",
+ "MusicVideoCount" => "MusicVideos",
+ "BoxSetCount" => "BoxSets",
+ "BookCount" => "Books",
+ "ItemCount" => "Items",
+ ];
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/Jellyfin/app.json b/heimdall/config/www/SupportedApps/Jellyfin/app.json
new file mode 100755
index 0000000..2460041
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Jellyfin/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "3e0a7f109bd760b9474c78cb652e8c3e82669226",
+ "name": "Jellyfin",
+ "website": "https://jellyfin.github.io",
+ "license": "GNU General Public License v2.0 only",
+ "description": "Jellyfin is the Free Software Media System that puts you in control of managing and streaming your media. There are no strings attached, no premium licenses or features, and no hidden agendas.",
+ "enhanced": true,
+ "tile_background": "dark",
+ "icon": "jellyfin.svg"
+}
diff --git a/heimdall/config/www/SupportedApps/Jellyfin/config.blade.php b/heimdall/config/www/SupportedApps/Jellyfin/config.blade.php
new file mode 100755
index 0000000..faa3632
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Jellyfin/config.blade.php
@@ -0,0 +1,18 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', isset($item) ? $item->getconfig()->override_url : null, ['placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control']) !!}
+
+
+ {{ __('app.apps.password') }} (secret token)
+ {!! Form::input('password', 'config[password]', '', ['placeholder' => __('app.apps.password'), 'data-config' => 'password', 'class' => 'form-control config-item']) !!}
+
+
+ Stats to show
+ {!! Form::select('config[availablestats][]', App\SupportedApps\Jellyfin\Jellyfin::getAvailableStats(), isset($item) ? $item->getConfig()->availablestats ?? null : null, ['multiple' => 'multiple']) !!}
+
+
+ Test
+
+
diff --git a/heimdall/config/www/SupportedApps/Jellyfin/jellyfin.png b/heimdall/config/www/SupportedApps/Jellyfin/jellyfin.png
new file mode 100755
index 0000000..4335d48
Binary files /dev/null and b/heimdall/config/www/SupportedApps/Jellyfin/jellyfin.png differ
diff --git a/heimdall/config/www/SupportedApps/Jellyfin/livestats.blade.php b/heimdall/config/www/SupportedApps/Jellyfin/livestats.blade.php
new file mode 100755
index 0000000..cb9431a
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Jellyfin/livestats.blade.php
@@ -0,0 +1,8 @@
+
+ @foreach ($visiblestats as $stat)
+
+ {!! $stat->title !!}
+ {!! $stat->value !!}
+
+ @endforeach
+
diff --git a/heimdall/config/www/SupportedApps/Jellyseerr/Jellyseerr.php b/heimdall/config/www/SupportedApps/Jellyseerr/Jellyseerr.php
new file mode 100755
index 0000000..51ed1b7
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Jellyseerr/Jellyseerr.php
@@ -0,0 +1,61 @@
+jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
+ }
+
+ public function test()
+ {
+ $this->attrs["headers"] = [
+ "accept" => "application/json",
+ "X-Api-Key" => $this->config->apikey,
+ ];
+
+ $test = parent::appTest($this->url("auth/me"), $this->attrs);
+
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = "inactive";
+ $data = [];
+ $this->attrs["headers"] = [
+ "accept" => "application/json",
+ "X-Api-Key" => $this->config->apikey,
+ ];
+
+ $pendingRequestsCount = json_decode(
+ parent::execute($this->url("request/count"), $this->attrs)->getBody()
+ );
+
+ $pendingIssueCount = json_decode(
+ parent::execute($this->url("issue/count"), $this->attrs)->getBody()
+ );
+
+ if ($pendingRequestsCount || $pendingIssueCount)
+ {
+ $data["requests"] = $pendingRequestsCount->pending ?? 0;
+ $data["issues"] = $pendingIssueCount->open ?? 0;
+ }
+
+ return parent::getLiveStats($status, $data);
+ }
+
+ public function url($endpoint)
+ {
+ $api_url =
+ parent::normaliseurl($this->config->url) .
+ "api/v1/" .
+ $endpoint;
+
+ return $api_url;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/Jellyseerr/app.json b/heimdall/config/www/SupportedApps/Jellyseerr/app.json
new file mode 100755
index 0000000..270a69c
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Jellyseerr/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "0628c8d1a4868d6e6b994ae43a091f4e142ce642",
+ "name": "Jellyseerr",
+ "website": "https://github.com/Fallenbagel/jellyseerr",
+ "license": "MIT License",
+ "description": "Jellyseerr is a free and open source software application for managing requests for your media library. It is a a fork of Overseerr built to bring support for Jellyfin & Emby media servers!",
+ "enhanced": true,
+ "tile_background": "dark",
+ "icon": "jellyseerr.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Jellyseerr/config.blade.php b/heimdall/config/www/SupportedApps/Jellyseerr/config.blade.php
new file mode 100755
index 0000000..4a8082c
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Jellyseerr/config.blade.php
@@ -0,0 +1,14 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', isset($item) ? $item->getconfig()->override_url : null, ['placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control']) !!}
+
+
+ {{ __('app.apps.apikey') }}
+ {!! Form::text('config[apikey]', isset($item) ? $item->getconfig()->apikey : null, ['placeholder' => __('app.apps.apikey'), 'data-config' => 'apikey', 'class' => 'form-control config-item']) !!}
+
+
+ Test
+
+
diff --git a/heimdall/config/www/SupportedApps/Jellyseerr/livestats.blade.php b/heimdall/config/www/SupportedApps/Jellyseerr/livestats.blade.php
new file mode 100755
index 0000000..0e1e305
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Jellyseerr/livestats.blade.php
@@ -0,0 +1,10 @@
+
+
+ Requests
+ {!! $requests !!}
+
+
+ Issues
+ {!! $issues !!}
+
+
diff --git a/heimdall/config/www/SupportedApps/Jenkins/Jenkins.php b/heimdall/config/www/SupportedApps/Jenkins/Jenkins.php
new file mode 100755
index 0000000..09e7e94
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Jenkins/Jenkins.php
@@ -0,0 +1,5 @@
+jira software-icon-gradient-blue
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Jitsi/Jitsi.php b/heimdall/config/www/SupportedApps/Jitsi/Jitsi.php
new file mode 100755
index 0000000..febb58e
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Jitsi/Jitsi.php
@@ -0,0 +1,5 @@
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Jupyter
+
+
diff --git a/heimdall/config/www/SupportedApps/Kanboard/Kanboard.php b/heimdall/config/www/SupportedApps/Kanboard/Kanboard.php
new file mode 100755
index 0000000..f2c718a
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Kanboard/Kanboard.php
@@ -0,0 +1,5 @@
+keycloak_deliverables
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Kibana/Kibana.php b/heimdall/config/www/SupportedApps/Kibana/Kibana.php
new file mode 100755
index 0000000..21099ef
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Kibana/Kibana.php
@@ -0,0 +1,5 @@
+config->url) . 'jsonrpc?request={"id":1,"jsonrpc":"2.0","method":"' . $endpoint . '"}';
+ return $api_url;
+ }
+
+ private function getAttrs() {
+ return [
+ 'headers' => [
+ 'Authorization' => 'Basic ' . base64_encode($this->config->username . ':' . $this->config->password),
+ ]
+ ];
+ }
+
+ public function test()
+ {
+ $test = parent::appTest($this->url('JSONRPC.Introspect'), $this->getAttrs());
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = 'inactive';
+ $data = ['visiblestats' => []];
+ foreach($this->config->availablestats as $method) {
+ $res = parent::execute($this->url($method), $this->getAttrs());
+ $result = json_decode($res->getBody());
+ if ( isset($result->result) && isset($result->result->limits) ) {
+ $stat = new \stdClass();
+ $stat->title = self::getAvailableStats()[$method];
+ $stat->value = $result->result->limits->total;
+ $data['visiblestats'][] = $stat;
+ }
+ }
+ return parent::getLiveStats($status, $data);
+ }
+
+ public static function getAvailableStats()
+ {
+ return [
+ 'VideoLibrary.GetMovies' => 'Movies',
+ 'VideoLibrary.GetMovieSets' => 'Movie Sets',
+ 'VideoLibrary.GetTVShows' => 'TV Shows',
+ 'VideoLibrary.GetEpisodes' => 'Episodes',
+ 'PVR.GetRecordings' => 'PVR Rec',
+ 'AudioLibrary.GetArtists' => 'Artists',
+ 'AudioLibrary.GetAlbums' => 'Albums',
+ 'AudioLibrary.GetSongs' => 'Songs',
+ 'VideoLibrary.GetMusicVideos' => 'Music Vids',
+ ];
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/Kodi/app.json b/heimdall/config/www/SupportedApps/Kodi/app.json
new file mode 100755
index 0000000..ee0b9e2
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Kodi/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "8ac539a79155a0032834264ac3f6dbd38f1c812d",
+ "name": "Kodi",
+ "website": "https://kodi.tv/",
+ "license": "GNU General Public License v1.0 or later",
+ "description": "Kodi (formerly known as XBMC) is an award-winning free and open source (GPL) software media player and entertainment hub that can be installed on Linux, OSX, Windows, iOS and Android, featuring a 10-foot user interface for use with televisions and remote controls.",
+ "enhanced": true,
+ "tile_background": "dark",
+ "icon": "kodi.png"
+}
diff --git a/heimdall/config/www/SupportedApps/Kodi/config.blade.php b/heimdall/config/www/SupportedApps/Kodi/config.blade.php
new file mode 100755
index 0000000..69aad3c
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Kodi/config.blade.php
@@ -0,0 +1,22 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', null, array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ {{ __('app.apps.username') }}
+ {!! Form::text('config[username]', null, array('placeholder' => __('app.apps.username'), 'data-config' => 'username', 'class' => 'form-control config-item')) !!}
+
+
+ {{ __('app.apps.password') }}
+ {!! Form::password('config[password]', array('placeholder' => __('app.apps.password'), 'data-config' => 'password', 'class' => 'form-control config-item')) !!}
+
+
+ Stats to show
+ {!! Form::select('config[availablestats][]', App\SupportedApps\Kodi\Kodi::getAvailableStats(), isset($item) ? ($item->getConfig()->availablestats ?? null) : null, array('multiple'=>'multiple')) !!}
+
+
+ Test
+
+
diff --git a/heimdall/config/www/SupportedApps/Kodi/kodi.png b/heimdall/config/www/SupportedApps/Kodi/kodi.png
new file mode 100755
index 0000000..c88b069
Binary files /dev/null and b/heimdall/config/www/SupportedApps/Kodi/kodi.png differ
diff --git a/heimdall/config/www/SupportedApps/Kodi/livestats.blade.php b/heimdall/config/www/SupportedApps/Kodi/livestats.blade.php
new file mode 100755
index 0000000..cb9431a
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Kodi/livestats.blade.php
@@ -0,0 +1,8 @@
+
+ @foreach ($visiblestats as $stat)
+
+ {!! $stat->title !!}
+ {!! $stat->value !!}
+
+ @endforeach
+
diff --git a/heimdall/config/www/SupportedApps/Komga/Komga.php b/heimdall/config/www/SupportedApps/Komga/Komga.php
new file mode 100755
index 0000000..d4cac76
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Komga/Komga.php
@@ -0,0 +1,35 @@
+jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
+ }
+
+ public function test()
+ {
+ $test = parent::appTest($this->url('status'));
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = 'inactive';
+ $res = parent::execute($this->url('status'));
+ $details = json_decode($res->getBody());
+
+ $data = [];
+ return parent::getLiveStats($status, $data);
+
+ }
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url).$endpoint;
+ return $api_url;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/Komga/app.json b/heimdall/config/www/SupportedApps/Komga/app.json
new file mode 100755
index 0000000..6665682
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Komga/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "6cd97a5fefab651371f821cb5167733112fbc536",
+ "name": "Komga",
+ "website": "https://komga.org/",
+ "license": "MIT License",
+ "description": "Komga is a free and open source comics/mangas server.",
+ "enhanced": true,
+ "tile_background": "dark",
+ "icon": "komga.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Komga/config.blade.php b/heimdall/config/www/SupportedApps/Komga/config.blade.php
new file mode 100755
index 0000000..51278e3
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Komga/config.blade.php
@@ -0,0 +1,19 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', null, array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ {{ __('app.apps.username') }}
+ {!! Form::text('config[username]', null, array('placeholder' => __('app.apps.username'), 'data-config' => 'username', 'class' => 'form-control config-item')) !!}
+
+
+ {{ __('app.apps.password') }}
+ {!! Form::text('config[password]', null, array('placeholder' => __('app.apps.password'), 'data-config' => 'password', 'class' => 'form-control config-item')) !!}
+
+
+ Test
+
+
+
diff --git a/heimdall/config/www/SupportedApps/Komga/komga.png b/heimdall/config/www/SupportedApps/Komga/komga.png
new file mode 100755
index 0000000..9b404e7
Binary files /dev/null and b/heimdall/config/www/SupportedApps/Komga/komga.png differ
diff --git a/heimdall/config/www/SupportedApps/Komga/livestats.blade.php b/heimdall/config/www/SupportedApps/Komga/livestats.blade.php
new file mode 100755
index 0000000..4fa2c8b
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Komga/livestats.blade.php
@@ -0,0 +1,10 @@
+
+
+ Queue
+ {!! $queue_size !!}
+
+
+ Speed
+ {!! $current_speed !!}
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Kopia/Kopia.php b/heimdall/config/www/SupportedApps/Kopia/Kopia.php
new file mode 100755
index 0000000..3c0a0b0
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Kopia/Kopia.php
@@ -0,0 +1,5 @@
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/heimdall/config/www/SupportedApps/LazyLibrarian/LazyLibrarian.php b/heimdall/config/www/SupportedApps/LazyLibrarian/LazyLibrarian.php
new file mode 100755
index 0000000..1273d95
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/LazyLibrarian/LazyLibrarian.php
@@ -0,0 +1,5 @@
+jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
+ }
+
+ public function test()
+ {
+ $test = parent::appTest($this->url('system/status'));
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = 'inactive';
+ $missing = json_decode(parent::execute($this->url('wanted/missing'))->getBody());
+ $queue = json_decode(parent::execute($this->url('queue'))->getBody());
+
+ if($missing || $queue) {
+ $data['missing'] = $missing->totalRecords ?? 0;
+ $data['queue'] = $queue->totalRecords ?? 0;
+ }
+
+ return parent::getLiveStats($status, $data);
+ }
+
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url).'api/v1/'.$endpoint.'?apikey='.$this->config->apikey;
+ return $api_url;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/Lidarr/app.json b/heimdall/config/www/SupportedApps/Lidarr/app.json
new file mode 100755
index 0000000..9ac703b
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Lidarr/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "c015fff30a3dc43f5987079c0142437e3e757fd0",
+ "name": "Lidarr",
+ "website": "https://lidarr.audio/",
+ "license": "GNU General Public License v3.0 only",
+ "description": "Lidarr is a music collection manager for Usenet and BitTorrent users. It can monitor multiple RSS feeds for new tracks from your favorite artists and will grab, sort and rename them.",
+ "enhanced": true,
+ "tile_background": "dark",
+ "icon": "lidarr.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Lidarr/config.blade.php b/heimdall/config/www/SupportedApps/Lidarr/config.blade.php
new file mode 100755
index 0000000..87755d5
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Lidarr/config.blade.php
@@ -0,0 +1,15 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', (isset($item) ? $item->getconfig()->override_url : null), array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ {{ __('app.apps.apikey') }}
+ {!! Form::text('config[apikey]', (isset($item) ? $item->getconfig()->apikey : null), array('placeholder' => __('app.apps.apikey'), 'data-config' => 'apikey', 'class' => 'form-control config-item')) !!}
+
+
+ Test
+
+
+
diff --git a/heimdall/config/www/SupportedApps/Lidarr/lidarr.png b/heimdall/config/www/SupportedApps/Lidarr/lidarr.png
new file mode 100755
index 0000000..199ca63
Binary files /dev/null and b/heimdall/config/www/SupportedApps/Lidarr/lidarr.png differ
diff --git a/heimdall/config/www/SupportedApps/Lidarr/livestats.blade.php b/heimdall/config/www/SupportedApps/Lidarr/livestats.blade.php
new file mode 100755
index 0000000..7b7fb92
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Lidarr/livestats.blade.php
@@ -0,0 +1,10 @@
+
+
+ Missing
+ {!! $missing !!}
+
+
+ Queue
+ {!! $queue !!}
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/LinkAce/LinkAce.php b/heimdall/config/www/SupportedApps/LinkAce/LinkAce.php
new file mode 100755
index 0000000..7cf9d5c
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/LinkAce/LinkAce.php
@@ -0,0 +1,63 @@
+jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
+ }
+
+ public function test()
+ {
+ $test = parent::appTest($this->url("api/v1/links"));
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = "inactive";
+
+ $res_links = parent::execute(
+ $this->url("api/v1/links"),
+ $this->attrs()
+ );
+ $links = json_decode($res_links->getBody(), true);
+
+ $res_tags = parent::execute($this->url("api/v1/tags"), $this->attrs());
+ $tags = json_decode($res_tags->getBody(), true);
+
+ $data = [];
+
+ if ($links) {
+ $data["links"] = $links["total"] ?? 0;
+ }
+
+ if ($tags) {
+ $data["tags"] = $tags["total"] ?? 0;
+ }
+
+ return parent::getLiveStats($status, $data);
+ }
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url) . $endpoint;
+ return $api_url;
+ }
+
+ public function attrs()
+ {
+ $apikey = $this->config->apikey;
+ $attrs = [
+ "headers" => [
+ "content-type" => "application/json",
+ "Authorization" => "Bearer " . $apikey,
+ ],
+ ];
+ return $attrs;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/LinkAce/app.json b/heimdall/config/www/SupportedApps/LinkAce/app.json
new file mode 100755
index 0000000..f07a679
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/LinkAce/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "c7eef6a399bb48a066d4e11fc577e896bc142cf3",
+ "name": "LinkAce",
+ "website": "https://www.linkace.org",
+ "license": "GNU General Public License v3.0 only",
+ "description": "LinkAce is a self-hosted archive to collect links of your favorite websites. Save articles to read them later, tools to use them in your next project, or historic content to archive it for the long term. LinkAce comes with a lot of features while keeping a clean and minimal interface.",
+ "enhanced": true,
+ "tile_background": "dark",
+ "icon": "linkace.svg"
+}
diff --git a/heimdall/config/www/SupportedApps/LinkAce/config.blade.php b/heimdall/config/www/SupportedApps/LinkAce/config.blade.php
new file mode 100755
index 0000000..4a8082c
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/LinkAce/config.blade.php
@@ -0,0 +1,14 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', isset($item) ? $item->getconfig()->override_url : null, ['placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control']) !!}
+
+
+ {{ __('app.apps.apikey') }}
+ {!! Form::text('config[apikey]', isset($item) ? $item->getconfig()->apikey : null, ['placeholder' => __('app.apps.apikey'), 'data-config' => 'apikey', 'class' => 'form-control config-item']) !!}
+
+
+ Test
+
+
diff --git a/heimdall/config/www/SupportedApps/LinkAce/linkace.png b/heimdall/config/www/SupportedApps/LinkAce/linkace.png
new file mode 100755
index 0000000..63439a7
Binary files /dev/null and b/heimdall/config/www/SupportedApps/LinkAce/linkace.png differ
diff --git a/heimdall/config/www/SupportedApps/LinkAce/livestats.blade.php b/heimdall/config/www/SupportedApps/LinkAce/livestats.blade.php
new file mode 100755
index 0000000..83e0c05
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/LinkAce/livestats.blade.php
@@ -0,0 +1,10 @@
+
+
+ Links
+ {!! $links !!}
+
+
+ Tags
+ {!! $tags !!}
+
+
diff --git a/heimdall/config/www/SupportedApps/Lychee/Lychee.php b/heimdall/config/www/SupportedApps/Lychee/Lychee.php
new file mode 100755
index 0000000..4c49a65
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Lychee/Lychee.php
@@ -0,0 +1,5 @@
+
+
+
+image/svg+xml
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/MailcowSOGo/MailcowSOGo.php b/heimdall/config/www/SupportedApps/MailcowSOGo/MailcowSOGo.php
new file mode 100755
index 0000000..56347a0
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/MailcowSOGo/MailcowSOGo.php
@@ -0,0 +1,5 @@
+
+
+image/svg+xml
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Mailhog/Mailhog.php b/heimdall/config/www/SupportedApps/Mailhog/Mailhog.php
new file mode 100755
index 0000000..bd61545
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Mailhog/Mailhog.php
@@ -0,0 +1,5 @@
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/heimdall/config/www/SupportedApps/Mattermost/Mattermost.php b/heimdall/config/www/SupportedApps/Mattermost/Mattermost.php
new file mode 100755
index 0000000..87a4b93
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Mattermost/Mattermost.php
@@ -0,0 +1,5 @@
+jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
+ }
+
+ public function test()
+ {
+ $test = parent::appTest($this->url('status'));
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = 'inactive';
+ $res = parent::execute($this->url('status'));
+ $details = json_decode($res->getBody());
+
+ $data = [];
+ return parent::getLiveStats($status, $data);
+
+ }
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url).$endpoint;
+ return $api_url;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/Mealie/app.json b/heimdall/config/www/SupportedApps/Mealie/app.json
new file mode 100755
index 0000000..3b96306
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Mealie/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "95fc71dc5b7a31e5a244df43f457a6eedc966ac9",
+ "name": "Mealie",
+ "website": "https://github.com/hay-kot/mealie",
+ "license": "MIT License",
+ "description": "Mealie is a self hosted recipe manager and meal planner with a RestAPI backend and a reactive frontend application built in Vue for a pleasant user experience for the whole family. Easily add recipes into your database by providing the url and mealie will automatically import the relevant data or add a family recipe with the UI editor.",
+ "enhanced": true,
+ "tile_background": "dark",
+ "icon": "mealie.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Mealie/config.blade.php b/heimdall/config/www/SupportedApps/Mealie/config.blade.php
new file mode 100755
index 0000000..51278e3
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Mealie/config.blade.php
@@ -0,0 +1,19 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', null, array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ {{ __('app.apps.username') }}
+ {!! Form::text('config[username]', null, array('placeholder' => __('app.apps.username'), 'data-config' => 'username', 'class' => 'form-control config-item')) !!}
+
+
+ {{ __('app.apps.password') }}
+ {!! Form::text('config[password]', null, array('placeholder' => __('app.apps.password'), 'data-config' => 'password', 'class' => 'form-control config-item')) !!}
+
+
+ Test
+
+
+
diff --git a/heimdall/config/www/SupportedApps/Mealie/livestats.blade.php b/heimdall/config/www/SupportedApps/Mealie/livestats.blade.php
new file mode 100755
index 0000000..4fa2c8b
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Mealie/livestats.blade.php
@@ -0,0 +1,10 @@
+
+
+ Queue
+ {!! $queue_size !!}
+
+
+ Speed
+ {!! $current_speed !!}
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Mealie/mealie.png b/heimdall/config/www/SupportedApps/Mealie/mealie.png
new file mode 100755
index 0000000..fdfa471
Binary files /dev/null and b/heimdall/config/www/SupportedApps/Mealie/mealie.png differ
diff --git a/heimdall/config/www/SupportedApps/MediaWiki/MediaWiki.php b/heimdall/config/www/SupportedApps/MediaWiki/MediaWiki.php
new file mode 100755
index 0000000..f1b3a00
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/MediaWiki/MediaWiki.php
@@ -0,0 +1,5 @@
+config->username != '' || $this->config->password != '') {
+ $this->attrs = ['auth'=> [$this->config->username, $this->config->password]];
+ }
+ }
+
+ public function test()
+ {
+ $this->setClientOptions();
+ $test = parent::appTest($this->url(self::ENDPOINT), $this->attrs);
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $this->setClientOptions();
+ $res = parent::execute($this->url(self::ENDPOINT), $this->attrs);
+ $details = json_decode($res->getBody());
+
+ $data['count_unread'] = $details->total;
+ return parent::getLiveStats('inactive', $data);
+ }
+
+ public function url($endpoint)
+ {
+ return parent::normaliseurl($this->config->url).$endpoint;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/Miniflux/app.json b/heimdall/config/www/SupportedApps/Miniflux/app.json
new file mode 100755
index 0000000..5887f0b
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Miniflux/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "f1a89a23921939fc4ea89777cf9c7d6c08679fde",
+ "name": "Miniflux",
+ "website": "https://miniflux.app/",
+ "license": "Apache License 2.0",
+ "description": "Miniflux is a lightweight RSS feed reader app.",
+ "enhanced": true,
+ "tile_background": "dark",
+ "icon": "miniflux.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Miniflux/config.blade.php b/heimdall/config/www/SupportedApps/Miniflux/config.blade.php
new file mode 100755
index 0000000..f03eda1
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Miniflux/config.blade.php
@@ -0,0 +1,19 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', null, array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ {{ __('app.apps.username') }}
+ {!! Form::text('config[username]', null, array('placeholder' => __('app.apps.username'), 'data-config' => 'username', 'class' => 'form-control config-item')) !!}
+
+
+ {{ __('app.apps.password') }}
+ {!! Form::password('config[password]', array('placeholder' => __('app.apps.password'), 'data-config' => 'password', 'class' => 'form-control config-item')) !!}
+
+
+ Test
+
+
+
diff --git a/heimdall/config/www/SupportedApps/Miniflux/livestats.blade.php b/heimdall/config/www/SupportedApps/Miniflux/livestats.blade.php
new file mode 100755
index 0000000..ee7acf0
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Miniflux/livestats.blade.php
@@ -0,0 +1,6 @@
+
+
+ Unread entries
+ {!! $count_unread !!}
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Miniflux/miniflux.png b/heimdall/config/www/SupportedApps/Miniflux/miniflux.png
new file mode 100755
index 0000000..8915982
Binary files /dev/null and b/heimdall/config/www/SupportedApps/Miniflux/miniflux.png differ
diff --git a/heimdall/config/www/SupportedApps/Minio/Minio.php b/heimdall/config/www/SupportedApps/Minio/Minio.php
new file mode 100755
index 0000000..09c3821
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Minio/Minio.php
@@ -0,0 +1,5 @@
+jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
+ }
+
+ public function test()
+ {
+ $test = parent::appTest($this->url('api/contacts'));
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = 'inactive';
+ $res = parent::execute($this->url('api/contacts'), $this->attrs());
+ $details = json_decode($res->getBody(), True);
+
+ $data = [];
+
+ if($details) {
+ $data['contacts'] = $details['meta']['total'] ?? 0;
+ }
+
+ return parent::getLiveStats($status, $data);
+ }
+
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url).$endpoint;
+ return $api_url;
+ }
+
+ public function attrs()
+ {
+ $apikey = $this->config->apikey;
+ $attrs = [
+ 'headers' => ['content-type' => 'application/json', 'Authorization' => 'Bearer '.$apikey]
+ ];
+ return $attrs;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/Monica/app.json b/heimdall/config/www/SupportedApps/Monica/app.json
new file mode 100755
index 0000000..7ba72e2
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Monica/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "96d53734fc1bd54d848cd30f98069b90333b1bb3",
+ "name": "Monica",
+ "website": "https://www.monicahq.com/",
+ "license": "GNU Affero General Public License v3.0 only",
+ "description": "Monica is an open-source web application to organize the interactions with your loved ones. We call it a PRM, or Personal Relationship Management. Think of it as a CRM for your friends or family.",
+ "enhanced": true,
+ "tile_background": "light",
+ "icon": "monica.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Monica/config.blade.php b/heimdall/config/www/SupportedApps/Monica/config.blade.php
new file mode 100755
index 0000000..f8cf4fa
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Monica/config.blade.php
@@ -0,0 +1,14 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', null, array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ {{ __('app.apps.apikey') }}
+ {!! Form::text('config[apikey]', null, array('placeholder' => __('app.apps.apikey'), 'data-config' => 'apikey', 'class' => 'form-control config-item')) !!}
+
+
+ Test
+
+
diff --git a/heimdall/config/www/SupportedApps/Monica/livestats.blade.php b/heimdall/config/www/SupportedApps/Monica/livestats.blade.php
new file mode 100755
index 0000000..9d00af7
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Monica/livestats.blade.php
@@ -0,0 +1,6 @@
+
+
+ Contacts
+ {!! $contacts !!}
+
+
diff --git a/heimdall/config/www/SupportedApps/Monica/monica.png b/heimdall/config/www/SupportedApps/Monica/monica.png
new file mode 100755
index 0000000..5d3d551
Binary files /dev/null and b/heimdall/config/www/SupportedApps/Monica/monica.png differ
diff --git a/heimdall/config/www/SupportedApps/Monit/Monit.php b/heimdall/config/www/SupportedApps/Monit/Monit.php
new file mode 100755
index 0000000..0ba84cb
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Monit/Monit.php
@@ -0,0 +1,35 @@
+jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
+ }
+
+ public function test()
+ {
+ $test = parent::appTest($this->url('status'));
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = 'inactive';
+ $res = parent::execute($this->url('status'));
+ $details = json_decode($res->getBody());
+
+ $data = [];
+ return parent::getLiveStats($status, $data);
+
+ }
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url).$endpoint;
+ return $api_url;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/Monit/app.json b/heimdall/config/www/SupportedApps/Monit/app.json
new file mode 100755
index 0000000..05088f0
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Monit/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "3568f62a517667d3dae77d47746d8382dd3b9f3b",
+ "name": "Monit",
+ "website": "https://mmonit.com/monit/",
+ "license": "GNU Affero General Public License v3.0 or later",
+ "description": "Monit is a small Open Source utility for managing and monitoring Unix systems. Monit conducts automatic maintenance and repair and can execute meaningful causal actions in error situations.",
+ "enhanced": true,
+ "tile_background": "dark",
+ "icon": "monit.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Monit/config.blade.php b/heimdall/config/www/SupportedApps/Monit/config.blade.php
new file mode 100755
index 0000000..51278e3
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Monit/config.blade.php
@@ -0,0 +1,19 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', null, array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ {{ __('app.apps.username') }}
+ {!! Form::text('config[username]', null, array('placeholder' => __('app.apps.username'), 'data-config' => 'username', 'class' => 'form-control config-item')) !!}
+
+
+ {{ __('app.apps.password') }}
+ {!! Form::text('config[password]', null, array('placeholder' => __('app.apps.password'), 'data-config' => 'password', 'class' => 'form-control config-item')) !!}
+
+
+ Test
+
+
+
diff --git a/heimdall/config/www/SupportedApps/Monit/livestats.blade.php b/heimdall/config/www/SupportedApps/Monit/livestats.blade.php
new file mode 100755
index 0000000..4fa2c8b
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Monit/livestats.blade.php
@@ -0,0 +1,10 @@
+
+
+ Queue
+ {!! $queue_size !!}
+
+
+ Speed
+ {!! $current_speed !!}
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Monit/monit.png b/heimdall/config/www/SupportedApps/Monit/monit.png
new file mode 100755
index 0000000..3b04ae8
Binary files /dev/null and b/heimdall/config/www/SupportedApps/Monit/monit.png differ
diff --git a/heimdall/config/www/SupportedApps/MotionEye/MotionEye.php b/heimdall/config/www/SupportedApps/MotionEye/MotionEye.php
new file mode 100755
index 0000000..c2c9bb9
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/MotionEye/MotionEye.php
@@ -0,0 +1,5 @@
+
+
+
+image/svg+xml
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Mylar/Mylar.php b/heimdall/config/www/SupportedApps/Mylar/Mylar.php
new file mode 100755
index 0000000..8c59451
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Mylar/Mylar.php
@@ -0,0 +1,43 @@
+jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
+ }
+
+ public function test()
+ {
+ $test = parent::appTest($this->url('getVersion'));
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = 'inactive';
+ $data = [];
+
+ $missing = json_decode(parent::execute($this->url('getWanted'))->getBody());
+ $upcoming = json_decode(parent::execute($this->url('getUpcoming'))->getBody());
+
+ $data = [];
+
+ $data['missing'] = count($missing) ?? 0;
+ $data['upcoming'] = count($upcoming) ?? 0;
+
+ return parent::getLiveStats($status, $data);
+
+ }
+
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url).'api?apikey='.$this->config->apikey.'&cmd='.$endpoint;
+ return $api_url;
+ }
+
+}
diff --git a/heimdall/config/www/SupportedApps/Mylar/app.json b/heimdall/config/www/SupportedApps/Mylar/app.json
new file mode 100755
index 0000000..baef614
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Mylar/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "1c7c1eebcd96285956627a1d10006a6756d9c2b4",
+ "name": "Mylar",
+ "website": "https://github.com/evilhero/mylar",
+ "license": "GNU General Public License v3.0 only",
+ "description": "Mylar is an automated Comic Book (cbr/cbz) downloader program heavily-based on the Headphones template and logic (which is also based on Sick-Beard).",
+ "enhanced": true,
+ "tile_background": "dark",
+ "icon": "mylar.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Mylar/config.blade.php b/heimdall/config/www/SupportedApps/Mylar/config.blade.php
new file mode 100755
index 0000000..87755d5
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Mylar/config.blade.php
@@ -0,0 +1,15 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', (isset($item) ? $item->getconfig()->override_url : null), array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ {{ __('app.apps.apikey') }}
+ {!! Form::text('config[apikey]', (isset($item) ? $item->getconfig()->apikey : null), array('placeholder' => __('app.apps.apikey'), 'data-config' => 'apikey', 'class' => 'form-control config-item')) !!}
+
+
+ Test
+
+
+
diff --git a/heimdall/config/www/SupportedApps/Mylar/livestats.blade.php b/heimdall/config/www/SupportedApps/Mylar/livestats.blade.php
new file mode 100755
index 0000000..44c6bcc
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Mylar/livestats.blade.php
@@ -0,0 +1,10 @@
+
+
+ Missing
+ {!! $missing !!}
+
+
+ Upcoming
+ {!! $upcoming !!}
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Mylar/mylar.png b/heimdall/config/www/SupportedApps/Mylar/mylar.png
new file mode 100755
index 0000000..96ce51e
Binary files /dev/null and b/heimdall/config/www/SupportedApps/Mylar/mylar.png differ
diff --git a/heimdall/config/www/SupportedApps/NZBHydra/NZBHydra.php b/heimdall/config/www/SupportedApps/NZBHydra/NZBHydra.php
new file mode 100755
index 0000000..e8bc535
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/NZBHydra/NZBHydra.php
@@ -0,0 +1,11 @@
+url, '/');
+ $q = urlencode($query);
+ return redirect($url.'/?category=All&mode=search&query='.$q);
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/NZBHydra/app.json b/heimdall/config/www/SupportedApps/NZBHydra/app.json
new file mode 100755
index 0000000..2437396
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/NZBHydra/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "a5b4faf84287a35c98adc76f2117aa10d1ea6eb8",
+ "name": "NZBHydra",
+ "website": "https://github.com/theotherp/nzbhydra2",
+ "license": "Apache License 2.0",
+ "description": "NZBHydra is a meta search for NZB indexers. It provides easy access to a number of raw and newznab based indexers. You can search all your indexers from one place and use it as an indexer source for tools like Sonarr, Radarr or CouchPotato.",
+ "enhanced": false,
+ "tile_background": "light",
+ "icon": "nzbhydra.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/NZBHydra/nzbhydra.png b/heimdall/config/www/SupportedApps/NZBHydra/nzbhydra.png
new file mode 100755
index 0000000..1a3cd8e
Binary files /dev/null and b/heimdall/config/www/SupportedApps/NZBHydra/nzbhydra.png differ
diff --git a/heimdall/config/www/SupportedApps/Navidrome/Navidrome.php b/heimdall/config/www/SupportedApps/Navidrome/Navidrome.php
new file mode 100755
index 0000000..5de2ed4
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Navidrome/Navidrome.php
@@ -0,0 +1,58 @@
+jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
+ }
+
+ public function test()
+ {
+ $test = parent::appTest($this->url('rest/ping'), $this->getAttributes());
+ if ($test->code === 200) {
+ $result = json_decode($test->response);
+ if ($result->{'subsonic-response'}->status != 'ok') {
+ $test->status = $result->{'subsonic-response'}->error->message;
+ }
+ }
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = 'inactive';
+ $res = parent::execute($this->url('rest/getNowPlaying'), $this->getAttributes());
+ $result = json_decode($res->getBody(), true);
+
+ $data['now_playing'] = !$result['subsonic-response']['nowPlaying'] ? 0 : count($result['subsonic-response']['nowPlaying']);
+ return parent::getLiveStats($status, $data);
+ }
+
+ private function getAttributes()
+ {
+ $salt = 'omHQfVJ';
+ $authToken = md5($this->config->password . $salt);
+ return [
+ 'query' => [
+ 'u' => $this->config->username, // username
+ 't' => $authToken, // token
+ 's' => $salt, // salt
+ 'v' => '1.16.1', // subsonic API version
+ 'c' => 'heimdall', // client name
+ 'f' => 'json', // request data format
+ ]
+ ];
+ }
+
+ public function url($endpoint)
+ {
+ $apiUrl = parent::normaliseurl($this->config->url) . $endpoint;
+ return $apiUrl;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/Navidrome/app.json b/heimdall/config/www/SupportedApps/Navidrome/app.json
new file mode 100755
index 0000000..6e6f774
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Navidrome/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "31e028553b33bf830e42d88a888ee1093e3dd591",
+ "name": "Navidrome",
+ "website": "https://www.navidrome.org",
+ "license": "GNU General Public License v3.0 only",
+ "description": "Navidrome is a self-hosted, open source music server and streamer. It gives you freedom to listen to your music collection from any browser or mobile device.",
+ "enhanced": true,
+ "tile_background": "dark",
+ "icon": "navidrome.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Navidrome/config.blade.php b/heimdall/config/www/SupportedApps/Navidrome/config.blade.php
new file mode 100755
index 0000000..ab0a2c5
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Navidrome/config.blade.php
@@ -0,0 +1,19 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', (isset($item) ? $item->getconfig()->override_url : null), array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ {{ __('app.apps.username') }}
+ {!! Form::text('config[username]', (isset($item) ? $item->getconfig()->username : null), array('placeholder' => __('app.apps.username'), 'data-config' => 'username', 'class' => 'form-control config-item')) !!}
+
+
+ {{ __('app.apps.password') }}
+ {!! Form::input('password', 'config[password]', (isset($item) ? $item->getconfig()->password : null), array('placeholder' => __('app.apps.password'), 'data-config' => 'password', 'class' => 'form-control config-item')) !!}
+
+
+ Test
+
+
+
diff --git a/heimdall/config/www/SupportedApps/Navidrome/livestats.blade.php b/heimdall/config/www/SupportedApps/Navidrome/livestats.blade.php
new file mode 100755
index 0000000..a23810f
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Navidrome/livestats.blade.php
@@ -0,0 +1,6 @@
+
+
+ Now Playing
+ {!! $now_playing !!}
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Navidrome/navidrome.png b/heimdall/config/www/SupportedApps/Navidrome/navidrome.png
new file mode 100755
index 0000000..1b8b1a2
Binary files /dev/null and b/heimdall/config/www/SupportedApps/Navidrome/navidrome.png differ
diff --git a/heimdall/config/www/SupportedApps/Nessus/Nessus.php b/heimdall/config/www/SupportedApps/Nessus/Nessus.php
new file mode 100755
index 0000000..b303c04
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Nessus/Nessus.php
@@ -0,0 +1,76 @@
+ false,
+ 'timeout' => 15,
+ 'connect_timeout' => 15,
+ 'verify' => false,
+ ];
+
+ function __construct() {
+ }
+
+ private function acquireToken()
+ {
+ $username = $this->config->username;
+ $password = $this->config->password;
+ $attrs = [
+ 'body' => json_encode(array('username' => $username, 'password' => $password)),
+ 'headers' => ['content-type' => 'application/json']
+ ];
+ $res = parent::execute($this->url('session'), $attrs, $this->clientVars, 'POST');
+ switch ($res->getStatusCode()) {
+ case 200:
+ $details = json_decode($res->getBody());
+ return $details->token;
+ case 400:
+ throw new \Exception("Invalid username format");
+ case 401:
+ throw new \Exception("Invalid username/password");
+ }
+
+ throw new \Exception("Error connecting to Nessus");
+ }
+
+ public function test()
+ {
+ try {
+ $this->acquireToken();
+ } catch (\Throwable $e) {
+ echo $e->getMessage();
+ return;
+ }
+ echo 'Successfully communicated with the API';
+ }
+
+ public function livestats()
+ {
+ $token = $this->acquireToken();
+ $status = 'inactive';
+ $attrs = [
+ 'headers' => ['X-Cookie' => 'token='.$token]
+ ];
+ $res = parent::execute($this->url('scans'), $attrs, $this->clientVars);
+ $details = json_decode($res->getBody());
+ $data = [];
+ if ($details && !isset($details->error)) {
+ foreach ($details->scans as $scan) {
+ if ($scan->status == "running") {
+ $data['scanner'] = $scan->name;
+ $status = 'active';
+ break;
+ }
+ }
+ }
+ return parent::getLiveStats($status, $data);
+
+ }
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url).$endpoint;
+ return $api_url;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/Nessus/app.json b/heimdall/config/www/SupportedApps/Nessus/app.json
new file mode 100755
index 0000000..a6575d1
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Nessus/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "c47466c999c3113a3291ab09cab20b0df630d8e8",
+ "name": "Nessus",
+ "website": "https://www.tenable.com/products/nessus",
+ "license": "Commercial",
+ "description": "Nessus is trusted by more than 27,000 organizations worldwide as one of the most widely deployed security technologies on the planet - and the gold standard for vulnerability assessment.",
+ "enhanced": true,
+ "tile_background": "light",
+ "icon": "nessus.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Nessus/config.blade.php b/heimdall/config/www/SupportedApps/Nessus/config.blade.php
new file mode 100755
index 0000000..57fd5fb
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Nessus/config.blade.php
@@ -0,0 +1,19 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', (isset($item) && isset($item->getconfig()->override_url) ? $item->getconfig()->override_url : null), array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ {{ __('app.apps.username') }}
+ {!! Form::text('config[username]', (isset($item) && isset($item->getconfig()->username) ? $item->getconfig()->username : null), array('placeholder' => __('app.apps.username'), 'data-config' => 'username', 'class' => 'form-control config-item')) !!}
+
+
+ {{ __('app.apps.password') }}
+ {!! Form::text('config[password]', (isset($item) && isset($item->getconfig()->password) ? $item->getconfig()->password : null), array('placeholder' => __('app.apps.password'), 'data-config' => 'password', 'class' => 'form-control config-item')) !!}
+
+
+ Test
+
+
+
diff --git a/heimdall/config/www/SupportedApps/Nessus/livestats.blade.php b/heimdall/config/www/SupportedApps/Nessus/livestats.blade.php
new file mode 100755
index 0000000..8571ae5
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Nessus/livestats.blade.php
@@ -0,0 +1,6 @@
+
+
+ Active scan
+ {!! $scanner !!}
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Nessus/nessus.png b/heimdall/config/www/SupportedApps/Nessus/nessus.png
new file mode 100755
index 0000000..84cb81a
Binary files /dev/null and b/heimdall/config/www/SupportedApps/Nessus/nessus.png differ
diff --git a/heimdall/config/www/SupportedApps/NetBox/NetBox.php b/heimdall/config/www/SupportedApps/NetBox/NetBox.php
new file mode 100755
index 0000000..52e6133
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/NetBox/NetBox.php
@@ -0,0 +1,5 @@
+url(self::ENDPOINT));
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = 'inactive';
+ $res = parent::execute($this->url(self::ENDPOINT));
+ $res = parent::execute($this->url(self::ENDPOINT));
+ $details = json_decode($res->getBody());
+
+ $data = [
+ 'count_warning' => $details->alarms->warning,
+ 'count_critical' => $details->alarms->critical
+ ];
+
+ return parent::getLiveStats($status, $data);
+ }
+
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url).$endpoint;
+ return $api_url;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/Netdata/app.json b/heimdall/config/www/SupportedApps/Netdata/app.json
new file mode 100755
index 0000000..e5c6cc1
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Netdata/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "810d3926feac8c1bd3957fdac48b6c9475b932d0",
+ "name": "Netdata",
+ "website": "https://my-netdata.io/",
+ "license": "GNU General Public License v3.0 only",
+ "description": "Unparalleled insights, in real-time, of everything happening on your systems and applications, with stunning, interactive web dashboards and powerful performance and health alarms.",
+ "enhanced": true,
+ "tile_background": "dark",
+ "icon": "netdata.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Netdata/config.blade.php b/heimdall/config/www/SupportedApps/Netdata/config.blade.php
new file mode 100755
index 0000000..4505127
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Netdata/config.blade.php
@@ -0,0 +1,11 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', null, array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ Test
+
+
+
diff --git a/heimdall/config/www/SupportedApps/Netdata/livestats.blade.php b/heimdall/config/www/SupportedApps/Netdata/livestats.blade.php
new file mode 100755
index 0000000..b2effee
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Netdata/livestats.blade.php
@@ -0,0 +1,10 @@
+
+
+ Warning
+ {!! $count_warning !!}
+
+
+ Critical
+ {!! $count_critical !!}
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Netdata/netdata.png b/heimdall/config/www/SupportedApps/Netdata/netdata.png
new file mode 100755
index 0000000..297cee5
Binary files /dev/null and b/heimdall/config/www/SupportedApps/Netdata/netdata.png differ
diff --git a/heimdall/config/www/SupportedApps/Nextcloud/Nextcloud.php b/heimdall/config/www/SupportedApps/Nextcloud/Nextcloud.php
new file mode 100755
index 0000000..a71c42a
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Nextcloud/Nextcloud.php
@@ -0,0 +1,106 @@
+jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
+ }
+
+ public function getHeaders()
+ {
+ $username = $this->config->username;
+ $password = $this->config->password;
+
+ $attrs["headers"] = [
+ "Authorization" =>
+ "Basic " . base64_encode($username . ":" . $password),
+ "OCS-APIRequest" => "true",
+ ];
+ return $attrs;
+ }
+
+ public function test()
+ {
+ $username = $this->config->username;
+
+ $test = parent::appTest(
+ $this->url("/ocs/v1.php/cloud/users/" . $username . "?format=json"),
+ $this->getHeaders()
+ );
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = "inactive";
+
+ $username = $this->config->username;
+ $res = parent::execute(
+ $this->url("/ocs/v1.php/cloud/users/" . $username . "?format=json"),
+ $this->getHeaders()
+ );
+ $details = json_decode($res->getBody());
+
+ $data = ["visiblestats" => []];
+
+ if ($details) {
+ foreach ($this->config->availablestats as $stat) {
+ if (!isset(self::getAvailableStats()[$stat])) {
+ continue;
+ }
+
+ $newstat = new \stdClass();
+ $newstat->title = self::getAvailableStats()[$stat];
+ $newstat->value = self::formatNumberUsingStat(
+ $stat,
+ $details->ocs->data->quota->{$stat}
+ );
+
+ $data["visiblestats"][] = $newstat;
+ }
+ }
+
+ return parent::getLiveStats($status, $data);
+ }
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url);
+ return $api_url . $endpoint;
+ }
+
+ public static function getAvailableStats()
+ {
+ return [
+ "relative" => "Usage",
+ "used" => "Used Space",
+ "free" => "Free Space",
+ "total" => "Total Space",
+ ];
+ }
+
+ private static function formatNumberUsingStat($stat, $number)
+ {
+ if (!isset($number)) {
+ return "N/A";
+ }
+
+ switch ($stat) {
+ case "free":
+ case "used":
+ case "total":
+ return format_bytes($number, false, "", " ");
+ case "relative":
+ return number_format($number, 1) . "% ";
+ default:
+ return number_format($number);
+ }
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/Nextcloud/app.json b/heimdall/config/www/SupportedApps/Nextcloud/app.json
new file mode 100755
index 0000000..f5ec7b3
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Nextcloud/app.json
@@ -0,0 +1,32 @@
+{
+ "appid": "f2baa52d02ca888455ce47823f47bf372d5eecb3",
+ "name": "Nextcloud",
+ "website": "https://nextcloud.com",
+ "license": "GNU Affero General Public License v3.0 only",
+ "description": "Nextcloud is an open source, self-hosted file share and communication platform. Access and sync your files, contacts, calendars and communicate and collaborate across your devices.",
+ "enhanced": true,
+ "tile_background": "light",
+ "icon": "nextcloud.svg",
+ "config": {
+ "type": "basic_auth",
+ "additional_headers": {
+ "OCS-APIRequest": "true"
+ },
+ "stat1": {
+ "name": "Total",
+ "url": ":url:ocs/v1.php/cloud/users/:username:?format=json",
+ "key": "ocs.data.quota.total",
+ "filter": "size",
+ "updateOnChange": "No",
+ "suffix": ""
+ },
+ "stat2": {
+ "name": "Used",
+ "url": ":url:ocs/v1.php/cloud/users/:username:?format=json",
+ "key": "ocs.data.quota.used",
+ "filter": "size",
+ "updateOnChange": "No",
+ "suffix": ""
+ }
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/Nextcloud/config.blade.php b/heimdall/config/www/SupportedApps/Nextcloud/config.blade.php
new file mode 100755
index 0000000..2c16b6f
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Nextcloud/config.blade.php
@@ -0,0 +1,23 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', isset($item) ? $item->getconfig()->override_url : null, ['placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control']) !!}
+
+
+ {{ __('app.apps.username') }}
+ {!! Form::text('config[username]', isset($item) ? $item->getconfig()->username : null, ['placeholder' => __('app.apps.username'), 'data-config' => 'username', 'class' => 'form-control config-item']) !!}
+
+
+ {{ __('app.apps.password') }}
+ {!! Form::input('password', 'config[password]', '', ['placeholder' => __('app.apps.password'), 'data-config' => 'password', 'class' => 'form-control config-item']) !!}
+ Security » App Password
+
+
+ Stats to show
+ {!! Form::select('config[availablestats][]', App\SupportedApps\Nextcloud\Nextcloud::getAvailableStats(), isset($item) ? $item->getConfig()->availablestats ?? null : null, ['multiple' => 'multiple']) !!}
+
+
+ Test
+
+
diff --git a/heimdall/config/www/SupportedApps/Nextcloud/livestats.blade.php b/heimdall/config/www/SupportedApps/Nextcloud/livestats.blade.php
new file mode 100755
index 0000000..cb9431a
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Nextcloud/livestats.blade.php
@@ -0,0 +1,8 @@
+
+ @foreach ($visiblestats as $stat)
+
+ {!! $stat->title !!}
+ {!! $stat->value !!}
+
+ @endforeach
+
diff --git a/heimdall/config/www/SupportedApps/Nextcloud/nextcloud.png b/heimdall/config/www/SupportedApps/Nextcloud/nextcloud.png
new file mode 100755
index 0000000..4c84a3c
Binary files /dev/null and b/heimdall/config/www/SupportedApps/Nextcloud/nextcloud.png differ
diff --git a/heimdall/config/www/SupportedApps/NginxProxyManager/NginxProxyManager.php b/heimdall/config/www/SupportedApps/NginxProxyManager/NginxProxyManager.php
new file mode 100755
index 0000000..4cfe60e
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/NginxProxyManager/NginxProxyManager.php
@@ -0,0 +1,5 @@
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
diff --git a/heimdall/config/www/SupportedApps/NodeRed.zip b/heimdall/config/www/SupportedApps/NodeRed.zip
new file mode 100755
index 0000000..923fe2a
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/NodeRed.zip
@@ -0,0 +1,88 @@
+
+
+
+
+
+ Page not found · GitHub Pages
+
+
+
+
+
+
+
404
+
File not found
+
+
+ The site configured at this address does not
+ contain the requested file.
+
+
+
+ If this is your site, make sure that the filename case matches the URL.
+ For root URLs (like http://example.com/) you must provide an
+ index.html file.
+
+
+
+ Read the full documentation
+ for more information about using GitHub Pages .
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/heimdall/config/www/SupportedApps/NodeRed/NodeRed.php b/heimdall/config/www/SupportedApps/NodeRed/NodeRed.php
new file mode 100755
index 0000000..9ca8159
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/NodeRed/NodeRed.php
@@ -0,0 +1,35 @@
+jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
+ }
+
+ public function test()
+ {
+ $test = parent::appTest($this->url('status'));
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = 'inactive';
+ $res = parent::execute($this->url('status'));
+ $details = json_decode($res->getBody());
+
+ $data = [];
+ return parent::getLiveStats($status, $data);
+
+ }
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url).$endpoint;
+ return $api_url;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/NodeRed/app.json b/heimdall/config/www/SupportedApps/NodeRed/app.json
new file mode 100755
index 0000000..2dcec94
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/NodeRed/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "1608962f5295ccc488f3103ea8df2c6d45c62c65",
+ "name": "Node-Red",
+ "website": "https://nodered.org/",
+ "license": "Apache License 2.0",
+ "description": "Node-RED is a flow-based development tool for visual programming developed originally by IBM for wiring together hardware devices, APIs and online services as part of the Internet of Things. \r\n\r\nNode-RED provides a browser-based flow editor, which can be used to create JavaScript functions. Elements of applications can be saved or shared for re-use. The runtime is built on Node.js. The flows created in Node-RED are stored using JSON. Since version 0.14 MQTT nodes can make properly configured TLS connections",
+ "enhanced": true,
+ "tile_background": "dark",
+ "icon": "nodered.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/NodeRed/config.blade.php b/heimdall/config/www/SupportedApps/NodeRed/config.blade.php
new file mode 100755
index 0000000..51278e3
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/NodeRed/config.blade.php
@@ -0,0 +1,19 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', null, array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ {{ __('app.apps.username') }}
+ {!! Form::text('config[username]', null, array('placeholder' => __('app.apps.username'), 'data-config' => 'username', 'class' => 'form-control config-item')) !!}
+
+
+ {{ __('app.apps.password') }}
+ {!! Form::text('config[password]', null, array('placeholder' => __('app.apps.password'), 'data-config' => 'password', 'class' => 'form-control config-item')) !!}
+
+
+ Test
+
+
+
diff --git a/heimdall/config/www/SupportedApps/NodeRed/livestats.blade.php b/heimdall/config/www/SupportedApps/NodeRed/livestats.blade.php
new file mode 100755
index 0000000..4fa2c8b
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/NodeRed/livestats.blade.php
@@ -0,0 +1,10 @@
+
+
+ Queue
+ {!! $queue_size !!}
+
+
+ Speed
+ {!! $current_speed !!}
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/NodeRed/nodered.png b/heimdall/config/www/SupportedApps/NodeRed/nodered.png
new file mode 100755
index 0000000..4dad86e
Binary files /dev/null and b/heimdall/config/www/SupportedApps/NodeRed/nodered.png differ
diff --git a/heimdall/config/www/SupportedApps/NowShowing/NowShowing.php b/heimdall/config/www/SupportedApps/NowShowing/NowShowing.php
new file mode 100755
index 0000000..ad9392e
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/NowShowing/NowShowing.php
@@ -0,0 +1,5 @@
+url('status'));
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = 'inactive';
+ $res = parent::execute($this->url('status'));
+ $details = json_decode($res->getBody());
+
+ $data = [];
+
+ if($details) {
+ $size = $details->result->RemainingSizeMB;
+ $rate = $details->result->DownloadRate;
+ $data['queue_size'] = format_bytes($size*1000*1000, false, ' ', ' ');
+ $data['current_speed'] = format_bytes($rate, false, ' ');
+ $status = ($size > 0 || $rate > 0) ? 'active' : 'inactive';
+ }
+
+ return parent::getLiveStats($status, $data);
+
+ }
+
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url);
+ $username = urlencode($this->config->username);
+ $password = urlencode($this->config->password);
+ $rebuild_url = str_replace('http://', 'http://'.$username.':'.$password.'@', $api_url);
+ $rebuild_url = str_replace('https://', 'https://'.$username.':'.$password.'@', $rebuild_url);
+ $rebuild_url = rtrim($rebuild_url, '/');
+
+ $api_url = $rebuild_url.'/jsonrpc/'.$endpoint;
+ return $api_url;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/Nzbget/app.json b/heimdall/config/www/SupportedApps/Nzbget/app.json
new file mode 100755
index 0000000..3976bab
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Nzbget/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "31a7b1d936c4e8503bb446e5ff8ada669d1846bd",
+ "name": "Nzbget",
+ "website": "https://nzbget.net/",
+ "license": "GNU General Public License v2.0 only",
+ "description": "NZBGet is a binary downloader, which downloads files from Usenet based on information given in nzb-files. NZBGet is written in C++ and is known for its extraordinary performance and efficiency.",
+ "enhanced": true,
+ "tile_background": "dark",
+ "icon": "nzbget.png"
+}
diff --git a/heimdall/config/www/SupportedApps/Nzbget/config.blade.php b/heimdall/config/www/SupportedApps/Nzbget/config.blade.php
new file mode 100755
index 0000000..96538bb
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Nzbget/config.blade.php
@@ -0,0 +1,18 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', (isset($item) ? $item->getconfig()->override_url : null), array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ {{ __('app.apps.username') }}
+ {!! Form::text('config[username]', (isset($item) ? $item->getconfig()->username : null), array('placeholder' => __('app.apps.username'), 'data-config' => 'username', 'class' => 'form-control config-item')) !!}
+
+
+ {{ __('app.apps.password') }}
+ {!! Form::input('password', 'config[password]', (isset($item) ? $item->getconfig()->password : null), array('placeholder' => __('app.apps.password'), 'data-config' => 'password', 'class' => 'form-control config-item')) !!}
+
+
+ Test
+
+
diff --git a/heimdall/config/www/SupportedApps/Nzbget/livestats.blade.php b/heimdall/config/www/SupportedApps/Nzbget/livestats.blade.php
new file mode 100755
index 0000000..86b712a
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Nzbget/livestats.blade.php
@@ -0,0 +1,5 @@
+
+ Queue {!! $queue_size !!}
+ Speed {!! $current_speed !!}/s
+
+
diff --git a/heimdall/config/www/SupportedApps/Nzbget/nzbget.png b/heimdall/config/www/SupportedApps/Nzbget/nzbget.png
new file mode 100755
index 0000000..a44c575
Binary files /dev/null and b/heimdall/config/www/SupportedApps/Nzbget/nzbget.png differ
diff --git a/heimdall/config/www/SupportedApps/OPNsense/OPNsense.php b/heimdall/config/www/SupportedApps/OPNsense/OPNsense.php
new file mode 100755
index 0000000..513a41e
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/OPNsense/OPNsense.php
@@ -0,0 +1,5 @@
+ $this->config->apikey];
+ $test = parent::appTest($this->url('api/version'), $attrs);
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = 'inactive';
+ $attrs['headers'] = ['X-Api-Key' => $this->config->apikey];
+ $res = parent::execute($this->url('api/job'), $attrs);
+ if(!$res) return parent::getLiveStats($status, ['error' => "Connection"]);
+ $details = json_decode($res->getBody());
+
+ $data = [];
+
+ $progress = $details->progress->completion;
+
+ $data['progress'] = @round($progress) ?? 0;
+ $seconds = $details->progress->printTimeLeft;
+ if($seconds === null) {
+ $data['estimated'] = 'N/A';
+ } elseif($seconds > 0) {
+ $data['estimated'] = Carbon::now()->addSeconds($seconds)->diffForHumans();
+ } else {
+ $data['estimated'] = 'N/A';
+ }
+
+
+ $status = ($data['progress'] < 100 && $progress !== null) ? 'active' : 'inactive';
+
+ return parent::getLiveStats($status, $data);
+
+ }
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url).$endpoint;
+ return $api_url;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/Octoprint/app.json b/heimdall/config/www/SupportedApps/Octoprint/app.json
new file mode 100755
index 0000000..5e32625
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Octoprint/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "99be0df8034cbcd7b5dfb3290839f7db21c1acbb",
+ "name": "Octoprint",
+ "website": "https://octoprint.org/",
+ "license": "GNU Affero General Public License v3.0",
+ "description": "OctoPrint is the snappy web interface for your 3D printer that allows you to control and monitor all aspects of your printer and print jobs, right from your browser.",
+ "enhanced": true,
+ "tile_background": "dark",
+ "icon": "octoprint.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Octoprint/config.blade.php b/heimdall/config/www/SupportedApps/Octoprint/config.blade.php
new file mode 100755
index 0000000..e924583
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Octoprint/config.blade.php
@@ -0,0 +1,15 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', null, array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ {{ __('app.apps.apikey') }}
+ {!! Form::text('config[apikey]', (isset($item) ? $item->getconfig()->apikey : null), array('placeholder' => __('app.apps.apikey'), 'data-config' => 'apikey', 'class' => 'form-control config-item')) !!}
+
+
+ Test
+
+
+
diff --git a/heimdall/config/www/SupportedApps/Octoprint/livestats.blade.php b/heimdall/config/www/SupportedApps/Octoprint/livestats.blade.php
new file mode 100755
index 0000000..fdd5a0a
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Octoprint/livestats.blade.php
@@ -0,0 +1,22 @@
+
+ @if(isset($error))
+
+ ERROR
+ {!! $error !!}
+
+ @else
+ @if(isset($progress))
+
+ Progress
+ {!! $progress !!}%
+
+ @endif
+
+ @if(isset($estimated))
+
+ Finish
+ {!! $estimated !!}
+
+ @endif
+ @endif
+
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Octoprint/octoprint.png b/heimdall/config/www/SupportedApps/Octoprint/octoprint.png
new file mode 100755
index 0000000..41f1093
Binary files /dev/null and b/heimdall/config/www/SupportedApps/Octoprint/octoprint.png differ
diff --git a/heimdall/config/www/SupportedApps/Ombi/Ombi.php b/heimdall/config/www/SupportedApps/Ombi/Ombi.php
new file mode 100755
index 0000000..a089d51
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Ombi/Ombi.php
@@ -0,0 +1,35 @@
+jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
+ }
+
+ public function test()
+ {
+ $test = parent::appTest($this->url('api/v1/status'));
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = 'inactive';
+ $this->attrs['headers'] = ['ApiKey' => $this->config->apikey];
+ $res = parent::execute($this->url('api/v1/request/count'), $this->attrs);
+ $details = json_decode($res->getBody(), True);
+
+ return parent::getLiveStats($status, $details);
+
+ }
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url).$endpoint;
+ return $api_url;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/Ombi/app.json b/heimdall/config/www/SupportedApps/Ombi/app.json
new file mode 100755
index 0000000..6273aa1
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Ombi/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "57b25ceb94bd4c9ba9038ce17656f5ede9007e4c",
+ "name": "Ombi",
+ "website": "https://ombi.io/",
+ "license": "GNU General Public License v2.0 only",
+ "description": "Ombi is a self-hosted web application that automatically gives your shared Plex or Emby users the ability to request content by themselves! Ombi can be linked to multiple TV Show and Movie DVR tools to create a seamless end-to-end experience for your users.",
+ "enhanced": true,
+ "tile_background": "dark",
+ "icon": "ombi.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Ombi/config.blade.php b/heimdall/config/www/SupportedApps/Ombi/config.blade.php
new file mode 100755
index 0000000..8192dc9
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Ombi/config.blade.php
@@ -0,0 +1,14 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', (isset($item) ? $item->getconfig()->override_url : null), array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ {{ __('app.apps.apikey') }}
+ {!! Form::text('config[apikey]', (isset($item) ? $item->getconfig()->apikey : null), array('placeholder' => __('app.apps.apikey'), 'data-config' => 'apikey', 'class' => 'form-control config-item')) !!}
+
+
+ Test
+
+
diff --git a/heimdall/config/www/SupportedApps/Ombi/livestats.blade.php b/heimdall/config/www/SupportedApps/Ombi/livestats.blade.php
new file mode 100755
index 0000000..9116334
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Ombi/livestats.blade.php
@@ -0,0 +1,4 @@
+
+ Pending {!! $pending !!}
+ Approved {!! $approved !!}
+
diff --git a/heimdall/config/www/SupportedApps/Ombi/ombi.png b/heimdall/config/www/SupportedApps/Ombi/ombi.png
new file mode 100755
index 0000000..f0d733c
Binary files /dev/null and b/heimdall/config/www/SupportedApps/Ombi/ombi.png differ
diff --git a/heimdall/config/www/SupportedApps/OmniDB/OmniDB.php b/heimdall/config/www/SupportedApps/OmniDB/OmniDB.php
new file mode 100755
index 0000000..0932773
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/OmniDB/OmniDB.php
@@ -0,0 +1,5 @@
+
+
+
+
+Created by potrace 1.11, written by Peter Selinger 2001-2013
+
+
+
+
+
+
+
diff --git a/heimdall/config/www/SupportedApps/Overseerr/Overseerr.php b/heimdall/config/www/SupportedApps/Overseerr/Overseerr.php
new file mode 100755
index 0000000..a7b4ad3
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Overseerr/Overseerr.php
@@ -0,0 +1,39 @@
+jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
+ }
+
+ public function test()
+ {
+ $this->attrs['headers'] = ['accept' => 'application/json','X-Api-Key' => $this->config->apikey];
+ $test = parent::appTest($this->url('api/v1/auth/me'), $this->attrs);
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = 'inactive';
+ $this->attrs['headers'] = ['accept' => 'application/json','X-Api-Key' => $this->config->apikey];
+ $res = parent::execute($this->url('api/v1/request/count'), $this->attrs);
+ $details = json_decode($res->getBody(), True);
+
+ return parent::getLiveStats($status, $details);
+
+ }
+
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url).$endpoint;
+ return $api_url;
+ }
+
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Overseerr/app.json b/heimdall/config/www/SupportedApps/Overseerr/app.json
new file mode 100755
index 0000000..fe6befa
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Overseerr/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "989fb18945a331b430fc284edfe6451aa760f8e6",
+ "name": "Overseerr",
+ "website": "https://github.com/sct/overseerr",
+ "license": "MIT License",
+ "description": "Overseerr is a free and open source software application for managing requests for your media library. It integrates with your existing services such as Sonarr, Radarr and Plex!",
+ "enhanced": true,
+ "tile_background": "dark",
+ "icon": "overseerr.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Overseerr/config.blade.php b/heimdall/config/www/SupportedApps/Overseerr/config.blade.php
new file mode 100755
index 0000000..8192dc9
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Overseerr/config.blade.php
@@ -0,0 +1,14 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', (isset($item) ? $item->getconfig()->override_url : null), array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ {{ __('app.apps.apikey') }}
+ {!! Form::text('config[apikey]', (isset($item) ? $item->getconfig()->apikey : null), array('placeholder' => __('app.apps.apikey'), 'data-config' => 'apikey', 'class' => 'form-control config-item')) !!}
+
+
+ Test
+
+
diff --git a/heimdall/config/www/SupportedApps/Overseerr/livestats.blade.php b/heimdall/config/www/SupportedApps/Overseerr/livestats.blade.php
new file mode 100755
index 0000000..49b0fc6
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Overseerr/livestats.blade.php
@@ -0,0 +1,10 @@
+
+
+ Pending
+ {!! $pending !!}
+
+
+ Processing
+ {!! $processing !!}
+
+
diff --git a/heimdall/config/www/SupportedApps/Overseerr/overseerr.png b/heimdall/config/www/SupportedApps/Overseerr/overseerr.png
new file mode 100755
index 0000000..e0f5ed6
Binary files /dev/null and b/heimdall/config/www/SupportedApps/Overseerr/overseerr.png differ
diff --git a/heimdall/config/www/SupportedApps/OwnPhotos/OwnPhotos.php b/heimdall/config/www/SupportedApps/OwnPhotos/OwnPhotos.php
new file mode 100755
index 0000000..7331517
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/OwnPhotos/OwnPhotos.php
@@ -0,0 +1,5 @@
+jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
+ }
+
+ public function test()
+ {
+ $username = $this->config->username;
+ $passhash = $this->config->passhash;
+ $test = parent::appTest($this->url('api/getstatus.htm?id=0&username='.$username.'&passhash='.$passhash));
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $username = $this->config->username;
+ $passhash = $this->config->passhash;
+ $status = 'inactive';
+ $res = parent::execute($this->url('api/getstatus.htm?id=0&username='.$username.'&passhash='.$passhash));
+ $details = json_decode($res->getBody());
+
+ $data = [];
+
+ if($details) {
+ if (empty($details->Alarms)) {$data['alarms'] = 0;} else {$data['alarms'] = number_format($details->Alarms);}
+ if (empty($details->AckAlarms)) {$data['alarmsack'] = 0;} else {$data['alarmsack'] = number_format($details->AckAlarms);}
+ if (empty($details->WarnSens)) {$data['warnings'] = 0;} else {$data['warnings'] = number_format($details->WarnSens);}
+ if (empty($details->UnusualSens)) {$data['unusuals'] = 0;} else {$data['unusuals'] = number_format($details->UnusualSens);}
+ if (empty($details->UpSens)) {$data['ups'] = 0;} else {$data['ups'] = number_format($details->UpSens);}
+ }
+
+ return parent::getLiveStats($status, $data);
+
+ }
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url).$endpoint;
+ return $api_url;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/PRTG/app.json b/heimdall/config/www/SupportedApps/PRTG/app.json
new file mode 100755
index 0000000..aff0975
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/PRTG/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "0ea6cd5e52e84ef9afd444f5693d09d216b10ba2",
+ "name": "PRTG",
+ "website": "https://www.paessler.com/prtg",
+ "license": "100 sensors free",
+ "description": "Monitor all systems, devices, traffic and applications of your IT infrastructure.",
+ "enhanced": true,
+ "tile_background": "light",
+ "icon": "prtg.png"
+}
diff --git a/heimdall/config/www/SupportedApps/PRTG/config.blade.php b/heimdall/config/www/SupportedApps/PRTG/config.blade.php
new file mode 100755
index 0000000..4f2facf
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/PRTG/config.blade.php
@@ -0,0 +1,18 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', (isset($item) ? $item->getconfig()->override_url : null), array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ {{ __('app.apps.username') }}
+ {!! Form::text('config[username]', (isset($item) ? $item->getconfig()->username : null), array('placeholder' => __('app.apps.username'), 'data-config' => 'username', 'class' => 'form-control config-item')) !!}
+
+
+ Passhash (help?)
+ {!! Form::text('config[passhash]', (isset($item) ? $item->getconfig()->passhash : null), array('placeholder' => __('Passhash'), 'data-config' => 'passhash', 'class' => 'form-control config-item')) !!}
+
+
+ Test
+
+
diff --git a/heimdall/config/www/SupportedApps/PRTG/livestats.blade.php b/heimdall/config/www/SupportedApps/PRTG/livestats.blade.php
new file mode 100755
index 0000000..9c7bb33
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/PRTG/livestats.blade.php
@@ -0,0 +1,22 @@
+
+
+
+ {!! $alarms !!}
+
+
+
+ {!! $alarmsack !!}
+
+
+
+ {!! $warnings !!}
+
+
+
+ {!! $unusuals !!}
+
+
+
+ {!! $ups !!}
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/PRTG/prtg.png b/heimdall/config/www/SupportedApps/PRTG/prtg.png
new file mode 100755
index 0000000..3dc1690
Binary files /dev/null and b/heimdall/config/www/SupportedApps/PRTG/prtg.png differ
diff --git a/heimdall/config/www/SupportedApps/PaloAltoNetworks/PaloAltoNetworks.php b/heimdall/config/www/SupportedApps/PaloAltoNetworks/PaloAltoNetworks.php
new file mode 100755
index 0000000..b437ac6
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/PaloAltoNetworks/PaloAltoNetworks.php
@@ -0,0 +1,5 @@
+getConfigValue("apikey", null);
+
+ $attrs["headers"] = [
+ "Accept" => "application/json",
+ "Authorization" => "Token " . $apikey,
+ ];
+
+ return $attrs;
+ }
+
+
+ public function getConfigValue($key, $default = null)
+ {
+ return isset($this->config) && isset($this->config->$key)
+ ? $this->config->$key
+ : $default;
+ }
+
+ public function test()
+ {
+ $attrs = $this->getRequestAttrs();
+ $test = parent::appTest($this->url("documents"), $attrs);
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = "inactive";
+ $data = [];
+ $attrs = $this->getRequestAttrs();
+
+ $documents = json_decode(
+ parent::execute($this->url("statistics"), $attrs)->getBody()
+ );
+
+ $data = [
+ "documentCount" => $documents->documents_total ?? 0,
+ "documentsInbox" => $documents->documents_inbox ?? 0
+ ];
+
+ return parent::getLiveStats($status, $data);
+ }
+
+ public function url($endpoint)
+ {
+ $api_url =
+ parent::normaliseurl($this->config->url) .
+ "api/" .
+ $endpoint .
+ "/";
+ return $api_url;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/PaperlessNgx/app.json b/heimdall/config/www/SupportedApps/PaperlessNgx/app.json
new file mode 100755
index 0000000..229cd47
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/PaperlessNgx/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "23e9c842d2423902706ae92996554f6fbd92c502",
+ "name": "PaperlessNgx",
+ "website": "https://github.com/paperless-ngx/paperless-ngx",
+ "license": "GNU General Public License v3.0 only",
+ "description": "Paperless-ngx is a document management system that transforms your physical documents into a searchable online archive so you can keep, well, less paper.",
+ "enhanced": true,
+ "tile_background": "dark",
+ "icon": "paperlessngx.svg"
+}
diff --git a/heimdall/config/www/SupportedApps/PaperlessNgx/config.blade.php b/heimdall/config/www/SupportedApps/PaperlessNgx/config.blade.php
new file mode 100755
index 0000000..4a8082c
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/PaperlessNgx/config.blade.php
@@ -0,0 +1,14 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', isset($item) ? $item->getconfig()->override_url : null, ['placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control']) !!}
+
+
+ {{ __('app.apps.apikey') }}
+ {!! Form::text('config[apikey]', isset($item) ? $item->getconfig()->apikey : null, ['placeholder' => __('app.apps.apikey'), 'data-config' => 'apikey', 'class' => 'form-control config-item']) !!}
+
+
+ Test
+
+
diff --git a/heimdall/config/www/SupportedApps/PaperlessNgx/livestats.blade.php b/heimdall/config/www/SupportedApps/PaperlessNgx/livestats.blade.php
new file mode 100755
index 0000000..416e502
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/PaperlessNgx/livestats.blade.php
@@ -0,0 +1,10 @@
+
+
+ Documents
+ {!! $documentCount !!}
+
+
+ Inbox
+ {!! $documentsInbox !!}
+
+
diff --git a/heimdall/config/www/SupportedApps/PartKeepr/PartKeepr.php b/heimdall/config/www/SupportedApps/PartKeepr/PartKeepr.php
new file mode 100755
index 0000000..a0466d1
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/PartKeepr/PartKeepr.php
@@ -0,0 +1,5 @@
+jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
+ }
+
+ public function test()
+ {
+ $test = parent::appTest($this->url('api/v1/config'));
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = 'inactive';
+ $res = parent::execute($this->url('api/v1/config'));
+ $details = json_decode($res->getBody(), True);
+
+ $data = [];
+
+ if($details) {
+ $data['photos'] = number_format($details['count']['photos']) ?? 0;
+ $data['videos'] = number_format($details['count']['videos']) ?? 0;
+ }
+
+ return parent::getLiveStats($status, $data);
+ }
+
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url).$endpoint;
+ return $api_url;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/PhotoPrism/app.json b/heimdall/config/www/SupportedApps/PhotoPrism/app.json
new file mode 100755
index 0000000..4a97405
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/PhotoPrism/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "f60f5b25d59c397989e3cd374f81cdd7710a4fca",
+ "name": "PhotoPrism",
+ "website": "https://photoprism.org/",
+ "license": "GNU General Public License v3.0 only",
+ "description": "PhotoPrism is a server-based application for browsing, organizing and sharing your personal photo collection. It makes use of the latest technologies to automatically tag and find pictures without getting in your way. Say goodbye to solutions that force you to upload your visual memories to the cloud.",
+ "enhanced": true,
+ "tile_background": "light",
+ "icon": "photoprism.png"
+}
diff --git a/heimdall/config/www/SupportedApps/PhotoPrism/config.blade.php b/heimdall/config/www/SupportedApps/PhotoPrism/config.blade.php
new file mode 100755
index 0000000..53f26e1
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/PhotoPrism/config.blade.php
@@ -0,0 +1,10 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', null, array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ Test
+
+
diff --git a/heimdall/config/www/SupportedApps/PhotoPrism/livestats.blade.php b/heimdall/config/www/SupportedApps/PhotoPrism/livestats.blade.php
new file mode 100755
index 0000000..72f1b71
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/PhotoPrism/livestats.blade.php
@@ -0,0 +1,10 @@
+
+
+ Photos
+ {!! $photos !!}
+
+
+ Videos
+ {!! $videos !!}
+
+
diff --git a/heimdall/config/www/SupportedApps/PhotoPrism/photoprism.png b/heimdall/config/www/SupportedApps/PhotoPrism/photoprism.png
new file mode 100755
index 0000000..b832557
Binary files /dev/null and b/heimdall/config/www/SupportedApps/PhotoPrism/photoprism.png differ
diff --git a/heimdall/config/www/SupportedApps/Photonix/Photonix.php b/heimdall/config/www/SupportedApps/Photonix/Photonix.php
new file mode 100755
index 0000000..f7722cb
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Photonix/Photonix.php
@@ -0,0 +1,5 @@
+jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
+ }
+
+ public function test()
+ {
+ $test = parent::appTest($this->url('data/aircraft.json'));
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = 'inactive';
+ $res = parent::execute($this->url('data/aircraft.json'));
+ $details = json_decode($res->getBody(), true);
+
+ $data = [];
+
+ if($details) {
+ $filtered_total = array_filter($details['aircraft'], function($element) {
+ return $element['seen'] <= 58;
+ });
+ $data['total'] = count($filtered_total);
+ $filtered_positions = array_filter($filtered_total, function($element) {
+ return array_key_exists('seen_pos', $element) && $element['seen_pos'] < 60;
+ });
+ $data['positions'] = count($filtered_positions);
+ }
+
+ return parent::getLiveStats($status, $data);
+ }
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url).$endpoint;
+ return $api_url;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/PiAware/app.json b/heimdall/config/www/SupportedApps/PiAware/app.json
new file mode 100755
index 0000000..65a7081
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/PiAware/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "b897f0f558bc83256a49d5c7e8f1658d87cfe820",
+ "name": "PiAware",
+ "website": "https://github.com/flightaware/piaware",
+ "license": "BSD 3-Clause \"New\" or \"Revised\" License",
+ "description": "Client-side package and programs for forwarding ADS-B data to FlightAware",
+ "enhanced": true,
+ "tile_background": "light",
+ "icon": "piaware.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/PiAware/config.blade.php b/heimdall/config/www/SupportedApps/PiAware/config.blade.php
new file mode 100755
index 0000000..53f26e1
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/PiAware/config.blade.php
@@ -0,0 +1,10 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', null, array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ Test
+
+
diff --git a/heimdall/config/www/SupportedApps/PiAware/livestats.blade.php b/heimdall/config/www/SupportedApps/PiAware/livestats.blade.php
new file mode 100755
index 0000000..1079b21
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/PiAware/livestats.blade.php
@@ -0,0 +1,11 @@
+
+
+ Aircraft
+ {!! $total !!}
+
+
+ Positions
+ {!! $positions !!}
+
+
+
diff --git a/heimdall/config/www/SupportedApps/PiAware/piaware.png b/heimdall/config/www/SupportedApps/PiAware/piaware.png
new file mode 100755
index 0000000..7cfc49e
Binary files /dev/null and b/heimdall/config/www/SupportedApps/PiAware/piaware.png differ
diff --git a/heimdall/config/www/SupportedApps/PiVPN/PiVPN.php b/heimdall/config/www/SupportedApps/PiVPN/PiVPN.php
new file mode 100755
index 0000000..9176146
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/PiVPN/PiVPN.php
@@ -0,0 +1,5 @@
+jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
+ }
+
+ public function test()
+ {
+ $test = parent::appTest($this->url('/api.php'));
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = 'inactive';
+ $res = parent::execute($this->url('/api.php'));
+ $details = json_decode($res->getBody());
+
+ $data = [];
+
+ if($details) {
+ $data['ads_blocked_today'] = number_format($details->ads_blocked_today);
+ $data['ads_percentage_today'] = number_format($details->ads_percentage_today,1);
+ }
+
+ return parent::getLiveStats($status, $data);
+
+ }
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url).$endpoint;
+ return $api_url;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/Pihole/app.json b/heimdall/config/www/SupportedApps/Pihole/app.json
new file mode 100755
index 0000000..a408211
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Pihole/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "b89920409bdce40e08ba1023480b0546061cd577",
+ "name": "Pi-hole",
+ "website": "https://pi-hole.net/",
+ "license": "European Union Public License 1.2",
+ "description": "Pi-hole is a Linux network-level advertisement and internet tracker blocking application which acts as a DNS sinkhole, intended for use on a private network.",
+ "enhanced": true,
+ "tile_background": "dark",
+ "icon": "pihole.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Pihole/config.blade.php b/heimdall/config/www/SupportedApps/Pihole/config.blade.php
new file mode 100755
index 0000000..d371b9a
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Pihole/config.blade.php
@@ -0,0 +1,11 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', (isset($item) ? $item->getconfig()->override_url : null), array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ Test
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Pihole/livestats.blade.php b/heimdall/config/www/SupportedApps/Pihole/livestats.blade.php
new file mode 100755
index 0000000..b19e730
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Pihole/livestats.blade.php
@@ -0,0 +1,10 @@
+
+
+ Queries Blocked
+ {!! $ads_blocked_today !!}
+
+
+ Percent Blocked
+ {!! $ads_percentage_today !!}
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Pihole/pihole.png b/heimdall/config/www/SupportedApps/Pihole/pihole.png
new file mode 100755
index 0000000..93b6b3c
Binary files /dev/null and b/heimdall/config/www/SupportedApps/Pihole/pihole.png differ
diff --git a/heimdall/config/www/SupportedApps/Piwigo/Piwigo.php b/heimdall/config/www/SupportedApps/Piwigo/Piwigo.php
new file mode 100755
index 0000000..a2e90f2
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Piwigo/Piwigo.php
@@ -0,0 +1,5 @@
+jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
+ }
+
+ public function test()
+ {
+ $test = parent::appTest($this->url('/library/recentlyAdded'));
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = 'inactive';
+ $res = parent::execute($this->url('/library/recentlyAdded'));
+
+ $body = $res->getBody();
+ $xml = simplexml_load_string($body, 'SimpleXMLElement', LIBXML_NOCDATA | LIBXML_NOBLANKS);
+ $data = [];
+ if($xml) {
+ $data['recently_added'] = $xml['size'];
+ $status = 'active';
+ }
+
+ $res = parent::execute($this->url('/library/onDeck'));
+
+ $body = $res->getBody();
+ $xml = simplexml_load_string($body, 'SimpleXMLElement', LIBXML_NOCDATA | LIBXML_NOBLANKS);
+ if($xml) {
+ $data['on_deck'] = $xml['size'];
+ $status = 'active';
+ }
+
+ return parent::getLiveStats($status, $data);
+
+ }
+ public function url($endpoint)
+ {
+ $url = parse_url(parent::normaliseurl($this->config->url));
+ $scheme = $url['scheme'];
+ $domain = $url['host'];
+ $port = isset($url['port']) ? $url['port'] : '32400';
+ $api_url = $scheme."://".$domain.":".$port.$endpoint."?X-Plex-Token=".$this->config->token;
+ return $api_url;
+
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/Plex/app.json b/heimdall/config/www/SupportedApps/Plex/app.json
new file mode 100755
index 0000000..fe1a05c
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Plex/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "aebda823a279b219476c565be863d83739999502",
+ "name": "Plex",
+ "website": "https://www.plex.tv/",
+ "license": "Freemium",
+ "description": "Plex media server allows you to aggregate all your personal media and access it anywhere you go. Enjoy your own content on all your devices with Plex.",
+ "enhanced": true,
+ "tile_background": "dark",
+ "icon": "plex.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Plex/config.blade.php b/heimdall/config/www/SupportedApps/Plex/config.blade.php
new file mode 100755
index 0000000..e4492aa
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Plex/config.blade.php
@@ -0,0 +1,15 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', (isset($item) ? $item->getconfig()->override_url : null), array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+
+ Test
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Plex/livestats.blade.php b/heimdall/config/www/SupportedApps/Plex/livestats.blade.php
new file mode 100755
index 0000000..6b8967f
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Plex/livestats.blade.php
@@ -0,0 +1,11 @@
+
+
+ Recent
+ {!! $recently_added !!}
+
+
+ On Deck
+ {!! $on_deck !!}
+
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Plex/plex.png b/heimdall/config/www/SupportedApps/Plex/plex.png
new file mode 100755
index 0000000..08eb2c6
Binary files /dev/null and b/heimdall/config/www/SupportedApps/Plex/plex.png differ
diff --git a/heimdall/config/www/SupportedApps/PlexRequests/PlexRequests.php b/heimdall/config/www/SupportedApps/PlexRequests/PlexRequests.php
new file mode 100755
index 0000000..d2307ca
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/PlexRequests/PlexRequests.php
@@ -0,0 +1,5 @@
+auth();
+ echo "Successfully communicated with the API";
+ } catch (Exception $err) {
+ echo $err->getMessage();
+ }
+ }
+
+ public function auth()
+ {
+ $attrs = [];
+
+ $body["username"] = $this->config->username;
+ $body["password"] = $this->config->password;
+ $vars = [
+ "http_errors" => false,
+ "timeout" => 5,
+ "body" => json_encode($body),
+ ];
+
+ $result = parent::execute(
+ $this->url("api/auth"),
+ $attrs,
+ $vars,
+ "POST"
+ );
+ if (null === $result) {
+ throw new Exception("Could not connect to Portainer");
+ }
+
+ $response = json_decode($result->getBody());
+
+ if (!isset($response->jwt)) {
+ throw new Exception("Invalid credentials");
+ }
+
+ return $response->jwt;
+ }
+
+ public function livestats()
+ {
+ $status = "inactive";
+ $running = 0;
+ $stopped = 0;
+
+ $token = $this->auth();
+ $headers = [
+ "Authorization" => "Bearer " . $token,
+ "Accept" => "application/json",
+ ];
+ $attrs = [
+ "headers" => $headers,
+ ];
+
+ $result = parent::execute(
+ $this->url("api/endpoints?limit=100&start=0"),
+ $attrs,
+ []
+ );
+ if (null === $result) {
+ throw new Exception("Could not connect to Portainer");
+ }
+
+ $response = json_decode($result->getBody());
+ if (count($response) === 0) {
+ throw new Exception("No endpoints");
+ }
+
+ foreach ($response as $endpoint) {
+ if (count($endpoint->Snapshots) === 0) {
+ throw new Exception("No snapshots");
+ }
+
+ $snapshot = $endpoint->Snapshots[0];
+ $data = [
+ ($running += $snapshot->RunningContainerCount),
+ ($stopped += $snapshot->StoppedContainerCount),
+ ];
+ }
+
+ $data = [
+ "running" => $running,
+ "stopped" => $stopped,
+ ];
+ if ($running || $stopped) {
+ $status = "active";
+ }
+ return parent::getLiveStats($status, $data);
+ }
+
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url) . $endpoint;
+ return $api_url;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/Portainer/app.json b/heimdall/config/www/SupportedApps/Portainer/app.json
new file mode 100755
index 0000000..26a2dfa
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Portainer/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "07b796b3a10eaa8b6f485ed2379187a39400b459",
+ "name": "Portainer",
+ "website": "https://portainer.io",
+ "license": "zlib License",
+ "description": "Portainer is a simple management solution for Docker. Easily manage your Docker hosts and Docker Swarm clusters via Portainer web user interface.",
+ "enhanced": true,
+ "tile_background": "dark",
+ "icon": "portainer.svg"
+}
diff --git a/heimdall/config/www/SupportedApps/Portainer/config.blade.php b/heimdall/config/www/SupportedApps/Portainer/config.blade.php
new file mode 100755
index 0000000..981df17
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Portainer/config.blade.php
@@ -0,0 +1,19 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', isset($item) ? $item->getconfig()->override_url : null, ['placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control']) !!}
+
+
+ {{ __('app.apps.username') }}
+ {!! Form::text('config[username]', isset($item) ? $item->getconfig()->username : null, ['placeholder' => __('app.apps.username'), 'data-config' => 'username', 'class' => 'form-control config-item']) !!}
+
+
+ {{ __('app.apps.password') }}
+ {!! Form::input('password', 'config[password]', '', ['placeholder' => __('app.apps.password'), 'data-config' => 'password', 'class' => 'form-control config-item']) !!}
+
+
+ Test
+
+
diff --git a/heimdall/config/www/SupportedApps/Portainer/livestats.blade.php b/heimdall/config/www/SupportedApps/Portainer/livestats.blade.php
new file mode 100755
index 0000000..f98751d
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Portainer/livestats.blade.php
@@ -0,0 +1,10 @@
+
+
+ Running
+ {!! $running !!}
+
+
+ Stopped
+ {!! $stopped !!}
+
+
diff --git a/heimdall/config/www/SupportedApps/Portainer/portainer.png b/heimdall/config/www/SupportedApps/Portainer/portainer.png
new file mode 100755
index 0000000..77eca35
Binary files /dev/null and b/heimdall/config/www/SupportedApps/Portainer/portainer.png differ
diff --git a/heimdall/config/www/SupportedApps/Poste/Poste.php b/heimdall/config/www/SupportedApps/Poste/Poste.php
new file mode 100755
index 0000000..2852359
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Poste/Poste.php
@@ -0,0 +1,5 @@
+getConfigValue("token_id", null);
+ $token_value = $this->getConfigValue("token_value", null);
+ $ignoreTls = $this->getConfigValue("ignore_tls", false);
+
+ $auth = "PVEAPIToken=" . $token_id . "=" . $token_value;
+
+ $attrs["headers"] = [
+ "Accept" => "application/json",
+ "Authorization" => $auth,
+ ];
+ if ($ignoreTls) {
+ $attrs["verify"] = false;
+ }
+
+ return $attrs;
+ }
+
+ function __construct()
+ {
+ }
+
+ public function test()
+ {
+ $attrs = $this->getRequestAttrs();
+ $test = parent::appTest($this->url("version"), $attrs);
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = "active";
+ $attrs = $this->getRequestAttrs();
+
+ $nodes = explode(",", $this->getConfigValue("nodes", ""));
+
+ if ($nodes == [""]) {
+ $nodes = array_map(function ($v) {
+ return $v->node;
+ }, $this->apiCall("nodes"));
+ }
+
+ $vm_running = 0;
+ $vm_total = 0;
+ $container_running = 0;
+ $container_total = 0;
+ $cpu_percent_sum = 0.0;
+ $memory_total = 0.0;
+ $memory_used = 0.0;
+ foreach ($nodes as $node) {
+ $node_status = $this->apiCall("nodes/" . $node . "/status");
+ $cpu_percent_sum += $node_status->cpu;
+ $memory_used += $node_status->memory->used;
+ $memory_total += $node_status->memory->total;
+
+ $vm_stats = $this->apiCall("nodes/" . $node . "/qemu");
+ $vm_total += count($vm_stats);
+ $vm_running += count(
+ array_filter($vm_stats, function ($v) {
+ return $v->status == "running";
+ })
+ );
+
+ $container_stats = $this->apiCall("nodes/" . $node . "/lxc");
+ $container_total += count($container_stats);
+ $container_running += count(
+ array_filter($container_stats, function ($v) {
+ return $v->status == "running";
+ })
+ );
+ }
+
+ $res = parent::execute($this->url("version"), $attrs);
+ $details = json_decode($res->getBody())->data;
+
+ $data = [
+ "vm_running" => $vm_running,
+ "vm_total" => $vm_total,
+ "container_running" => $container_running,
+ "container_total" => $container_total,
+ "cpu_percent" => ($cpu_percent_sum / count($nodes)) * 100,
+ "memory_percent" => (100 / $memory_total) * $memory_used,
+ ];
+ return parent::getLiveStats($status, $data);
+ }
+ public function url($endpoint)
+ {
+ $api_stub = "api2/json/";
+ $api_url =
+ parent::normaliseurl(
+ $this->getConfigValue("override_url", $this->config->url)
+ ) .
+ $api_stub .
+ $endpoint;
+ return $api_url;
+ }
+
+ public function apiCall($endpoint)
+ {
+ $res = parent::execute($this->url($endpoint), $this->getRequestAttrs());
+ return json_decode($res->getBody())->data;
+ }
+
+ public function getConfigValue($key, $default = null)
+ {
+ return isset($this->config) && isset($this->config->$key)
+ ? $this->config->$key
+ : $default;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/Proxmox/app.json b/heimdall/config/www/SupportedApps/Proxmox/app.json
new file mode 100755
index 0000000..766231c
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Proxmox/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "391f2b7f3fe853e1ea09723eeafc354fa291ab48",
+ "name": "Proxmox",
+ "website": "https://www.proxmox.com/en/",
+ "license": "GNU Affero General Public License v3.0 only",
+ "description": "Proxmox Virtual Environment is an open-source server virtualization environment. It allows deployment and management of virtual machines and containers",
+ "enhanced": true,
+ "tile_background": "light",
+ "icon": "proxmox.svg"
+}
diff --git a/heimdall/config/www/SupportedApps/Proxmox/config.blade.php b/heimdall/config/www/SupportedApps/Proxmox/config.blade.php
new file mode 100755
index 0000000..5442328
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Proxmox/config.blade.php
@@ -0,0 +1,40 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', isset($item) ? $item->getconfig()->override_url : null, ['placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control']) !!}
+
+
+ Node(s) (comma separated list)
+ {!! Form::text('config[nodes]', isset($item) ? $item->getconfig()->nodes : null, ['placeholder' => 'Leave blank for all nodes in cluster', 'data-config' => 'nodes', 'class' => 'form-control config-item']) !!}
+
+
+
+ API Token ID
+ {!! Form::text('config[token_id]', isset($item) ? $item->getconfig()->token_id : null, ['placeholder' => 'user@realm!token_name', 'data-config' => 'token_id', 'class' => 'form-control config-item']) !!}
+
+
+
+ Test
+
+
diff --git a/heimdall/config/www/SupportedApps/Proxmox/livestats.blade.php b/heimdall/config/www/SupportedApps/Proxmox/livestats.blade.php
new file mode 100755
index 0000000..fe764c3
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Proxmox/livestats.blade.php
@@ -0,0 +1,18 @@
+
+
+ VM
+ {!! $vm_running !!}/{!! $vm_total !!}
+
+
+ LXC
+ {!! $container_running !!}/{!! $container_total !!}
+
+
+ CPU
+ {!! round($cpu_percent, 1) !!}%
+
+
+ RAM
+ {!! round($memory_percent, 1) !!}%
+
+
diff --git a/heimdall/config/www/SupportedApps/Proxmox/proxmox.png b/heimdall/config/www/SupportedApps/Proxmox/proxmox.png
new file mode 100755
index 0000000..3310ce0
Binary files /dev/null and b/heimdall/config/www/SupportedApps/Proxmox/proxmox.png differ
diff --git a/heimdall/config/www/SupportedApps/PsiTransfer/PsiTransfer.php b/heimdall/config/www/SupportedApps/PsiTransfer/PsiTransfer.php
new file mode 100755
index 0000000..a79719a
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/PsiTransfer/PsiTransfer.php
@@ -0,0 +1,5 @@
+jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
+ }
+
+ public function test()
+ {
+ $test = parent::appTest($this->url("system/status"));
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = "inactive";
+ $data = [];
+
+ $movies = json_decode(parent::execute($this->url("movie"))->getBody());
+ $queue = json_decode(parent::execute($this->url("queue"))->getBody());
+
+ $collect = collect($movies);
+ $missing = $collect->where("monitored", true)->where("isAvailable", true)->where("hasFile", false);
+
+ $data = [];
+ if ($missing || $queue) {
+ $data["missing"] = $missing->count() ?? 0;
+ $data["queue"] = count($queue->records) ?? 0;
+ }
+
+ return parent::getLiveStats($status, $data);
+ }
+
+ public function url($endpoint)
+ {
+ $api_url =
+ parent::normaliseurl($this->config->url) .
+ "api/v3/" .
+ $endpoint .
+ "?apikey=" .
+ $this->config->apikey;
+ return $api_url;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/Radarr/app.json b/heimdall/config/www/SupportedApps/Radarr/app.json
new file mode 100755
index 0000000..2da9e43
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Radarr/app.json
@@ -0,0 +1,31 @@
+{
+ "appid": "8a5cd39a1a5dff323d63bbe45fffe0c9c03bd2e7",
+ "name": "Radarr",
+ "website": "https://radarr.video",
+ "license": "GNU General Public License v3.0 only",
+ "description": "Radarr is an independent fork of Sonarr reworked for automatically downloading movies via Usenet and BitTorrent.\r\n\r\nThe project was inspired by other Usenet/BitTorrent movie downloaders such as CouchPotato.",
+ "enhanced": true,
+ "tile_background": "light",
+ "icon": "radarr.svg",
+ "config": {
+ "type": "apikey",
+ "stat1": {
+ "name": "Missing",
+ "url": ":url:api/v3/movie?apikey=:apikey:",
+ "key": "",
+ "filter": "filter",
+ "filterBy": "hasFile",
+ "filterByValue": "false",
+ "updateOnChange": "no",
+ "suffix": ""
+ },
+ "stat2": {
+ "name": "Queue",
+ "url": ":url:api/v3/queue?apikey=:apikey:",
+ "key": "totalRecords",
+ "filter": "none",
+ "updateOnChange": "no",
+ "suffix": ""
+ }
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/Radarr/config.blade.php b/heimdall/config/www/SupportedApps/Radarr/config.blade.php
new file mode 100755
index 0000000..4a8082c
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Radarr/config.blade.php
@@ -0,0 +1,14 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', isset($item) ? $item->getconfig()->override_url : null, ['placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control']) !!}
+
+
+ {{ __('app.apps.apikey') }}
+ {!! Form::text('config[apikey]', isset($item) ? $item->getconfig()->apikey : null, ['placeholder' => __('app.apps.apikey'), 'data-config' => 'apikey', 'class' => 'form-control config-item']) !!}
+
+
+ Test
+
+
diff --git a/heimdall/config/www/SupportedApps/Radarr/livestats.blade.php b/heimdall/config/www/SupportedApps/Radarr/livestats.blade.php
new file mode 100755
index 0000000..81a32fa
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Radarr/livestats.blade.php
@@ -0,0 +1,10 @@
+
+
+ Missing
+ {!! $missing !!}
+
+
+ Queue
+ {!! $queue !!}
+
+
diff --git a/heimdall/config/www/SupportedApps/Radarr/radarr.png b/heimdall/config/www/SupportedApps/Radarr/radarr.png
new file mode 100755
index 0000000..5603d63
Binary files /dev/null and b/heimdall/config/www/SupportedApps/Radarr/radarr.png differ
diff --git a/heimdall/config/www/SupportedApps/Rainloop/Rainloop.php b/heimdall/config/www/SupportedApps/Rainloop/Rainloop.php
new file mode 100755
index 0000000..10ad307
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Rainloop/Rainloop.php
@@ -0,0 +1,5 @@
+
+
+
+
+
+
+
diff --git a/heimdall/config/www/SupportedApps/RocketChat/RocketChat.php b/heimdall/config/www/SupportedApps/RocketChat/RocketChat.php
new file mode 100755
index 0000000..839f09a
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/RocketChat/RocketChat.php
@@ -0,0 +1,5 @@
+jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
+ }
+
+ public function test()
+ {
+ $test = parent::appTest($this->url('status'));
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = 'inactive';
+ $res = parent::execute($this->url('currentsong'));
+
+ $array = explode("\n", $res->getBody());
+ foreach($array as $item) {
+ $item_array = explode(": ", $item);
+ if ($item_array[0] == 'Artist') {
+ $artist = $item_array[1];
+ } elseif ($item_array[0] == 'Title') {
+ $song_title = $item_array[1];
+ }
+ }
+
+ $data = [];
+
+ $data['artist'] = $artist ?? 'None';
+ $data['song_title'] = $song_title ?? 'None';
+
+ return parent::getLiveStats($status, $data);
+
+ }
+
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url).'command/?cmd='.$endpoint;
+ return $api_url;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/RuneAudio/app.json b/heimdall/config/www/SupportedApps/RuneAudio/app.json
new file mode 100755
index 0000000..c9171ef
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/RuneAudio/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "11f6ce44eb513a288ca4ef26cbbdb3fece2d6ec4",
+ "name": "RuneAudio",
+ "website": "http://www.runeaudio.com/",
+ "license": "GNU General Public License v3.0 or later",
+ "description": "RuneAudio is a free and open source software that turns inexpensive, silent and low-consumption mini-PC into Hi-Fi music players.",
+ "enhanced": true,
+ "tile_background": "dark",
+ "icon": "runeaudio.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/RuneAudio/config.blade.php b/heimdall/config/www/SupportedApps/RuneAudio/config.blade.php
new file mode 100755
index 0000000..097fed4
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/RuneAudio/config.blade.php
@@ -0,0 +1,12 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', (isset($item) ? $item->getconfig()->override_url : null), array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ Test
+
+
+
diff --git a/heimdall/config/www/SupportedApps/RuneAudio/livestats.blade.php b/heimdall/config/www/SupportedApps/RuneAudio/livestats.blade.php
new file mode 100755
index 0000000..4d949c6
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/RuneAudio/livestats.blade.php
@@ -0,0 +1,16 @@
+
+
+ @if(strlen($artist) > 12)
+ Artist {!! $artist !!}
+ @else
+ Artist {!! $artist !!}
+ @endif
+
+
+ @if(strlen($song_title) > 12)
+ Song {!! $song_title !!}
+ @else
+ Song {!! $song_title !!}
+ @endif
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/RuneAudio/runeaudio.png b/heimdall/config/www/SupportedApps/RuneAudio/runeaudio.png
new file mode 100755
index 0000000..e5e488e
Binary files /dev/null and b/heimdall/config/www/SupportedApps/RuneAudio/runeaudio.png differ
diff --git a/heimdall/config/www/SupportedApps/SABnzbd/SABnzbd.php b/heimdall/config/www/SupportedApps/SABnzbd/SABnzbd.php
new file mode 100755
index 0000000..610500a
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/SABnzbd/SABnzbd.php
@@ -0,0 +1,52 @@
+jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
+ }
+
+ public function test()
+ {
+ $test = parent::appTest($this->url('queue'));
+ if($test->code === 200) {
+ $data = json_decode($test->response);
+ if(isset($data->error) && !empty($data->error)) {
+ $test->status = 'Failed: '.$data->error;
+ }
+ }
+
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = 'inactive';
+ $res = parent::execute($this->url('queue'));
+ $details = json_decode($res->getBody());
+
+ $data = [];
+
+ if($details) {
+ $size = $details->queue->mbleft;
+ $rate = $details->queue->kbpersec;
+ $data['queue_size'] = format_bytes($size*1000*1000, false, ' ', ' ');
+ $data['current_speed'] = format_bytes($rate*1000, false, ' ', '/s ');
+ $status = ($size > 0 || $rate > 0) ? 'active' : 'inactive';
+ }
+
+ return parent::getLiveStats($status, $data);
+
+ }
+ public function url($endpoint)
+ {
+ $apikey = $this->config->apikey;
+ $api_url = parent::normaliseurl($this->config->url).'api?output=json&apikey='.$apikey.'&mode='.$endpoint;
+ return $api_url;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/SABnzbd/app.json b/heimdall/config/www/SupportedApps/SABnzbd/app.json
new file mode 100755
index 0000000..7d19c51
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/SABnzbd/app.json
@@ -0,0 +1,29 @@
+{
+ "appid": "7aa898759f1d210aaa5edc8a184bfe5e1668b5bd",
+ "name": "SABnzbd",
+ "website": "https://sabnzbd.org/",
+ "license": "GNU General Public License v2.0 or later",
+ "description": "SABnzbd is a multi-platform binary newsgroup downloader. The program works in the background and simplifies the downloading verifying and extracting of files from Usenet.",
+ "enhanced": true,
+ "tile_background": "dark",
+ "icon": "sabnzbd.png",
+ "config": {
+ "type": "apikey",
+ "stat1": {
+ "name": "Queue",
+ "url": ":url:api?output=json&apikey=:apikey:&mode=queue",
+ "key": "queue.sizeleft",
+ "filter": "none",
+ "updateOnChange": "Yes",
+ "suffix": ""
+ },
+ "stat2": {
+ "name": "Speed",
+ "url": ":url:api?output=json&apikey=:apikey:&mode=queue",
+ "key": "queue.speed",
+ "filter": "speed",
+ "updateOnChange": "Yes",
+ "suffix": ""
+ }
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/SABnzbd/config.blade.php b/heimdall/config/www/SupportedApps/SABnzbd/config.blade.php
new file mode 100755
index 0000000..87755d5
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/SABnzbd/config.blade.php
@@ -0,0 +1,15 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', (isset($item) ? $item->getconfig()->override_url : null), array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ {{ __('app.apps.apikey') }}
+ {!! Form::text('config[apikey]', (isset($item) ? $item->getconfig()->apikey : null), array('placeholder' => __('app.apps.apikey'), 'data-config' => 'apikey', 'class' => 'form-control config-item')) !!}
+
+
+ Test
+
+
+
diff --git a/heimdall/config/www/SupportedApps/SABnzbd/livestats.blade.php b/heimdall/config/www/SupportedApps/SABnzbd/livestats.blade.php
new file mode 100755
index 0000000..4fa2c8b
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/SABnzbd/livestats.blade.php
@@ -0,0 +1,10 @@
+
+
+ Queue
+ {!! $queue_size !!}
+
+
+ Speed
+ {!! $current_speed !!}
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/SABnzbd/sabnzbd.png b/heimdall/config/www/SupportedApps/SABnzbd/sabnzbd.png
new file mode 100755
index 0000000..acf3d27
Binary files /dev/null and b/heimdall/config/www/SupportedApps/SABnzbd/sabnzbd.png differ
diff --git a/heimdall/config/www/SupportedApps/SOGo/SOGo.php b/heimdall/config/www/SupportedApps/SOGo/SOGo.php
new file mode 100755
index 0000000..6175c1b
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/SOGo/SOGo.php
@@ -0,0 +1,5 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/heimdall/config/www/SupportedApps/Seafile/Seafile.php b/heimdall/config/www/SupportedApps/Seafile/Seafile.php
new file mode 100755
index 0000000..5b68057
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Seafile/Seafile.php
@@ -0,0 +1,5 @@
+url, '/');
+ $q = urlencode($query);
+ return redirect($url.'/search?q='.$q);
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/SearxMetasearchEngine/app.json b/heimdall/config/www/SupportedApps/SearxMetasearchEngine/app.json
new file mode 100755
index 0000000..b5d56f5
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/SearxMetasearchEngine/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "d3f896182b5c10b07918e295fce8c5aef054d266",
+ "name": "Searx Metasearch Engine",
+ "website": "https://searx.me",
+ "license": "https://github.com/asciimoo/searx/blob/master/LICENSE",
+ "description": "A privacy-respecting, hackable metasearch engine.",
+ "enhanced": false,
+ "tile_background": "dark",
+ "icon": "searxmetasearchengine.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/SearxMetasearchEngine/searxmetasearchengine.png b/heimdall/config/www/SupportedApps/SearxMetasearchEngine/searxmetasearchengine.png
new file mode 100755
index 0000000..9427900
Binary files /dev/null and b/heimdall/config/www/SupportedApps/SearxMetasearchEngine/searxmetasearchengine.png differ
diff --git a/heimdall/config/www/SupportedApps/Serviio/Serviio.php b/heimdall/config/www/SupportedApps/Serviio/Serviio.php
new file mode 100755
index 0000000..62f67a6
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Serviio/Serviio.php
@@ -0,0 +1,5 @@
+jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
+ }
+
+ public function test()
+ {
+ $attrs = [
+ 'headers' => ['Accept' => 'application/json']
+ ];
+ $test = parent::appTest($this->url('system/status'), $attrs);
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = 'inactive';
+ $data = [];
+ $attrs = [
+ 'headers' => ['Accept' => 'application/json']
+ ];
+
+
+ $missing = json_decode(parent::execute($this->url('wanted/missing'), $attrs)->getBody());
+ $queue = json_decode(parent::execute($this->url('queue'), $attrs)->getBody());
+
+ $data = [];
+
+ if($missing || $queue) {
+ $data['missing'] = $missing->totalRecords ?? 0;
+ $data['queue'] = $queue->totalRecords ?? 0;
+ }
+
+ return parent::getLiveStats($status, $data);
+
+ }
+
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url).'api/v3/'.$endpoint.'?apikey='.$this->config->apikey;
+ return $api_url;
+ }
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Sonarr/app.json b/heimdall/config/www/SupportedApps/Sonarr/app.json
new file mode 100755
index 0000000..3c5be99
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Sonarr/app.json
@@ -0,0 +1,27 @@
+{
+ "appid": "6e2a525ceb737f9ed8badcef5eb20d1502e39656",
+ "name": "Sonarr",
+ "website": "https://sonarr.tv/",
+ "license": "GNU General Public License v3.0 only",
+ "description": "Sonarr is a PVR for Usenet and BitTorrent users. It can monitor multiple RSS feeds for new episodes of your favorite shows and will grab, sort and rename them. It can also be configured to automatically upgrade the quality of files already downloaded when a better quality format becomes available.",
+ "enhanced": true,
+ "tile_background": "dark",
+ "icon": "sonarr.png",
+ "config": {
+ "type": "apikey",
+ "stat1": {
+ "name": "Missing",
+ "url": ":url:api/wanted/missing?apikey=:apikey:",
+ "key": "totalRecords",
+ "filter": "none",
+ "updateOnChange": "No"
+ },
+ "stat2": {
+ "name": "Queue",
+ "url": ":url:api/queue?apikey=:apikey:",
+ "key": null,
+ "filter": "count",
+ "updateOnChange": "No"
+ }
+ }
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Sonarr/config.blade.php b/heimdall/config/www/SupportedApps/Sonarr/config.blade.php
new file mode 100755
index 0000000..87755d5
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Sonarr/config.blade.php
@@ -0,0 +1,15 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', (isset($item) ? $item->getconfig()->override_url : null), array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ {{ __('app.apps.apikey') }}
+ {!! Form::text('config[apikey]', (isset($item) ? $item->getconfig()->apikey : null), array('placeholder' => __('app.apps.apikey'), 'data-config' => 'apikey', 'class' => 'form-control config-item')) !!}
+
+
+ Test
+
+
+
diff --git a/heimdall/config/www/SupportedApps/Sonarr/livestats.blade.php b/heimdall/config/www/SupportedApps/Sonarr/livestats.blade.php
new file mode 100755
index 0000000..7b7fb92
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Sonarr/livestats.blade.php
@@ -0,0 +1,10 @@
+
+
+ Missing
+ {!! $missing !!}
+
+
+ Queue
+ {!! $queue !!}
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Sonarr/sonarr.png b/heimdall/config/www/SupportedApps/Sonarr/sonarr.png
new file mode 100755
index 0000000..33e3446
Binary files /dev/null and b/heimdall/config/www/SupportedApps/Sonarr/sonarr.png differ
diff --git a/heimdall/config/www/SupportedApps/Sourcegraph/Sourcegraph.php b/heimdall/config/www/SupportedApps/Sourcegraph/Sourcegraph.php
new file mode 100755
index 0000000..6f2565d
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Sourcegraph/Sourcegraph.php
@@ -0,0 +1,5 @@
+jar = new \GuzzleHttp\Cookie\CookieJar;
+ }
+
+ public function login()
+ {
+ $username = $this->config->username;
+ $password = $this->config->password;
+
+ if (!isset($username) || empty($username) || !isset($password) || empty($password))
+ return;
+
+ $attrs = [
+ 'cookies' => $this->jar
+ ];
+ $res = parent::execute($this->url('?page=login'), $attrs);
+ $content = (string) $res->getBody(true);
+ preg_match("/name=\"loginform\[xsrfid\]\" value=\"([^\"]+)/", $content, $matches);
+ $xsrfid = $matches[1];
+
+ $attrs = [
+ 'form_params' => [
+ 'loginform' => [
+ 'username' => $username,
+ 'password' => $password,
+ 'xsrfid' => $xsrfid,
+ 'submitlogin' => 'Login',
+ ]
+ ],
+ 'cookies' => $this->jar,
+ 'headers' => ['content-type' => 'application/x-www-form-urlencoded']
+ ];
+ $res = parent::execute($this->url('?page=login'), $attrs, false, 'POST');
+ }
+
+ public function test()
+ {
+ $this->login();
+
+ $attrs = [
+ 'cookies' => $this->jar
+ ];
+ $test = parent::appTest($this->url('?page=statistics'), $attrs);
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $this->login();
+
+ $status = 'inactive';
+ $attrs = [
+ 'cookies' => $this->jar
+ ];
+ $res = parent::execute($this->url('?page=statistics'), $attrs);
+ $content = (string) $res->getBody(true);
+
+ $data = [];
+ if (preg_match("/Last update: ([^\<]+)/", $content, $matches) && count($matches) > 1) {
+ $status = 'active';
+ $data['last_update'] = trim($matches[1]);
+ }
+ return parent::getLiveStats($status, $data);
+ }
+
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url).$endpoint;
+ return $api_url;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/Spotweb/app.json b/heimdall/config/www/SupportedApps/Spotweb/app.json
new file mode 100755
index 0000000..8d5e129
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Spotweb/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "8d40ec161e2793d4ad3526e66d1723b2043780b6",
+ "name": "Spotweb",
+ "website": "https://github.com/spotweb/spotweb",
+ "license": "BSD 3-Clause \"New\" or \"Revised\" License",
+ "description": "Spotweb is a decentralized usenet community based on the Spotnet protocol.",
+ "enhanced": true,
+ "tile_background": "dark",
+ "icon": "spotweb.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Spotweb/config.blade.php b/heimdall/config/www/SupportedApps/Spotweb/config.blade.php
new file mode 100755
index 0000000..57fd5fb
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Spotweb/config.blade.php
@@ -0,0 +1,19 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', (isset($item) && isset($item->getconfig()->override_url) ? $item->getconfig()->override_url : null), array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ {{ __('app.apps.username') }}
+ {!! Form::text('config[username]', (isset($item) && isset($item->getconfig()->username) ? $item->getconfig()->username : null), array('placeholder' => __('app.apps.username'), 'data-config' => 'username', 'class' => 'form-control config-item')) !!}
+
+
+ {{ __('app.apps.password') }}
+ {!! Form::text('config[password]', (isset($item) && isset($item->getconfig()->password) ? $item->getconfig()->password : null), array('placeholder' => __('app.apps.password'), 'data-config' => 'password', 'class' => 'form-control config-item')) !!}
+
+
+ Test
+
+
+
diff --git a/heimdall/config/www/SupportedApps/Spotweb/livestats.blade.php b/heimdall/config/www/SupportedApps/Spotweb/livestats.blade.php
new file mode 100755
index 0000000..f754689
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Spotweb/livestats.blade.php
@@ -0,0 +1,6 @@
+
+
+ Last update
+ {!! $last_update !!}
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Spotweb/spotweb.png b/heimdall/config/www/SupportedApps/Spotweb/spotweb.png
new file mode 100755
index 0000000..29d1957
Binary files /dev/null and b/heimdall/config/www/SupportedApps/Spotweb/spotweb.png differ
diff --git a/heimdall/config/www/SupportedApps/Squidex/Squidex.php b/heimdall/config/www/SupportedApps/Squidex/Squidex.php
new file mode 100755
index 0000000..cf31e56
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Squidex/Squidex.php
@@ -0,0 +1,5 @@
+jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
+ }
+
+ public function test()
+ {
+ $test = parent::appTest($this->url('status'));
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = 'inactive';
+ $res = parent::execute($this->url('status'));
+ $details = json_decode($res->getBody());
+
+ $data = [];
+ return parent::getLiveStats($status, $data);
+
+ }
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url).$endpoint;
+ return $api_url;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/Stash/app.json b/heimdall/config/www/SupportedApps/Stash/app.json
new file mode 100755
index 0000000..bb98b35
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Stash/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "585815f2ee7291f96ea30333fd94d20b5722693f",
+ "name": "Stash",
+ "website": "https://github.com/stashapp/stash",
+ "license": "MIT License",
+ "description": "Stash is a Go app which organizes and serves your porn.",
+ "enhanced": true,
+ "tile_background": "dark",
+ "icon": "stash.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Stash/config.blade.php b/heimdall/config/www/SupportedApps/Stash/config.blade.php
new file mode 100755
index 0000000..51278e3
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Stash/config.blade.php
@@ -0,0 +1,19 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', null, array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ {{ __('app.apps.username') }}
+ {!! Form::text('config[username]', null, array('placeholder' => __('app.apps.username'), 'data-config' => 'username', 'class' => 'form-control config-item')) !!}
+
+
+ {{ __('app.apps.password') }}
+ {!! Form::text('config[password]', null, array('placeholder' => __('app.apps.password'), 'data-config' => 'password', 'class' => 'form-control config-item')) !!}
+
+
+ Test
+
+
+
diff --git a/heimdall/config/www/SupportedApps/Stash/livestats.blade.php b/heimdall/config/www/SupportedApps/Stash/livestats.blade.php
new file mode 100755
index 0000000..4fa2c8b
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Stash/livestats.blade.php
@@ -0,0 +1,10 @@
+
+
+ Queue
+ {!! $queue_size !!}
+
+
+ Speed
+ {!! $current_speed !!}
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Stash/stash.png b/heimdall/config/www/SupportedApps/Stash/stash.png
new file mode 100755
index 0000000..6ff0465
Binary files /dev/null and b/heimdall/config/www/SupportedApps/Stash/stash.png differ
diff --git a/heimdall/config/www/SupportedApps/Statping/Statping.php b/heimdall/config/www/SupportedApps/Statping/Statping.php
new file mode 100755
index 0000000..9c863c6
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Statping/Statping.php
@@ -0,0 +1,5 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/heimdall/config/www/SupportedApps/Synclounge/Synclounge.php b/heimdall/config/www/SupportedApps/Synclounge/Synclounge.php
new file mode 100755
index 0000000..baef0ce
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Synclounge/Synclounge.php
@@ -0,0 +1,5 @@
+jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
+ }
+
+ function get_request_attrs() {
+ $attrs['headers'] = ["X-API-Key" => $this->config->apikey];
+ return $attrs;
+ }
+
+ public function test()
+ {
+ $attrs = $this->get_request_attrs();
+ $test = parent::appTest($this->url('/rest/system/version'), $attrs);
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $data = [];
+ $needed_files = 0;
+ $needed_bytes = 0;
+ $status = 'inactive';
+ $attrs = $this->get_request_attrs();
+
+ # first get a list of folders
+ $res = parent::execute($this->url('/rest/stats/folder'), $attrs);
+ $details = json_decode($res->getBody());
+
+ foreach ($details as $folder => $folder_status) {
+ $folder_db_res = parent::execute($this->url('/rest/db/status?folder=${folder}'), $attrs);
+ $folder_db = json_decode($folder_db_res->getBody());
+
+ if ($folder_db) {
+ $needed_files += $folder_db["needFiles"];
+ $needed_bytes += $folder_db["needBytes"];
+ }
+ }
+
+ if ($needed_files || $needed_bytes) {
+ $status = 'active';
+ }
+
+ $data['needed_files'] = $needed_files;
+ $data['needed_bytes'] = $needed_bytes;
+ return parent::getLiveStats($status, $data);
+ }
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url).$endpoint;
+ return $api_url;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/Syncthing/app.json b/heimdall/config/www/SupportedApps/Syncthing/app.json
new file mode 100755
index 0000000..c43d5b1
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Syncthing/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "7775c3bbf580fbaf57818e68ce7b1b48b8f93b95",
+ "name": "Syncthing",
+ "website": "https://syncthing.net/",
+ "license": "Mozilla Public License 2.0",
+ "description": "Syncthing is a free, open-source peer-to-peer file synchronization application. It can sync files between devices on a local network, or between remote devices over the Internet.",
+ "enhanced": true,
+ "tile_background": "dark",
+ "icon": "syncthing.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Syncthing/config.blade.php b/heimdall/config/www/SupportedApps/Syncthing/config.blade.php
new file mode 100755
index 0000000..1917b4a
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Syncthing/config.blade.php
@@ -0,0 +1,15 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', null, array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ {{ __('app.apps.apikey') }}
+ {!! Form::text('config[apikey]', (isset($item) && property_exists($item->getconfig(), "apikey") ? $item->getconfig()->apikey : null), array('placeholder' => __('app.apps.apikey'), 'data-config' => 'apikey', 'class' => 'form-control config-item')) !!}
+
+
+ Test
+
+
+
diff --git a/heimdall/config/www/SupportedApps/Syncthing/livestats.blade.php b/heimdall/config/www/SupportedApps/Syncthing/livestats.blade.php
new file mode 100755
index 0000000..fd58853
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Syncthing/livestats.blade.php
@@ -0,0 +1,10 @@
+
+
+ Needed Files
+ {!! $needed_files !!}
+
+
+ Needed Bytes
+ {!! $needed_bytes !!}
+
+
diff --git a/heimdall/config/www/SupportedApps/Syncthing/syncthing.png b/heimdall/config/www/SupportedApps/Syncthing/syncthing.png
new file mode 100755
index 0000000..0f0f9e9
Binary files /dev/null and b/heimdall/config/www/SupportedApps/Syncthing/syncthing.png differ
diff --git a/heimdall/config/www/SupportedApps/Synology/Synology.php b/heimdall/config/www/SupportedApps/Synology/Synology.php
new file mode 100755
index 0000000..6f3b511
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Synology/Synology.php
@@ -0,0 +1,5 @@
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/heimdall/config/www/SupportedApps/Taiga/Taiga.php b/heimdall/config/www/SupportedApps/Taiga/Taiga.php
new file mode 100755
index 0000000..deb1216
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Taiga/Taiga.php
@@ -0,0 +1,5 @@
+jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
+ }
+
+ public function test()
+ {
+ $test = parent::appTest($this->url('data/stats.json'));
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = 'inactive';
+ $res = parent::execute($this->url('data/stats.json'));
+ $details = json_decode($res->getBody());
+
+ $data = [];
+
+ if($details) {
+ $data['aircaft_with_pos'] = number_format($details->aircaft_with_pos);
+ $data['aircraft_without_pos'] = number_format($details->aircraft_without_pos);
+ }
+
+ return parent::getLiveStats($status, $data);
+
+ }
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url).$endpoint;
+ return $api_url;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/TarTenNinety/app.json b/heimdall/config/www/SupportedApps/TarTenNinety/app.json
new file mode 100755
index 0000000..4da7261
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/TarTenNinety/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "44fb3ee60816316d3c253e7454f5e0ab5f46680a",
+ "name": "Tar1090",
+ "website": "https://github.com/wiedehopf/tar1090",
+ "license": "GNU General Public License v2.0 only",
+ "description": "Provides an improved webinterface for use with ADS-B decoders readsb / dump1090-fa",
+ "enhanced": true,
+ "tile_background": "dark",
+ "icon": "tar1090.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/TarTenNinety/config.blade.php b/heimdall/config/www/SupportedApps/TarTenNinety/config.blade.php
new file mode 100755
index 0000000..7d4f74c
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/TarTenNinety/config.blade.php
@@ -0,0 +1,22 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', null, array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+
+ Test
+
+
+
diff --git a/heimdall/config/www/SupportedApps/TarTenNinety/livestats.blade.php b/heimdall/config/www/SupportedApps/TarTenNinety/livestats.blade.php
new file mode 100755
index 0000000..fa603f9
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/TarTenNinety/livestats.blade.php
@@ -0,0 +1,10 @@
+
+
+ Aircraft with Pos
+ {!! $aircaft_with_pos !!}
+
+
+ Aircraft w/o Pos
+ {!! $aircraft_without_pos !!}
+
+
diff --git a/heimdall/config/www/SupportedApps/TarTenNinety/tar1090.png b/heimdall/config/www/SupportedApps/TarTenNinety/tar1090.png
new file mode 100755
index 0000000..bc06392
Binary files /dev/null and b/heimdall/config/www/SupportedApps/TarTenNinety/tar1090.png differ
diff --git a/heimdall/config/www/SupportedApps/TasmoAdmin/TasmoAdmin.php b/heimdall/config/www/SupportedApps/TasmoAdmin/TasmoAdmin.php
new file mode 100755
index 0000000..2d4e646
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/TasmoAdmin/TasmoAdmin.php
@@ -0,0 +1,5 @@
+jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
+ }
+
+ public function test()
+ {
+ $test = parent::appTest($this->url('cm?cmnd=Status 8'));
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = 'inactive';
+ $res = parent::execute($this->url('cm?cmnd=Status 8'));
+ $details = json_decode($res->getBody());
+
+ $data = [];
+
+ if($details) {
+ $data['temperature'] = number_format($details->StatusSNS->AM2301->Temperature,1);
+ $data['humidity'] = number_format($details->StatusSNS->AM2301->Humidity,1);
+ $data['dewpoint'] = number_format($details->StatusSNS->AM2301->DewPoint,1);
+ }
+
+ return parent::getLiveStats($status, $data);
+
+ }
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url).$endpoint;
+ return $api_url;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/Tasmota/app.json b/heimdall/config/www/SupportedApps/Tasmota/app.json
new file mode 100755
index 0000000..3cf1269
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Tasmota/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "0d318b04d2442102c6a9643405bce18b5df5cf78",
+ "name": "Tasmota",
+ "website": "https://github.com/arendst/Tasmota",
+ "license": "GNU General Public License v3.0 or later",
+ "description": "Alternative firmware for ESP8266 based devices with easy configuration using webUI, OTA updates, automation using timers or rules, expandability and entirely local control over MQTT, HTTP, Serial or KNX.",
+ "enhanced": true,
+ "tile_background": "light",
+ "icon": "tasmota.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Tasmota/config.blade.php b/heimdall/config/www/SupportedApps/Tasmota/config.blade.php
new file mode 100755
index 0000000..210982a
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Tasmota/config.blade.php
@@ -0,0 +1,10 @@
+{{ __('app.apps.config') }} - Pull AM2301 Sensor Data @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', null, array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ Test
+
+
diff --git a/heimdall/config/www/SupportedApps/Tasmota/livestats.blade.php b/heimdall/config/www/SupportedApps/Tasmota/livestats.blade.php
new file mode 100755
index 0000000..0eb2c0d
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Tasmota/livestats.blade.php
@@ -0,0 +1,14 @@
+
+
+ Temp.
+ {!! $temperature !!}°C
+
+
+ Humid.
+ {!! $humidity !!}%
+
+
+ Dew.
+ {!! $dewpoint !!}°C
+
+
diff --git a/heimdall/config/www/SupportedApps/Tasmota/tasmota.png b/heimdall/config/www/SupportedApps/Tasmota/tasmota.png
new file mode 100755
index 0000000..49739fe
Binary files /dev/null and b/heimdall/config/www/SupportedApps/Tasmota/tasmota.png differ
diff --git a/heimdall/config/www/SupportedApps/Tautulli/Tautulli.php b/heimdall/config/www/SupportedApps/Tautulli/Tautulli.php
new file mode 100755
index 0000000..461c720
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Tautulli/Tautulli.php
@@ -0,0 +1,45 @@
+jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
+ }
+
+ public function test()
+ {
+ $test = parent::appTest($this->url('arnold'));
+ if($test->code === 200) {
+ $data = json_decode($test->response);
+ if(isset($data->error) && !empty($data->error)) {
+ $test->status = 'Failed: '.$data->error;
+ }
+ }
+
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = 'inactive';
+ $res = parent::execute($this->url('get_activity'));
+ $details = json_decode($res->getBody());
+
+ $data['stream_count'] = $details->response->data->stream_count ?? 0;
+
+ return parent::getLiveStats($status, $data);
+
+ }
+ public function url($endpoint)
+ {
+ $apikey = $this->config->apikey;
+ $api_url = parent::normaliseurl($this->config->url).'api/v2?apikey='.$apikey.'&cmd='.$endpoint;
+
+ return $api_url;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/Tautulli/app.json b/heimdall/config/www/SupportedApps/Tautulli/app.json
new file mode 100755
index 0000000..382e0e4
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Tautulli/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "93ce76191583a25ac33c1918c5ad0b8a5f260451",
+ "name": "Tautulli",
+ "website": "https://tautulli.com/",
+ "license": "GNU General Public License v3.0 only",
+ "description": "A python based web application for monitoring, analytics and notifications for Plex Media Server.",
+ "enhanced": true,
+ "tile_background": "light",
+ "icon": "tautulli.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Tautulli/config.blade.php b/heimdall/config/www/SupportedApps/Tautulli/config.blade.php
new file mode 100755
index 0000000..87755d5
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Tautulli/config.blade.php
@@ -0,0 +1,15 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', (isset($item) ? $item->getconfig()->override_url : null), array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ {{ __('app.apps.apikey') }}
+ {!! Form::text('config[apikey]', (isset($item) ? $item->getconfig()->apikey : null), array('placeholder' => __('app.apps.apikey'), 'data-config' => 'apikey', 'class' => 'form-control config-item')) !!}
+
+
+ Test
+
+
+
diff --git a/heimdall/config/www/SupportedApps/Tautulli/livestats.blade.php b/heimdall/config/www/SupportedApps/Tautulli/livestats.blade.php
new file mode 100755
index 0000000..6de9112
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Tautulli/livestats.blade.php
@@ -0,0 +1,6 @@
+
+
+ Stream Count
+ {!! $stream_count !!}
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Tautulli/tautulli.png b/heimdall/config/www/SupportedApps/Tautulli/tautulli.png
new file mode 100755
index 0000000..439704b
Binary files /dev/null and b/heimdall/config/www/SupportedApps/Tautulli/tautulli.png differ
diff --git a/heimdall/config/www/SupportedApps/Tdarr/Tdarr.php b/heimdall/config/www/SupportedApps/Tdarr/Tdarr.php
new file mode 100755
index 0000000..e4f1788
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Tdarr/Tdarr.php
@@ -0,0 +1,5 @@
+getConfigValue('username', null);
+ $password = $this->getConfigValue('password', null);
+ $ignoreTls = $this->getConfigValue('ignore_tls', false);
+
+ $isLoginNeeded =
+ !is_null($username) && !empty($username)
+ && !is_null($password) && !empty($password);
+
+ $attrs['headers'] = [ 'Accept' => 'application/json'];
+ if($isLoginNeeded) {
+ $attrs['auth'] = [ $username, $password ];
+ }
+ if($ignoreTls) {
+ $attrs['verify'] = false;
+ }
+
+ return $attrs;
+ }
+
+ public function test()
+ {
+ $attrs = $this->getRequestAttrs();
+ $test = parent::appTest($this->url('api/version'), $attrs);
+
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $apiEndpoints = collect([
+ 'httpRouters' => 'api/http/routers',
+ 'httpServices' => 'api/http/services',
+ 'tcpRouters' => 'api/tcp/routers',
+ 'tcpServices' => 'api/tcp/services'
+ ]);
+
+ $status = 'active';
+ $attrs = $this->getRequestAttrs();
+
+
+ $responses = $apiEndpoints->mapWithKeys(function ($endpoint, $key) use ($attrs) {
+ $response = parent::execute($this->url($endpoint), $attrs);
+ $body = json_decode($response->getBody());
+ $bodyCollection = collect($body);
+
+ return [ $key => [
+ 'data' => $bodyCollection->filter(function ($value, $key) { return $value->status === 'enabled'; })->count(),
+ 'total' => $bodyCollection->count(),
+ ] ];
+ });
+
+
+ $data = $this->getViewData($this->getConfigValue('fields', 'E'), $responses);
+ return parent::getLiveStats($status, $data);
+ }
+
+ public function getViewData($config, $responses)
+ {
+ $nullValue = [ 'data' => 0, 'total' => 0 ];
+
+ switch ($config) {
+ /* HTTP routers/services only */
+ case 'H':
+ return [
+ 'left' => [
+ 'title' => 'Routers',
+ 'data' => $responses->get('httpRouters', $nullValue)['data'],
+ 'total' => $responses->get('httpRouters', $nullValue)['total'],
+ ],
+ 'right' => [
+ 'title' => 'Services',
+ 'data' => $responses->get('httpServices', $nullValue)['data'],
+ 'total' => $responses->get('httpServices', $nullValue)['total'],
+ ],
+ ];
+ break;
+
+ /* TCP routers/services only */
+ case 'T':
+ return [
+ 'left' => [
+ 'title' => 'Routers',
+ 'data' => $responses->get('tcpRouters', $nullValue)['data'],
+ 'total' => $responses->get('tcpRouters', $nullValue)['total'],
+ ],
+ 'right' => [
+ 'title' => 'Services',
+ 'data' => $responses->get('tcpServices', $nullValue)['data'],
+ 'total' => $responses->get('tcpServices', $nullValue)['total'],
+ ],
+ ];
+
+ /* Routers only */
+ case 'R':
+ return [
+ 'left' => [
+ 'title' => 'HTTP',
+ 'data' => $responses->get('httpRouters', $nullValue)['data'],
+ 'total' => $responses->get('httpRouters', $nullValue)['total'],
+ ],
+ 'right' => [
+ 'title' => 'TCP',
+ 'data' => $responses->get('tcpRouters', $nullValue)['data'],
+ 'total' => $responses->get('tcpRouters', $nullValue)['total'],
+ ],
+ ];
+
+ /* Services only */
+ case 'S':
+ return [
+ 'left' => [
+ 'title' => 'HTTP',
+ 'data' => $responses->get('httpServices', $nullValue)['data'],
+ 'total' => $responses->get('httpServices', $nullValue)['total'],
+ ],
+ 'right' => [
+ 'title' => 'TCP',
+ 'data' => $responses->get('tcpServices', $nullValue)['data'],
+ 'total' => $responses->get('tcpServices', $nullValue)['total'],
+ ],
+ ];
+
+ /* Everything */
+ default:
+ return [
+ 'left' => [
+ 'title' => 'Routers',
+ 'data' => $responses->get('httpRouters', $nullValue)['data'] + $responses->get('tcpRouters', $nullValue)['data'],
+ 'total' => $responses->get('httpRouters', $nullValue)['total'] + $responses->get('tcpRouters', $nullValue)['total'],
+ ],
+ 'right' => [
+ 'title' => 'Services',
+ 'data' => $responses->get('httpServices', $nullValue)['data'] + $responses->get('tcpServices', $nullValue)['data'],
+ 'total' => $responses->get('httpServices', $nullValue)['total'] + $responses->get('tcpServices', $nullValue)['total'],
+ ],
+ ];
+ }
+ }
+
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url).$endpoint;
+ return $api_url;
+ }
+
+ public function getConfigValue($key, $default=null)
+ {
+ return (isset($this->config) && isset($this->config->$key)) ? $this->config->$key : $default;
+ }
+
+}
+
diff --git a/heimdall/config/www/SupportedApps/Traefik/app.json b/heimdall/config/www/SupportedApps/Traefik/app.json
new file mode 100755
index 0000000..beda283
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Traefik/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "a83e2ce54bbef3bef63aa7f02b08dbda7fdae4c5",
+ "name": "Traefik",
+ "website": "https://traefik.io/",
+ "license": "MIT License",
+ "description": "Træfik is a modern HTTP reverse proxy and load balancer that makes deploying microservices easy. Træfik integrates with your existing infrastructure components and configures itself automatically and dynamically.",
+ "enhanced": true,
+ "tile_background": "dark",
+ "icon": "traefik.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Traefik/config.blade.php b/heimdall/config/www/SupportedApps/Traefik/config.blade.php
new file mode 100755
index 0000000..418e31f
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Traefik/config.blade.php
@@ -0,0 +1,39 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', (isset($item) ? $item->getconfig()->override_url : null), array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ Which fields to show
+ {!! Form::select('config[fields]', [ 'E' => 'Everything', 'H' => 'HTTP only', 'T' => 'TCP only', 'R' => 'Routers', 'S' => 'Services' ],
+ (isset($item) && isset($item->getconfig()->fields) ? $item->getconfig()->fields : null), array('id' => 'fields', 'class' => 'form-control config-item')) !!}
+
+
+
+ {{ __('app.apps.username') }}
+ {!! Form::text('config[username]', (isset($item) ? $item->getconfig()->username : null), array('placeholder' => __('app.apps.username'), 'data-config' => 'username', 'class' => 'form-control config-item')) !!}
+
+
+ {{ __('app.apps.password') }}
+ {!! Form::text('config[password]', (isset($item) ? $item->getconfig()->password : null), array('placeholder' => __('app.apps.password'), 'data-config' => 'password', 'class' => 'form-control config-item')) !!}
+
+
+ Test
+
+
+
diff --git a/heimdall/config/www/SupportedApps/Traefik/livestats.blade.php b/heimdall/config/www/SupportedApps/Traefik/livestats.blade.php
new file mode 100755
index 0000000..14d781a
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Traefik/livestats.blade.php
@@ -0,0 +1,4 @@
+
+ {!! $left['title'] !!} {!! $left['data'] !!}/{!! $left['total'] !!}
+ {!! $right['title'] !!} {!! $right['data'] !!}/{!! $right['total'] !!}
+
diff --git a/heimdall/config/www/SupportedApps/Traefik/traefik.png b/heimdall/config/www/SupportedApps/Traefik/traefik.png
new file mode 100755
index 0000000..45438b3
Binary files /dev/null and b/heimdall/config/www/SupportedApps/Traefik/traefik.png differ
diff --git a/heimdall/config/www/SupportedApps/Transmission/Transmission.php b/heimdall/config/www/SupportedApps/Transmission/Transmission.php
new file mode 100755
index 0000000..f25f278
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Transmission/Transmission.php
@@ -0,0 +1,166 @@
+jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
+ $body["method"] = "torrent-get";
+ $body["arguments"] = [
+ "fields" => ["percentDone", "status", "rateDownload", "rateUpload"],
+ ];
+ $this->vars = [
+ "http_errors" => false,
+ "timeout" => 5,
+ "body" => json_encode($body),
+ ];
+ }
+
+ public function test()
+ {
+ $test = $this->sendTest();
+
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = "inactive";
+ $res = $this->sendRequest();
+ if ($res == null) {
+ //Log::debug('Transmission connection failed');
+ return "";
+ }
+
+ $details = json_decode($res->getBody());
+ if (!isset($details->arguments)) {
+ //Log::debug('Failed to fetch data from Transmission');
+ return "";
+ }
+
+ $data = [];
+
+ $torrents = $details->arguments->torrents;
+ $seeding_torrents = 0;
+ $leeching_torrents = 0;
+ $rateDownload = $rateUpload = 0;
+
+ foreach ($torrents as $thisTorrent) {
+ $rateDownload += $thisTorrent->rateDownload;
+ $rateUpload += $thisTorrent->rateUpload;
+ if ($thisTorrent->status == 6) {
+ $seeding_torrents += 1;
+ }
+ if($thisTorrent->status == 4) {
+ $leeching_torrents += 1;
+ }
+ }
+
+ if ($leeching_torrents > 0) {
+ $status = "active";
+ }
+
+ $data["download_rate"] = format_bytes(
+ $rateDownload,
+ false,
+ " ",
+ "/s "
+ );
+ $data["upload_rate"] = format_bytes(
+ $rateUpload,
+ false,
+ " ",
+ "/s "
+ );
+ $data["seed_count"] = $seeding_torrents;
+ $data["leech_count"] = $leeching_torrents;
+
+ return parent::getLiveStats($status, $data);
+ }
+
+ private function sendTest()
+ {
+ $this->setClientOptions();
+ $test = parent::appTest(
+ $this->url("transmission/rpc"),
+ $this->attrs,
+ $this->vars
+ );
+ if ($test->code === 409) {
+ $this->setClientOptions();
+ $test = parent::appTest(
+ $this->url("transmission/rpc"),
+ $this->attrs,
+ $this->vars
+ );
+ }
+ return $test;
+ }
+
+ private function sendRequest()
+ {
+ $this->setClientOptions();
+ $res = parent::execute(
+ $this->url("transmission/rpc"),
+ $this->attrs,
+ $this->vars
+ );
+ if ($res->getStatusCode() === 409) {
+ $this->setClientOptions();
+ $res = parent::execute(
+ $this->url("transmission/rpc"),
+ $this->attrs,
+ $this->vars
+ );
+ }
+ return $res;
+ }
+
+ private function setClientOptions()
+ {
+ if ($this->config->username != "" || $this->config->password != "") {
+ $this->attrs = [
+ "auth" => [
+ $this->config->username,
+ $this->config->password,
+ "Basic",
+ ],
+ ];
+ }
+ $res = parent::execute(
+ $this->url("transmission/rpc"),
+ $this->attrs,
+ $this->vars
+ );
+
+ try {
+ //print_r($res);
+ $xtId = $res->getHeaderLine("X-Transmission-Session-Id");
+ if ($xtId != null) {
+ $this->attrs["headers"] = [
+ "X-Transmission-Session-Id" => $xtId,
+ ];
+ } else {
+ //Log::error("Unable to get Transmission session information");
+ //Log::debug("Status Code: ".$res->getStatusCode());
+ }
+ } catch (\GuzzleHttp\Exception\ConnectException $e) {
+ //Log::error("Failed connection to Transmission");
+ return false;
+ }
+ return true;
+ }
+
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url) . $endpoint;
+ return $api_url;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/Transmission/app.json b/heimdall/config/www/SupportedApps/Transmission/app.json
new file mode 100755
index 0000000..dd95f8e
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Transmission/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "34899a33e3d7e33e1966b921ea250350fc71591a",
+ "name": "Transmission",
+ "website": "https://transmissionbt.com",
+ "license": "GNU General Public License v3.0 only",
+ "description": "Transmission is a BitTorrent client which features a variety of user interfaces on top of a cross-platform back-end.",
+ "enhanced": true,
+ "tile_background": "dark",
+ "icon": "transmission.svg"
+}
diff --git a/heimdall/config/www/SupportedApps/Transmission/config.blade.php b/heimdall/config/www/SupportedApps/Transmission/config.blade.php
new file mode 100755
index 0000000..981df17
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Transmission/config.blade.php
@@ -0,0 +1,19 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', isset($item) ? $item->getconfig()->override_url : null, ['placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control']) !!}
+
+
+ {{ __('app.apps.username') }}
+ {!! Form::text('config[username]', isset($item) ? $item->getconfig()->username : null, ['placeholder' => __('app.apps.username'), 'data-config' => 'username', 'class' => 'form-control config-item']) !!}
+
+
+ {{ __('app.apps.password') }}
+ {!! Form::input('password', 'config[password]', '', ['placeholder' => __('app.apps.password'), 'data-config' => 'password', 'class' => 'form-control config-item']) !!}
+
+
+ Test
+
+
diff --git a/heimdall/config/www/SupportedApps/Transmission/livestats.blade.php b/heimdall/config/www/SupportedApps/Transmission/livestats.blade.php
new file mode 100755
index 0000000..eb7413a
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Transmission/livestats.blade.php
@@ -0,0 +1,4 @@
+
+ Leech: {{ $leech_count }} {!! $download_rate !!}
+ Seed: {{ $seed_count }} {!! $upload_rate !!}
+
diff --git a/heimdall/config/www/SupportedApps/Transmission/transmission.png b/heimdall/config/www/SupportedApps/Transmission/transmission.png
new file mode 100755
index 0000000..f24d9e3
Binary files /dev/null and b/heimdall/config/www/SupportedApps/Transmission/transmission.png differ
diff --git a/heimdall/config/www/SupportedApps/Trilium/Trilium.php b/heimdall/config/www/SupportedApps/Trilium/Trilium.php
new file mode 100755
index 0000000..d2bb541
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Trilium/Trilium.php
@@ -0,0 +1,5 @@
+jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
+ }
+
+ public function test()
+ {
+ $test = parent::appTest($this->url('core/ping'), $this->attrs());
+ if($test->code === 200) {
+ $data = $test->response;
+ if($test->response != '"pong"') {
+ $test->status = 'Failed: '.$data;
+ }
+ }
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = 'inactive';
+ $data = [];
+
+ $res = parent::execute($this->url('system/info'), $this->attrs());
+ $details = json_decode($res->getBody());
+ $seconds = $details->uptime_seconds ?? 0;
+ $data['uptime'] = $this->uptime($seconds);
+
+ $res = parent::execute($this->url('alert/list'), $this->attrs());
+ $details = json_decode($res->getBody(), true);
+ $data['alert_tot'] = $this->alerts($details);
+
+ return parent::getLiveStats($status, $data);
+
+ }
+
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url).'api/v2.0/'.$endpoint;
+ return $api_url;
+ }
+
+ public function attrs()
+ {
+ $apikey = $this->config->apikey;
+ $attrs = [
+ 'headers' => ['content-type' => 'application/json', 'Authorization' => 'Bearer '.$apikey]
+ ];
+ return $attrs;
+ }
+
+ public function uptime($inputSeconds)
+ {
+ // Adapted from https://stackoverflow.com/questions/8273804/convert-seconds-into-days-hours-minutes-and-seconds
+
+ $res = '';
+ $secondsInAMinute = 60;
+ $secondsInAnHour = 60 * $secondsInAMinute;
+ $secondsInADay = 24 * $secondsInAnHour;
+
+ // extract days
+ $days = floor($inputSeconds / $secondsInADay);
+
+ // extract hours
+ $hourSeconds = $inputSeconds % $secondsInADay;
+ $hours = floor($hourSeconds / $secondsInAnHour);
+
+ // extract minutes
+ $minuteSeconds = $hourSeconds % $secondsInAnHour;
+ $minutes = floor($minuteSeconds / $secondsInAMinute);
+
+ // extract the remaining seconds
+ $remainingSeconds = $minuteSeconds % $secondsInAMinute;
+ $seconds = ceil($remainingSeconds);
+
+ //$res = strval($days).'d '.strval($hours).':'.sprintf('%02d', $minutes).':'.sprintf('%02d', $seconds);
+ if($days > 0) {
+ $res = strval($days).'d '.strval($hours).':'.sprintf('%02d', $minutes);
+ } else {
+ $res = strval($hours).':'.sprintf('%02d', $minutes).':'.sprintf('%02d', $seconds);
+ }
+ return $res;
+ }
+
+ public function alerts($alert)
+ {
+ $count = 0;
+ foreach($alert as $key => $value) {
+ if ($value["dismissed"] == false) $count += 1;
+ }
+
+ return strval($count);
+ }
+
+}
+
diff --git a/heimdall/config/www/SupportedApps/TrueNASCORE/app.json b/heimdall/config/www/SupportedApps/TrueNASCORE/app.json
new file mode 100755
index 0000000..2c9b8ff
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/TrueNASCORE/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "a1e408cd7144157cd6400993af4f68046bf77fd5",
+ "name": "TrueNAS CORE",
+ "website": "https://www.truenas.com/truenas-core/",
+ "license": "BSD 2-Clause FreeBSD License",
+ "description": "TrueNAS CORE is enterprise-quality software-defined storage that can be used without restrictions or cost. It is also the core of the full-fledged enterprise edition, TrueNAS Enterprise, which provides the additional fault-tolerance, performance, and support that businesses and critical applications require.",
+ "enhanced": true,
+ "tile_background": "dark",
+ "icon": "truenascore.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/TrueNASCORE/config.blade.php b/heimdall/config/www/SupportedApps/TrueNASCORE/config.blade.php
new file mode 100755
index 0000000..ccfc42e
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/TrueNASCORE/config.blade.php
@@ -0,0 +1,15 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', null, array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ {{ __('app.apps.apikey') }}
+ {!! Form::password('config[apikey]', array('placeholder' => __('app.apps.apikey'), 'data-config' => 'apikey', 'class' => 'form-control config-item')) !!}
+
+
+ Test
+
+
+
diff --git a/heimdall/config/www/SupportedApps/TrueNASCORE/livestats.blade.php b/heimdall/config/www/SupportedApps/TrueNASCORE/livestats.blade.php
new file mode 100755
index 0000000..262c2d6
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/TrueNASCORE/livestats.blade.php
@@ -0,0 +1,10 @@
+
+
+ Uptime
+ {!! $uptime !!}
+
+
+ Alerts
+ {!! $alert_tot !!}
+
+
diff --git a/heimdall/config/www/SupportedApps/TrueNASCORE/truenascore.png b/heimdall/config/www/SupportedApps/TrueNASCORE/truenascore.png
new file mode 100755
index 0000000..6ead508
Binary files /dev/null and b/heimdall/config/www/SupportedApps/TrueNASCORE/truenascore.png differ
diff --git a/heimdall/config/www/SupportedApps/Ubooquity/Ubooquity.php b/heimdall/config/www/SupportedApps/Ubooquity/Ubooquity.php
new file mode 100755
index 0000000..8789174
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Ubooquity/Ubooquity.php
@@ -0,0 +1,5 @@
+jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
+ }
+
+ public function test()
+ {
+ $test = parent::appTest($this->url('status'));
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = 'inactive';
+ $res = parent::execute($this->url('status'));
+ $details = json_decode($res->getBody());
+
+ $data = [];
+ return parent::getLiveStats($status, $data);
+
+ }
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url).$endpoint;
+ return $api_url;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/Unraid/app.json b/heimdall/config/www/SupportedApps/Unraid/app.json
new file mode 100755
index 0000000..c9e6f54
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Unraid/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "11b790731286c7538e27885bc827dc6f6ceb8db2",
+ "name": "Unraid",
+ "website": "https://unraid.net/",
+ "license": "Proprietary",
+ "description": "Unraid is software for storing and managing digital files on a mass-storage server. It is an embedded Network Attached Storage (NAS) server operating system.",
+ "enhanced": true,
+ "tile_background": "dark",
+ "icon": "unraid.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Unraid/config.blade.php b/heimdall/config/www/SupportedApps/Unraid/config.blade.php
new file mode 100755
index 0000000..51278e3
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Unraid/config.blade.php
@@ -0,0 +1,19 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', null, array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ {{ __('app.apps.username') }}
+ {!! Form::text('config[username]', null, array('placeholder' => __('app.apps.username'), 'data-config' => 'username', 'class' => 'form-control config-item')) !!}
+
+
+ {{ __('app.apps.password') }}
+ {!! Form::text('config[password]', null, array('placeholder' => __('app.apps.password'), 'data-config' => 'password', 'class' => 'form-control config-item')) !!}
+
+
+ Test
+
+
+
diff --git a/heimdall/config/www/SupportedApps/Unraid/livestats.blade.php b/heimdall/config/www/SupportedApps/Unraid/livestats.blade.php
new file mode 100755
index 0000000..4fa2c8b
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Unraid/livestats.blade.php
@@ -0,0 +1,10 @@
+
+
+ Queue
+ {!! $queue_size !!}
+
+
+ Speed
+ {!! $current_speed !!}
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Unraid/unraid.png b/heimdall/config/www/SupportedApps/Unraid/unraid.png
new file mode 100755
index 0000000..c9f2244
Binary files /dev/null and b/heimdall/config/www/SupportedApps/Unraid/unraid.png differ
diff --git a/heimdall/config/www/SupportedApps/UrBackup/UrBackup.php b/heimdall/config/www/SupportedApps/UrBackup/UrBackup.php
new file mode 100755
index 0000000..ca0abf7
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/UrBackup/UrBackup.php
@@ -0,0 +1,35 @@
+jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
+ }
+
+ public function test()
+ {
+ $test = parent::appTest($this->url('status'));
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = 'inactive';
+ $res = parent::execute($this->url('status'));
+ $details = json_decode($res->getBody());
+
+ $data = [];
+ return parent::getLiveStats($status, $data);
+
+ }
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url).$endpoint;
+ return $api_url;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/UrBackup/app.json b/heimdall/config/www/SupportedApps/UrBackup/app.json
new file mode 100755
index 0000000..98c5cc1
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/UrBackup/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "89f71687e2a69d7c9432b2ee76a9b638306e9fd5",
+ "name": "UrBackup",
+ "website": "https://www.urbackup.org/",
+ "license": "GNU Affero General Public License v3.0 or later",
+ "description": "UrBackup is an easy to setup Open Source client/server backup system, that through a combination of image and file backups accomplishes both data safety and a fast restoration time.\r\nFile and image backups are made while the system is running without interrupting current processes.\r\nUrBackup also continuously watches folders you want backed up in order to quickly find differences to previous backups. Because of that, incremental file backups are really fast.\r\nYour files can be restored through the web interface, via the client or the Windows Explorer while the backups of drive volumes can be restored with a bootable CD or USB-Stick (bare metal restore).",
+ "enhanced": true,
+ "tile_background": "light",
+ "icon": "urbackup.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/UrBackup/config.blade.php b/heimdall/config/www/SupportedApps/UrBackup/config.blade.php
new file mode 100755
index 0000000..51278e3
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/UrBackup/config.blade.php
@@ -0,0 +1,19 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', null, array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ {{ __('app.apps.username') }}
+ {!! Form::text('config[username]', null, array('placeholder' => __('app.apps.username'), 'data-config' => 'username', 'class' => 'form-control config-item')) !!}
+
+
+ {{ __('app.apps.password') }}
+ {!! Form::text('config[password]', null, array('placeholder' => __('app.apps.password'), 'data-config' => 'password', 'class' => 'form-control config-item')) !!}
+
+
+ Test
+
+
+
diff --git a/heimdall/config/www/SupportedApps/UrBackup/livestats.blade.php b/heimdall/config/www/SupportedApps/UrBackup/livestats.blade.php
new file mode 100755
index 0000000..4fa2c8b
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/UrBackup/livestats.blade.php
@@ -0,0 +1,10 @@
+
+
+ Queue
+ {!! $queue_size !!}
+
+
+ Speed
+ {!! $current_speed !!}
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/UrBackup/urbackup.png b/heimdall/config/www/SupportedApps/UrBackup/urbackup.png
new file mode 100755
index 0000000..ffcbf5a
Binary files /dev/null and b/heimdall/config/www/SupportedApps/UrBackup/urbackup.png differ
diff --git a/heimdall/config/www/SupportedApps/VMwareESXi/VMwareESXi.php b/heimdall/config/www/SupportedApps/VMwareESXi/VMwareESXi.php
new file mode 100755
index 0000000..fa56363
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/VMwareESXi/VMwareESXi.php
@@ -0,0 +1,35 @@
+jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
+ }
+
+ public function test()
+ {
+ $test = parent::appTest($this->url('status'));
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = 'inactive';
+ $res = parent::execute($this->url('status'));
+ $details = json_decode($res->getBody());
+
+ $data = [];
+ return parent::getLiveStats($status, $data);
+
+ }
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url).$endpoint;
+ return $api_url;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/VMwareESXi/app.json b/heimdall/config/www/SupportedApps/VMwareESXi/app.json
new file mode 100755
index 0000000..43ed2e3
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/VMwareESXi/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "39d2762d5690a6ebeb6ac1615d3ee5d58b07ab7e",
+ "name": "VMware ESXi",
+ "website": "https://www.vmware.com/products/esxi-and-esx.html",
+ "license": "Commercial",
+ "description": "VMware ESXi is an enterprise-class, type-1 hypervisor developed by VMware for deploying and serving virtual computers. As a type-1 hypervisor, ESXi is not a software application that is installed on an operating system; instead, it includes and integrates vital OS components, such as a kernel.",
+ "enhanced": false,
+ "tile_background": "dark",
+ "icon": "vmwareesxi.png"
+}
diff --git a/heimdall/config/www/SupportedApps/VMwareESXi/config.blade.php b/heimdall/config/www/SupportedApps/VMwareESXi/config.blade.php
new file mode 100755
index 0000000..51278e3
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/VMwareESXi/config.blade.php
@@ -0,0 +1,19 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', null, array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ {{ __('app.apps.username') }}
+ {!! Form::text('config[username]', null, array('placeholder' => __('app.apps.username'), 'data-config' => 'username', 'class' => 'form-control config-item')) !!}
+
+
+ {{ __('app.apps.password') }}
+ {!! Form::text('config[password]', null, array('placeholder' => __('app.apps.password'), 'data-config' => 'password', 'class' => 'form-control config-item')) !!}
+
+
+ Test
+
+
+
diff --git a/heimdall/config/www/SupportedApps/VMwareESXi/livestats.blade.php b/heimdall/config/www/SupportedApps/VMwareESXi/livestats.blade.php
new file mode 100755
index 0000000..4fa2c8b
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/VMwareESXi/livestats.blade.php
@@ -0,0 +1,10 @@
+
+
+ Queue
+ {!! $queue_size !!}
+
+
+ Speed
+ {!! $current_speed !!}
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/VMwareESXi/vmwareesxi.png b/heimdall/config/www/SupportedApps/VMwareESXi/vmwareesxi.png
new file mode 100755
index 0000000..e424995
Binary files /dev/null and b/heimdall/config/www/SupportedApps/VMwareESXi/vmwareesxi.png differ
diff --git a/heimdall/config/www/SupportedApps/VMwarevCenter/VMwarevCenter.php b/heimdall/config/www/SupportedApps/VMwarevCenter/VMwarevCenter.php
new file mode 100755
index 0000000..09ae382
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/VMwarevCenter/VMwarevCenter.php
@@ -0,0 +1,5 @@
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/heimdall/config/www/SupportedApps/Volumio/Volumio.php b/heimdall/config/www/SupportedApps/Volumio/Volumio.php
new file mode 100755
index 0000000..8cc423e
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Volumio/Volumio.php
@@ -0,0 +1,35 @@
+jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
+ }
+
+ public function test()
+ {
+ $test = parent::appTest($this->url('status'));
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $status = 'inactive';
+ $res = parent::execute($this->url('status'));
+ $details = json_decode($res->getBody());
+
+ $data = [];
+ return parent::getLiveStats($status, $data);
+
+ }
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url).$endpoint;
+ return $api_url;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/Volumio/app.json b/heimdall/config/www/SupportedApps/Volumio/app.json
new file mode 100755
index 0000000..0cf670f
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Volumio/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "90c60ebc78d163e508d41233af19bf9b31706012",
+ "name": "Volumio",
+ "website": "https://volumio.org/",
+ "license": "GNU General Public License v3.0 only",
+ "description": "Volumio is an open source audiophile music player. It is designed and fine-tuned for high-quality music playback and it runs on a variety of devices such as Raspberry PI and other microcomputers as well as PCs and Notebooks.",
+ "enhanced": true,
+ "tile_background": "light",
+ "icon": "volumio.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Volumio/config.blade.php b/heimdall/config/www/SupportedApps/Volumio/config.blade.php
new file mode 100755
index 0000000..51278e3
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Volumio/config.blade.php
@@ -0,0 +1,19 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', null, array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ {{ __('app.apps.username') }}
+ {!! Form::text('config[username]', null, array('placeholder' => __('app.apps.username'), 'data-config' => 'username', 'class' => 'form-control config-item')) !!}
+
+
+ {{ __('app.apps.password') }}
+ {!! Form::text('config[password]', null, array('placeholder' => __('app.apps.password'), 'data-config' => 'password', 'class' => 'form-control config-item')) !!}
+
+
+ Test
+
+
+
diff --git a/heimdall/config/www/SupportedApps/Volumio/livestats.blade.php b/heimdall/config/www/SupportedApps/Volumio/livestats.blade.php
new file mode 100755
index 0000000..4fa2c8b
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Volumio/livestats.blade.php
@@ -0,0 +1,10 @@
+
+
+ Queue
+ {!! $queue_size !!}
+
+
+ Speed
+ {!! $current_speed !!}
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Volumio/volumio.png b/heimdall/config/www/SupportedApps/Volumio/volumio.png
new file mode 100755
index 0000000..4710107
Binary files /dev/null and b/heimdall/config/www/SupportedApps/Volumio/volumio.png differ
diff --git a/heimdall/config/www/SupportedApps/VuPlus/VuPlus.php b/heimdall/config/www/SupportedApps/VuPlus/VuPlus.php
new file mode 100755
index 0000000..d065495
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/VuPlus/VuPlus.php
@@ -0,0 +1,37 @@
+url('api/about'));
+ echo $test->status;
+ }
+
+ public function livestats()
+ {
+ $res = parent::execute($this->url('api/about'));
+ $content = (string) $res->getBody(true);
+ $result_data = json_decode($content);
+ if(!isset($result_data) || !isset($result_data->service) ||
+ !$result_data->service->result)
+ return parent::getLiveStats("inactive", ["channel" => "Standby"]);
+
+ $data = [
+ "channel" => $result_data->service->name,
+ ];
+ return parent::getLiveStats("active", $data);
+ }
+
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url).$endpoint;
+ return $api_url;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/VuPlus/app.json b/heimdall/config/www/SupportedApps/VuPlus/app.json
new file mode 100755
index 0000000..4d07a81
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/VuPlus/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "095afe286edc44dd8241e7a33138bc6d",
+ "name": "VuPlus",
+ "website": "http://vuplus.com",
+ "license": "commercial",
+ "description": "The Vu+ (pronounced VuPlus), is a series of Linux-powered DVB satellite, terrestrial digital television receivers (set-top box)",
+ "enhanced": true,
+ "tile_background": "light",
+ "icon": "vuplus.png"
+}
diff --git a/heimdall/config/www/SupportedApps/VuPlus/config.blade.php b/heimdall/config/www/SupportedApps/VuPlus/config.blade.php
new file mode 100755
index 0000000..ad5aca9
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/VuPlus/config.blade.php
@@ -0,0 +1,11 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', (isset($item) && isset($item->getconfig()->override_url) ? $item->getconfig()->override_url : null), array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ Test
+
+
+
diff --git a/heimdall/config/www/SupportedApps/VuPlus/livestats.blade.php b/heimdall/config/www/SupportedApps/VuPlus/livestats.blade.php
new file mode 100755
index 0000000..0d48cf4
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/VuPlus/livestats.blade.php
@@ -0,0 +1,6 @@
+
+
+ Channel
+ {!! $channel !!}
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/VuPlus/vuplus.png b/heimdall/config/www/SupportedApps/VuPlus/vuplus.png
new file mode 100755
index 0000000..0a9906a
Binary files /dev/null and b/heimdall/config/www/SupportedApps/VuPlus/vuplus.png differ
diff --git a/heimdall/config/www/SupportedApps/Wallabag/Wallabag.php b/heimdall/config/www/SupportedApps/Wallabag/Wallabag.php
new file mode 100755
index 0000000..9a81a11
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Wallabag/Wallabag.php
@@ -0,0 +1,5 @@
+jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
+ }
+
+ /**
+ * Try to obtain user information to test login
+ */
+ public function login()
+ {
+ $api_token = $this->config->username;
+ $attrs = [
+ 'headers' => ['Authorization' => 'Bearer '.$api_token]
+ ];
+ return parent::execute($this->url('user'), $attrs, false, 'GET');
+ }
+
+ /**
+ * "Login" the user and return the username
+ */
+ public function test()
+ {
+ $test = $this->login();
+ if($test->getStatusCode() === 200 && $test->getBody()) {
+ $wk_resp = json_decode($test->getBody());
+ echo "Hello ".$wk_resp->data->username;
+ } else {
+ echo "Failed";
+ }
+ }
+
+ /**
+ * Obtain the user summary and return the total of Reviews and Lessons
+ */
+ public function livestats()
+ {
+ $status = 'inactive';
+ $now = \Carbon\Carbon::now();
+ $api_token = $this->config->username;
+ $attrs = [
+ 'headers' => ['Authorization' => 'Bearer '.$api_token]
+ ];
+ $res = parent::execute($this->url('summary'), $attrs, false, 'GET');
+ $details = json_decode($res->getBody());
+ $data = [ "lessons" => 0, "reviews" => 0 ];
+ foreach($details->data->lessons as $lesson)
+ {
+ $available_at = \Carbon\Carbon::createFromTimeString($lesson->available_at);
+ if($now >= $available_at)
+ {
+ $data["lessons"] += count($lesson->subject_ids);
+ }
+ }
+ foreach($details->data->reviews as $review)
+ {
+ $available_at = \Carbon\Carbon::createFromTimeString($review->available_at);
+ if($now >= $available_at)
+ {
+ $data["reviews"] += count($review->subject_ids);
+ }
+ }
+
+ return parent::getLiveStats($status, $data);
+
+ }
+
+ /**
+ * Build api url
+ */
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl('https://api.wanikani.com/v2/').$endpoint;
+ return $api_url;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/WaniKani/app.json b/heimdall/config/www/SupportedApps/WaniKani/app.json
new file mode 100755
index 0000000..3d93b77
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/WaniKani/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "dc115cfaac280c4b97289484356c21428af565be",
+ "name": "WaniKani",
+ "website": "https://www.wanikani.com/",
+ "license": "Proprietary",
+ "description": "WaniKani is a Japanese radicals, kanji, and vocabulary learning web app that uses mnemonics and SRS to make kanji learning simple.",
+ "enhanced": true,
+ "tile_background": "light",
+ "icon": "wanikani.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/WaniKani/config.blade.php b/heimdall/config/www/SupportedApps/WaniKani/config.blade.php
new file mode 100755
index 0000000..2cfe93c
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/WaniKani/config.blade.php
@@ -0,0 +1,13 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+ {!! Form::hidden('config[override_url]') !!}
+ {!! Form::hidden('config[password]') !!}
+
+ {{ __('app.apps.api_token') }}
+ {!! Form::text('config[username]', (isset($item) ? $item->getconfig()->username : null), array('placeholder' => __('app.apps.username'), 'data-config' => 'username', 'class' => 'form-control config-item')) !!}
+
+
+ Test
+
+
+
diff --git a/heimdall/config/www/SupportedApps/WaniKani/livestats.blade.php b/heimdall/config/www/SupportedApps/WaniKani/livestats.blade.php
new file mode 100755
index 0000000..d7bd78a
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/WaniKani/livestats.blade.php
@@ -0,0 +1,10 @@
+
+
+ Lessons
+ {!! $lessons !!}
+
+
+ Reviews
+ {!! $reviews !!}
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/WaniKani/wanikani.png b/heimdall/config/www/SupportedApps/WaniKani/wanikani.png
new file mode 100755
index 0000000..46f6c13
Binary files /dev/null and b/heimdall/config/www/SupportedApps/WaniKani/wanikani.png differ
diff --git a/heimdall/config/www/SupportedApps/WatchYourLAN/WatchYourLAN.php b/heimdall/config/www/SupportedApps/WatchYourLAN/WatchYourLAN.php
new file mode 100755
index 0000000..b1a16ba
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/WatchYourLAN/WatchYourLAN.php
@@ -0,0 +1,5 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', null, array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ {{ __('app.apps.username') }}
+ {!! Form::text('config[username]', null, array('placeholder' => __('app.apps.username'), 'data-config' => 'username', 'class' => 'form-control config-item')) !!}
+
+
+ {{ __('app.apps.password') }}
+ {!! Form::text('config[password]', null, array('placeholder' => __('app.apps.password'), 'data-config' => 'password', 'class' => 'form-control config-item')) !!}
+
+
+ Test
+
+
+
diff --git a/heimdall/config/www/SupportedApps/Webmin/livestats.blade.php b/heimdall/config/www/SupportedApps/Webmin/livestats.blade.php
new file mode 100755
index 0000000..4fa2c8b
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Webmin/livestats.blade.php
@@ -0,0 +1,10 @@
+
+
+ Queue
+ {!! $queue_size !!}
+
+
+ Speed
+ {!! $current_speed !!}
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/Webmin/webmin.svg b/heimdall/config/www/SupportedApps/Webmin/webmin.svg
new file mode 100755
index 0000000..08dfc4e
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Webmin/webmin.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/heimdall/config/www/SupportedApps/Wekan/Wekan.php b/heimdall/config/www/SupportedApps/Wekan/Wekan.php
new file mode 100755
index 0000000..77c4331
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/Wekan/Wekan.php
@@ -0,0 +1,5 @@
+
+
+
+ logo
+ Created with Sketch.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/ZoneMinder/ZoneMinder.php b/heimdall/config/www/SupportedApps/ZoneMinder/ZoneMinder.php
new file mode 100755
index 0000000..212c5bb
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/ZoneMinder/ZoneMinder.php
@@ -0,0 +1,5 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', null, array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ {{ __('app.apps.username') }}
+ {!! Form::text('config[username]', null, array('placeholder' => __('app.apps.username'), 'data-config' => 'username', 'class' => 'form-control config-item')) !!}
+
+
+ {{ __('app.apps.password') }}
+ {!! Form::password('config[password]', array('placeholder' => __('app.apps.password'), 'data-config' => 'password', 'class' => 'form-control config-item')) !!}
+
+
+ Stats to show
+ {!! Form::select('config[availablestats][]', App\SupportedApps\openmediavault\openmediavault::getAvailableStats(), isset($item) ? ($item->getConfig()->availablestats ?? null) : null, array('multiple'=>'multiple')) !!}
+
+
+ Test
+
+
diff --git a/heimdall/config/www/SupportedApps/openmediavault/livestats.blade.php b/heimdall/config/www/SupportedApps/openmediavault/livestats.blade.php
new file mode 100755
index 0000000..53ac67b
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/openmediavault/livestats.blade.php
@@ -0,0 +1,8 @@
+
+ @foreach ($visiblestats as $stat)
+
+ {!! $stat->title !!}
+ {!! $stat->value !!}
+
+ @endforeach
+
diff --git a/heimdall/config/www/SupportedApps/openmediavault/openmediavault.php b/heimdall/config/www/SupportedApps/openmediavault/openmediavault.php
new file mode 100755
index 0000000..257c74d
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/openmediavault/openmediavault.php
@@ -0,0 +1,100 @@
+cookie = new \GuzzleHttp\Cookie\CookieJar;
+ }
+
+ public function url($endpoint) {
+ $api_url = parent::normaliseurl($this->config->url) . 'rpc.php';
+ return $api_url;
+ }
+
+ private function request($service, $method, $params = []) {
+ $attrs = [
+ 'json' => [
+ 'service' => $service,
+ 'method' => $method,
+ 'params' => $params,
+ ],
+ 'cookies' => $this->cookie,
+ ];
+
+ // @see \App\SupportedApps\execute($url, $attrs = [], $overridevars=false, $overridemethod=false)
+ $result = parent::execute($this->url(false), $attrs, false, 'POST');
+ if (null === $result) {
+ throw new Exception("OMV error: Could not connect");
+ }
+
+ $response = json_decode($result->getBody());
+
+ if (is_null($response->response) && isset($response->error->message)) {
+ throw new Exception(sprintf('OMV error: %s', $response->error->message));
+ }
+ elseif (is_null($response->response)) {
+ throw new Exception('OMV error: Empty response');
+ }
+ return $response->response;
+ }
+
+ private function auth() {
+ $result = $this->request('session', 'login', ['username' => $this->config->username, 'password' => $this->config->password]);
+ return $result->authenticated;
+ }
+
+ public function test() {
+ try {
+ $token = $this->auth();
+ echo "Successfully communicated with the API";
+ } catch (Exception $err) {
+ echo $err->getMessage();
+ }
+ }
+
+ private function symbol($bool) {
+ return (true === $bool ? '✓' : '✗');
+ }
+
+ public function livestats() {
+ $status = 'inactive';
+ $token = $this->auth();
+ $data = ['visiblestats' => []];
+
+ $info = $this->request('system', 'getInformation');
+ $data['CPU'] = sprintf('%.1f%%', $info->cpuUsage );
+ $data['RAM'] = sprintf('%.1f%%', $info->memUsed / $info->memTotal * 100 );
+
+ $services = $this->request('services', 'getStatus');
+ foreach ($services->data as $service) {
+ $k = explode(' ', $service->title)[0];
+ $data[$k] = sprintf('%s | %s', $this->symbol($service->enabled), $this->symbol($service->running));
+ }
+
+ foreach ($this->config->availablestats as $stat) {
+ $newstat = new \stdClass;
+ $newstat->title = self::getAvailableStats()[$stat];
+ $newstat->value = $data[$stat];
+ $data['visiblestats'][] = $newstat;
+ }
+ $status = 'active';
+ return parent::getLiveStats($status, $data);
+ }
+
+ public static function getAvailableStats() {
+ return [
+ 'CPU' => 'CPU',
+ 'RAM' => 'RAM',
+ 'NFS' => 'NFS',
+ 'FTP' => 'FTP',
+ 'RSync' => 'RSync',
+ 'SMB/CIFS' => 'SMB/CIFS',
+ 'SSH' => 'SSH',
+ ];
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/openmediavault/openmediavault.png b/heimdall/config/www/SupportedApps/openmediavault/openmediavault.png
new file mode 100755
index 0000000..29fa840
Binary files /dev/null and b/heimdall/config/www/SupportedApps/openmediavault/openmediavault.png differ
diff --git a/heimdall/config/www/SupportedApps/osTicket/app.json b/heimdall/config/www/SupportedApps/osTicket/app.json
new file mode 100755
index 0000000..c2f0f67
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/osTicket/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "727706dbdf86b593f7be63c2fcca20718fd8caca",
+ "name": "osTicket",
+ "website": "osticket.com",
+ "license": "GNU General Public License v2.0 only",
+ "description": "osTicket is a widely-used open source support ticket system.",
+ "enhanced": false,
+ "tile_background": "dark",
+ "icon": "osticket.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/osTicket/osTicket.php b/heimdall/config/www/SupportedApps/osTicket/osTicket.php
new file mode 100755
index 0000000..882653e
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/osTicket/osTicket.php
@@ -0,0 +1,5 @@
+
+
+pfSense Logo
+
+
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/pgAdmin/app.json b/heimdall/config/www/SupportedApps/pgAdmin/app.json
new file mode 100755
index 0000000..96acc6f
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/pgAdmin/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "43784e464f66bfc0254a3bad48939f14a70c878e",
+ "name": "pgAdmin",
+ "website": "https://www.pgadmin.org/",
+ "license": "PostgreSQL License",
+ "description": "pgAdmin is a feature rich open-source administration and development platform for PostgreSQL.",
+ "enhanced": false,
+ "tile_background": "dark",
+ "icon": "pgadmin.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/pgAdmin/pgAdmin.php b/heimdall/config/www/SupportedApps/pgAdmin/pgAdmin.php
new file mode 100755
index 0000000..64ef461
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/pgAdmin/pgAdmin.php
@@ -0,0 +1,5 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', null, array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ {{ __('app.apps.username') }}
+ {!! Form::text('config[username]', (isset($item) ? $item->getconfig()->username : null), array('placeholder' => __('app.apps.username'), 'data-config' => 'username', 'class' => 'form-control config-item')) !!}
+
+
+ {{ __('app.apps.password') }}
+ {!! Form::input('password', 'config[password]', (isset($item) ? $item->getconfig()->password : null), array('placeholder' => __('app.apps.password'), 'data-config' => 'password', 'class' => 'form-control config-item')) !!}
+
+
+ Test
+
+
+
diff --git a/heimdall/config/www/SupportedApps/qBittorrent/livestats.blade.php b/heimdall/config/www/SupportedApps/qBittorrent/livestats.blade.php
new file mode 100755
index 0000000..5e32adf
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/qBittorrent/livestats.blade.php
@@ -0,0 +1,4 @@
+
+ Leech: {{ $leech_count }} {!! $download_rate !!}
+ Seed: {{ $seed_count }} {!! $upload_rate !!}
+
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/qBittorrent/qBittorrent.php b/heimdall/config/www/SupportedApps/qBittorrent/qBittorrent.php
new file mode 100755
index 0000000..0cdee39
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/qBittorrent/qBittorrent.php
@@ -0,0 +1,87 @@
+jar = new \GuzzleHttp\Cookie\CookieJar; // Uncomment if cookies need to be set
+ }
+
+ public function test()
+ {
+ $test = $this->login();
+ if($test->getStatusCode() === 200) {
+ echo $test->getStatusCode();
+ }
+ #$test = parent::appTest($this->url('version/api'));
+ $test = parent::appTest($this->url('api/v2/app/version'));
+ echo $test->status;
+ }
+
+ public function login()
+ {
+ $username = urlencode($this->config->username);
+ $password = urlencode($this->config->password);
+ $attrs = [
+ 'body' => 'username='.$username.'&password='.$password,
+ 'cookies' => $this->jar,
+ 'headers' => ['content-type' => 'application/x-www-form-urlencoded']
+ ];
+ #return parent::execute($this->url('login'), $attrs, false, 'POST');
+ return parent::execute($this->url('api/v2/auth/login'), $attrs, false, 'POST');
+ }
+
+ public function livestats()
+ {
+ $status = 'inactive';
+ $this->login();
+ $attrs = [
+ 'cookies' => $this->jar
+ ];
+ #$res = parent::execute($this->url('query/torrents'), $attrs);
+ $res = parent::execute($this->url('api/v2/torrents/info'), $attrs);
+ $details = json_decode($res->getBody());
+
+ $data = [];
+
+
+ $torrents = $details;
+ $torrentCount = count($torrents);
+ $rateDownload = $rateUpload = $completedTorrents = 0;
+ foreach ($torrents as $thisTorrent) {
+ $rateDownload += $thisTorrent->dlspeed;
+ $rateUpload += $thisTorrent->upspeed;
+ if ($thisTorrent->progress == 1) {
+ $completedTorrents += 1;
+ }
+ }
+ $leech = $torrentCount - $completedTorrents;
+ if ($leech > 0) {
+ $status = 'active';
+ }
+
+ $data['download_rate'] = format_bytes($rateDownload, false, ' ', '/s ');
+ $data['upload_rate'] = format_bytes($rateUpload, false, ' ', '/s ');
+ $data['seed_count'] = $completedTorrents ?? 0;
+ $data['leech_count'] = $leech ?? 0;
+
+
+
+
+ return parent::getLiveStats($status, $data);
+
+ }
+ public function url($endpoint)
+ {
+ $api_url = parent::normaliseurl($this->config->url).$endpoint;
+ return $api_url;
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/qBittorrent/qbittorrent.png b/heimdall/config/www/SupportedApps/qBittorrent/qbittorrent.png
new file mode 100755
index 0000000..d85cb60
Binary files /dev/null and b/heimdall/config/www/SupportedApps/qBittorrent/qbittorrent.png differ
diff --git a/heimdall/config/www/SupportedApps/ruTorrent/app.json b/heimdall/config/www/SupportedApps/ruTorrent/app.json
new file mode 100755
index 0000000..c5f9dbf
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/ruTorrent/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "fbf13ee99afeadddc4f73e1183fd1b52774b3474",
+ "name": "ruTorrent",
+ "website": "https://github.com/Novik/ruTorrent",
+ "license": "GNU General Public License v3.0 or later",
+ "description": "ruTorrent is a front-end for the popular Bittorrent client rtorrent.",
+ "enhanced": true,
+ "tile_background": "dark",
+ "icon": "rutorrent.png"
+}
diff --git a/heimdall/config/www/SupportedApps/ruTorrent/config.blade.php b/heimdall/config/www/SupportedApps/ruTorrent/config.blade.php
new file mode 100755
index 0000000..70f05dd
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/ruTorrent/config.blade.php
@@ -0,0 +1,18 @@
+{{ __('app.apps.config') }} ({{ __('app.optional') }}) @include('items.enable')
+
+
+ {{ strtoupper(__('app.url')) }}
+ {!! Form::text('config[override_url]', (isset($item) && isset($item->getconfig()->override_url) ? $item->getconfig()->override_url : null), array('placeholder' => __('app.apps.override'), 'id' => 'override_url', 'class' => 'form-control')) !!}
+
+
+ {{ __('app.apps.username') }}
+ {!! Form::text('config[username]', (isset($item) && isset($item->getconfig()->username) ? $item->getconfig()->username : null), array('placeholder' => __('app.apps.username'), 'data-config' => 'username', 'class' => 'form-control config-item')) !!}
+
+
+ {{ __('app.apps.password') }}
+ {!! Form::input('password', 'config[password]', (isset($item) && isset($item->getconfig()->password) ? $item->getconfig()->password : null), array('placeholder' => __('app.apps.password'), 'data-config' => 'password', 'class' => 'form-control config-item')) !!}
+
+
+ Test
+
+
diff --git a/heimdall/config/www/SupportedApps/ruTorrent/livestats.blade.php b/heimdall/config/www/SupportedApps/ruTorrent/livestats.blade.php
new file mode 100755
index 0000000..3a493c1
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/ruTorrent/livestats.blade.php
@@ -0,0 +1,14 @@
+
+ @if($down_rate != "0 B/s")
+
+ DOWN ↓
+ {!! $down_rate !!}
+
+ @endif
+ @if($up_rate != "0 B/s")
+
+ UP ↑
+ {!! $up_rate !!}
+
+ @endif
+
diff --git a/heimdall/config/www/SupportedApps/ruTorrent/ruTorrent.php b/heimdall/config/www/SupportedApps/ruTorrent/ruTorrent.php
new file mode 100755
index 0000000..d051689
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/ruTorrent/ruTorrent.php
@@ -0,0 +1,88 @@
+getXMLRPCData('throttle.global_down.rate');
+ if( !isset($data) || $data == 'Err' || $data == null || !is_object($data))
+ {
+ echo 'There is an issue connecting to "' . $this->url('RPC2') . '". Please respect URL format "http(s)://IP:PORT". ' . $data;
+ }
+ else
+ {
+ echo 'Connection successful!';
+ }
+ }
+
+ public function livestats()
+ {
+ $status = 'inactive';
+
+ $data = [];
+ $data['down_rate'] = $this->formatBytes((float)$this->getXMLRPCData('throttle.global_down.rate')->params->param->value->i8, 1);
+
+ $data['up_rate'] = $this->formatBytes((float)$this->getXMLRPCData('throttle.global_up.rate')->params->param->value->i8, 1);
+
+ return parent::getLiveStats($status, $data);
+ }
+
+ public function url($endpoint)
+ {
+ return parent::normaliseurl($this->config->url).$endpoint;
+ }
+
+ public function getXMLRPCData($method)
+ {
+ $value='';
+
+ $body = ''.$method.' ';
+
+ $this->vars = ['http_errors' => false, 'timeout' => 5, 'body' => $body];
+ $this->attrs = [];
+ $this->attrs['headers'] = ['Content-Type' => 'text/xml'];
+
+ if( isset($this->config->username) && isset($this->config->password) ) {
+ $this->attrs['headers']['Authorization'] = 'Basic ' . base64_encode($this->config->username . ":" . $this->config->password);
+ }
+
+ try{
+ $res = parent::execute($this->url('RPC2'), $this->attrs, $this->vars);
+ } catch(\GuzzleHttp\Exception\RequestException $e){
+ return ''; // Connection failed, display default response
+ }
+
+ if (function_exists('simplexml_load_string')) {
+ try {
+ $value = simplexml_load_string($res->getBody()->getContents());
+ } catch(\ErrorException $e) {
+ $value = 'Unexpected response. Are credentials correct?';
+ }
+ } else {
+ $value = 'simplexml_load_string doesn\'t exist.';
+ }
+
+ return $value;
+ }
+
+ public function formatBytes($bytes, $precision = 2)
+ {
+ $units = array('B', 'KB', 'MB', 'GB', 'TB');
+
+ $bytes = max($bytes, 0);
+ $pow = floor(($bytes ? log($bytes) : 0) / log(1024));
+ $pow = min($pow, count($units) - 1);
+
+ $bytes /= pow(1024, $pow);
+
+ return round($bytes, $precision) . ' ' . $units[$pow] . '/s';
+ }
+}
diff --git a/heimdall/config/www/SupportedApps/ruTorrent/rutorrent.png b/heimdall/config/www/SupportedApps/ruTorrent/rutorrent.png
new file mode 100755
index 0000000..0b52230
Binary files /dev/null and b/heimdall/config/www/SupportedApps/ruTorrent/rutorrent.png differ
diff --git a/heimdall/config/www/SupportedApps/vmwarehorizon/app.json b/heimdall/config/www/SupportedApps/vmwarehorizon/app.json
new file mode 100755
index 0000000..dfef787
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/vmwarehorizon/app.json
@@ -0,0 +1,10 @@
+{
+ "appid": "b63d3ad41413da4056fbae6dc0ebc190668b3545",
+ "name": "vmware horizon",
+ "website": "https://www.vmware.com/products/horizon.html",
+ "license": "Commercial",
+ "description": "desktop and app virtualization.",
+ "enhanced": false,
+ "tile_background": "dark",
+ "icon": "vmwarehorizon.png"
+}
\ No newline at end of file
diff --git a/heimdall/config/www/SupportedApps/vmwarehorizon/vmwarehorizon.php b/heimdall/config/www/SupportedApps/vmwarehorizon/vmwarehorizon.php
new file mode 100755
index 0000000..4ee4ce9
--- /dev/null
+++ b/heimdall/config/www/SupportedApps/vmwarehorizon/vmwarehorizon.php
@@ -0,0 +1,5 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/icons/4de55d8e7b833107fc05f166432016f3.svg b/heimdall/config/www/icons/4de55d8e7b833107fc05f166432016f3.svg
new file mode 100755
index 0000000..1788601
--- /dev/null
+++ b/heimdall/config/www/icons/4de55d8e7b833107fc05f166432016f3.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/icons/61dbb91c67a2660294d186d31e6a09dd.png b/heimdall/config/www/icons/61dbb91c67a2660294d186d31e6a09dd.png
new file mode 100755
index 0000000..029df08
Binary files /dev/null and b/heimdall/config/www/icons/61dbb91c67a2660294d186d31e6a09dd.png differ
diff --git a/heimdall/config/www/icons/655165efde01962dad7fb2db164088ff.png b/heimdall/config/www/icons/655165efde01962dad7fb2db164088ff.png
new file mode 100755
index 0000000..3d2568a
Binary files /dev/null and b/heimdall/config/www/icons/655165efde01962dad7fb2db164088ff.png differ
diff --git a/heimdall/config/www/icons/72cf44121e095a05aacb378a4f1ec61b.svg b/heimdall/config/www/icons/72cf44121e095a05aacb378a4f1ec61b.svg
new file mode 100755
index 0000000..b791805
--- /dev/null
+++ b/heimdall/config/www/icons/72cf44121e095a05aacb378a4f1ec61b.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/heimdall/config/www/icons/73da7989a23ce9a4be565ec65658a239.png b/heimdall/config/www/icons/73da7989a23ce9a4be565ec65658a239.png
new file mode 100755
index 0000000..fc553bc
Binary files /dev/null and b/heimdall/config/www/icons/73da7989a23ce9a4be565ec65658a239.png differ
diff --git a/heimdall/config/www/icons/77392211578da5bed658ad18d2f29645.png b/heimdall/config/www/icons/77392211578da5bed658ad18d2f29645.png
new file mode 100755
index 0000000..c884c23
Binary files /dev/null and b/heimdall/config/www/icons/77392211578da5bed658ad18d2f29645.png differ
diff --git a/heimdall/config/www/icons/7F1Hajs3kjDohtu7NICPDQQvOXEueCGyaQeHJb93.svg b/heimdall/config/www/icons/7F1Hajs3kjDohtu7NICPDQQvOXEueCGyaQeHJb93.svg
new file mode 100755
index 0000000..ce565eb
--- /dev/null
+++ b/heimdall/config/www/icons/7F1Hajs3kjDohtu7NICPDQQvOXEueCGyaQeHJb93.svg
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PACKAGE
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/heimdall/config/www/icons/84faa4c470efe81d6923622b009c7386.png b/heimdall/config/www/icons/84faa4c470efe81d6923622b009c7386.png
new file mode 100755
index 0000000..304be8c
Binary files /dev/null and b/heimdall/config/www/icons/84faa4c470efe81d6923622b009c7386.png differ
diff --git a/heimdall/config/www/icons/9HqXmcpk7MJZv0Fgv0vMzt60Wk6UDONYxWTOSbKL.png b/heimdall/config/www/icons/9HqXmcpk7MJZv0Fgv0vMzt60Wk6UDONYxWTOSbKL.png
new file mode 100755
index 0000000..d662e9b
Binary files /dev/null and b/heimdall/config/www/icons/9HqXmcpk7MJZv0Fgv0vMzt60Wk6UDONYxWTOSbKL.png differ
diff --git a/heimdall/config/www/icons/9bfA88VBv0kiCM27zbsWULTDhoD0NM16oAh8GRrM.png b/heimdall/config/www/icons/9bfA88VBv0kiCM27zbsWULTDhoD0NM16oAh8GRrM.png
new file mode 100755
index 0000000..69cfcd9
Binary files /dev/null and b/heimdall/config/www/icons/9bfA88VBv0kiCM27zbsWULTDhoD0NM16oAh8GRrM.png differ
diff --git a/heimdall/config/www/icons/BL4fT57BG0Bdj4AQtpw8sx0ZR1cmSUvAaThAqrpG.png b/heimdall/config/www/icons/BL4fT57BG0Bdj4AQtpw8sx0ZR1cmSUvAaThAqrpG.png
new file mode 100755
index 0000000..0221ca9
Binary files /dev/null and b/heimdall/config/www/icons/BL4fT57BG0Bdj4AQtpw8sx0ZR1cmSUvAaThAqrpG.png differ
diff --git a/heimdall/config/www/icons/BvwMxG5AMToZpIXIuJYsSb5I5YlTYRKUYn0CfBSx.png b/heimdall/config/www/icons/BvwMxG5AMToZpIXIuJYsSb5I5YlTYRKUYn0CfBSx.png
new file mode 100755
index 0000000..8b716f6
Binary files /dev/null and b/heimdall/config/www/icons/BvwMxG5AMToZpIXIuJYsSb5I5YlTYRKUYn0CfBSx.png differ
diff --git a/heimdall/config/www/icons/CnNVRZqnJpIWeuKNxBeokZwhQWbfsPhXWvdFeTlM.png b/heimdall/config/www/icons/CnNVRZqnJpIWeuKNxBeokZwhQWbfsPhXWvdFeTlM.png
new file mode 100755
index 0000000..92288c7
Binary files /dev/null and b/heimdall/config/www/icons/CnNVRZqnJpIWeuKNxBeokZwhQWbfsPhXWvdFeTlM.png differ
diff --git a/heimdall/config/www/icons/D9mNssxE27Tf3tsl9oMiHdzjjC4wbdOf7ee8sXvv.jpeg b/heimdall/config/www/icons/D9mNssxE27Tf3tsl9oMiHdzjjC4wbdOf7ee8sXvv.jpeg
new file mode 100755
index 0000000..0f01023
Binary files /dev/null and b/heimdall/config/www/icons/D9mNssxE27Tf3tsl9oMiHdzjjC4wbdOf7ee8sXvv.jpeg differ
diff --git a/heimdall/config/www/icons/Mvihcn5rn0IXFzMnoGowqysLm7gzWvsK07Bf7WVm.png b/heimdall/config/www/icons/Mvihcn5rn0IXFzMnoGowqysLm7gzWvsK07Bf7WVm.png
new file mode 100755
index 0000000..61bdf99
Binary files /dev/null and b/heimdall/config/www/icons/Mvihcn5rn0IXFzMnoGowqysLm7gzWvsK07Bf7WVm.png differ
diff --git a/heimdall/config/www/icons/T7C0oBD8WZxUZjfpUadfn5Icz8kvRUtP7bqQH0tw.png b/heimdall/config/www/icons/T7C0oBD8WZxUZjfpUadfn5Icz8kvRUtP7bqQH0tw.png
new file mode 100755
index 0000000..6b07c7d
Binary files /dev/null and b/heimdall/config/www/icons/T7C0oBD8WZxUZjfpUadfn5Icz8kvRUtP7bqQH0tw.png differ
diff --git a/heimdall/config/www/icons/TpbQSVdWzZYEBXVQbeDEorcYVfQiTJuveQYgEOa6.png b/heimdall/config/www/icons/TpbQSVdWzZYEBXVQbeDEorcYVfQiTJuveQYgEOa6.png
new file mode 100755
index 0000000..a7cf45a
Binary files /dev/null and b/heimdall/config/www/icons/TpbQSVdWzZYEBXVQbeDEorcYVfQiTJuveQYgEOa6.png differ
diff --git a/heimdall/config/www/icons/Ug2uDvFRgWdzAyBAv1sYQ4ng0G9O22bTXKp5bZBe.png b/heimdall/config/www/icons/Ug2uDvFRgWdzAyBAv1sYQ4ng0G9O22bTXKp5bZBe.png
new file mode 100755
index 0000000..69cfcd9
Binary files /dev/null and b/heimdall/config/www/icons/Ug2uDvFRgWdzAyBAv1sYQ4ng0G9O22bTXKp5bZBe.png differ
diff --git a/heimdall/config/www/icons/ZBpDCewkSQaZ5xm0J2i0iAjs62TPLQR54Vhuhbrd.png b/heimdall/config/www/icons/ZBpDCewkSQaZ5xm0J2i0iAjs62TPLQR54Vhuhbrd.png
new file mode 100755
index 0000000..f672c44
Binary files /dev/null and b/heimdall/config/www/icons/ZBpDCewkSQaZ5xm0J2i0iAjs62TPLQR54Vhuhbrd.png differ
diff --git a/heimdall/config/www/icons/adguardhome.png b/heimdall/config/www/icons/adguardhome.png
new file mode 100755
index 0000000..ff33d08
Binary files /dev/null and b/heimdall/config/www/icons/adguardhome.png differ
diff --git a/heimdall/config/www/icons/adminer.png b/heimdall/config/www/icons/adminer.png
new file mode 100755
index 0000000..4699321
Binary files /dev/null and b/heimdall/config/www/icons/adminer.png differ
diff --git a/heimdall/config/www/icons/adminer.svg b/heimdall/config/www/icons/adminer.svg
new file mode 100755
index 0000000..c5892a0
--- /dev/null
+++ b/heimdall/config/www/icons/adminer.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/heimdall/config/www/icons/airsonic.png b/heimdall/config/www/icons/airsonic.png
new file mode 100755
index 0000000..da81e27
Binary files /dev/null and b/heimdall/config/www/icons/airsonic.png differ
diff --git a/heimdall/config/www/icons/alarmpi.png b/heimdall/config/www/icons/alarmpi.png
new file mode 100755
index 0000000..d34d857
Binary files /dev/null and b/heimdall/config/www/icons/alarmpi.png differ
diff --git a/heimdall/config/www/icons/alertmanager.png b/heimdall/config/www/icons/alertmanager.png
new file mode 100755
index 0000000..a3a9601
Binary files /dev/null and b/heimdall/config/www/icons/alertmanager.png differ
diff --git a/heimdall/config/www/icons/amp.png b/heimdall/config/www/icons/amp.png
new file mode 100755
index 0000000..ff93038
Binary files /dev/null and b/heimdall/config/www/icons/amp.png differ
diff --git a/heimdall/config/www/icons/archisteamfarm.png b/heimdall/config/www/icons/archisteamfarm.png
new file mode 100755
index 0000000..810ba16
Binary files /dev/null and b/heimdall/config/www/icons/archisteamfarm.png differ
diff --git a/heimdall/config/www/icons/archivebox.png b/heimdall/config/www/icons/archivebox.png
new file mode 100755
index 0000000..290fc3a
Binary files /dev/null and b/heimdall/config/www/icons/archivebox.png differ
diff --git a/heimdall/config/www/icons/archiveteamwarrior.png b/heimdall/config/www/icons/archiveteamwarrior.png
new file mode 100755
index 0000000..4e81ea1
Binary files /dev/null and b/heimdall/config/www/icons/archiveteamwarrior.png differ
diff --git a/heimdall/config/www/icons/ariang.png b/heimdall/config/www/icons/ariang.png
new file mode 100755
index 0000000..3bf663f
Binary files /dev/null and b/heimdall/config/www/icons/ariang.png differ
diff --git a/heimdall/config/www/icons/artifactory.png b/heimdall/config/www/icons/artifactory.png
new file mode 100755
index 0000000..f3e14fe
Binary files /dev/null and b/heimdall/config/www/icons/artifactory.png differ
diff --git a/heimdall/config/www/icons/asrockrackipmi.png b/heimdall/config/www/icons/asrockrackipmi.png
new file mode 100755
index 0000000..df8d2eb
Binary files /dev/null and b/heimdall/config/www/icons/asrockrackipmi.png differ
diff --git a/heimdall/config/www/icons/avmfritzbox.png b/heimdall/config/www/icons/avmfritzbox.png
new file mode 100755
index 0000000..d266690
Binary files /dev/null and b/heimdall/config/www/icons/avmfritzbox.png differ
diff --git a/heimdall/config/www/icons/awx.png b/heimdall/config/www/icons/awx.png
new file mode 100755
index 0000000..084864e
Binary files /dev/null and b/heimdall/config/www/icons/awx.png differ
diff --git a/heimdall/config/www/icons/bacula.png b/heimdall/config/www/icons/bacula.png
new file mode 100755
index 0000000..7778fd5
Binary files /dev/null and b/heimdall/config/www/icons/bacula.png differ
diff --git a/heimdall/config/www/icons/baikal.png b/heimdall/config/www/icons/baikal.png
new file mode 100755
index 0000000..e03de66
Binary files /dev/null and b/heimdall/config/www/icons/baikal.png differ
diff --git a/heimdall/config/www/icons/bastillion.png b/heimdall/config/www/icons/bastillion.png
new file mode 100755
index 0000000..cd27506
Binary files /dev/null and b/heimdall/config/www/icons/bastillion.png differ
diff --git a/heimdall/config/www/icons/bazarr.png b/heimdall/config/www/icons/bazarr.png
new file mode 100755
index 0000000..7ba609c
Binary files /dev/null and b/heimdall/config/www/icons/bazarr.png differ
diff --git a/heimdall/config/www/icons/bc8f75876a747950735260adc634a81b.png b/heimdall/config/www/icons/bc8f75876a747950735260adc634a81b.png
new file mode 100755
index 0000000..eb511bf
Binary files /dev/null and b/heimdall/config/www/icons/bc8f75876a747950735260adc634a81b.png differ
diff --git a/heimdall/config/www/icons/bitwarden.png b/heimdall/config/www/icons/bitwarden.png
new file mode 100755
index 0000000..82a277b
Binary files /dev/null and b/heimdall/config/www/icons/bitwarden.png differ
diff --git a/heimdall/config/www/icons/bitwarden.svg b/heimdall/config/www/icons/bitwarden.svg
new file mode 100755
index 0000000..6eacdc0
--- /dev/null
+++ b/heimdall/config/www/icons/bitwarden.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/heimdall/config/www/icons/booksonic.png b/heimdall/config/www/icons/booksonic.png
new file mode 100755
index 0000000..4232ac9
Binary files /dev/null and b/heimdall/config/www/icons/booksonic.png differ
diff --git a/heimdall/config/www/icons/bookstack.png b/heimdall/config/www/icons/bookstack.png
new file mode 100755
index 0000000..949b055
Binary files /dev/null and b/heimdall/config/www/icons/bookstack.png differ
diff --git a/heimdall/config/www/icons/box.png b/heimdall/config/www/icons/box.png
new file mode 100755
index 0000000..f454d76
Binary files /dev/null and b/heimdall/config/www/icons/box.png differ
diff --git a/heimdall/config/www/icons/cCaEKDEhnWBc1ZKEiQZQrjdVe7CGDe9RNZ2y3RjI.png b/heimdall/config/www/icons/cCaEKDEhnWBc1ZKEiQZQrjdVe7CGDe9RNZ2y3RjI.png
new file mode 100755
index 0000000..7040574
Binary files /dev/null and b/heimdall/config/www/icons/cCaEKDEhnWBc1ZKEiQZQrjdVe7CGDe9RNZ2y3RjI.png differ
diff --git a/heimdall/config/www/icons/cabot.png b/heimdall/config/www/icons/cabot.png
new file mode 100755
index 0000000..09e9c6a
Binary files /dev/null and b/heimdall/config/www/icons/cabot.png differ
diff --git a/heimdall/config/www/icons/calibreweb.png b/heimdall/config/www/icons/calibreweb.png
new file mode 100755
index 0000000..24b2ad1
Binary files /dev/null and b/heimdall/config/www/icons/calibreweb.png differ
diff --git a/heimdall/config/www/icons/cardigann.png b/heimdall/config/www/icons/cardigann.png
new file mode 100755
index 0000000..da85e49
Binary files /dev/null and b/heimdall/config/www/icons/cardigann.png differ
diff --git a/heimdall/config/www/icons/cb71e67555e550bf84c0816179daed23.svg b/heimdall/config/www/icons/cb71e67555e550bf84c0816179daed23.svg
new file mode 100755
index 0000000..ed942cc
--- /dev/null
+++ b/heimdall/config/www/icons/cb71e67555e550bf84c0816179daed23.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/heimdall/config/www/icons/changedetectionio.png b/heimdall/config/www/icons/changedetectionio.png
new file mode 100755
index 0000000..192846a
Binary files /dev/null and b/heimdall/config/www/icons/changedetectionio.png differ
diff --git a/heimdall/config/www/icons/checkmk.png b/heimdall/config/www/icons/checkmk.png
new file mode 100755
index 0000000..9886451
Binary files /dev/null and b/heimdall/config/www/icons/checkmk.png differ
diff --git a/heimdall/config/www/icons/chevereto.png b/heimdall/config/www/icons/chevereto.png
new file mode 100755
index 0000000..38ba569
Binary files /dev/null and b/heimdall/config/www/icons/chevereto.png differ
diff --git a/heimdall/config/www/icons/chronograf.png b/heimdall/config/www/icons/chronograf.png
new file mode 100755
index 0000000..36a9074
Binary files /dev/null and b/heimdall/config/www/icons/chronograf.png differ
diff --git a/heimdall/config/www/icons/clarkson.png b/heimdall/config/www/icons/clarkson.png
new file mode 100755
index 0000000..8e377a0
Binary files /dev/null and b/heimdall/config/www/icons/clarkson.png differ
diff --git a/heimdall/config/www/icons/cloudcmd.png b/heimdall/config/www/icons/cloudcmd.png
new file mode 100755
index 0000000..b5da320
Binary files /dev/null and b/heimdall/config/www/icons/cloudcmd.png differ
diff --git a/heimdall/config/www/icons/cockpit.png b/heimdall/config/www/icons/cockpit.png
new file mode 100755
index 0000000..74813fc
Binary files /dev/null and b/heimdall/config/www/icons/cockpit.png differ
diff --git a/heimdall/config/www/icons/cockpitcms.png b/heimdall/config/www/icons/cockpitcms.png
new file mode 100755
index 0000000..3f4ef18
Binary files /dev/null and b/heimdall/config/www/icons/cockpitcms.png differ
diff --git a/heimdall/config/www/icons/codeserver.png b/heimdall/config/www/icons/codeserver.png
new file mode 100755
index 0000000..4f44469
Binary files /dev/null and b/heimdall/config/www/icons/codeserver.png differ
diff --git a/heimdall/config/www/icons/codimd.png b/heimdall/config/www/icons/codimd.png
new file mode 100755
index 0000000..1653f10
Binary files /dev/null and b/heimdall/config/www/icons/codimd.png differ
diff --git a/heimdall/config/www/icons/concourse.png b/heimdall/config/www/icons/concourse.png
new file mode 100755
index 0000000..fbcf4bb
Binary files /dev/null and b/heimdall/config/www/icons/concourse.png differ
diff --git a/heimdall/config/www/icons/confluence.svg b/heimdall/config/www/icons/confluence.svg
new file mode 100755
index 0000000..531b563
--- /dev/null
+++ b/heimdall/config/www/icons/confluence.svg
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/heimdall/config/www/icons/couchpotato.png b/heimdall/config/www/icons/couchpotato.png
new file mode 100755
index 0000000..10f9427
Binary files /dev/null and b/heimdall/config/www/icons/couchpotato.png differ
diff --git a/heimdall/config/www/icons/cpanel.png b/heimdall/config/www/icons/cpanel.png
new file mode 100755
index 0000000..019f4aa
Binary files /dev/null and b/heimdall/config/www/icons/cpanel.png differ
diff --git a/heimdall/config/www/icons/cryptpad.png b/heimdall/config/www/icons/cryptpad.png
new file mode 100755
index 0000000..722438d
Binary files /dev/null and b/heimdall/config/www/icons/cryptpad.png differ
diff --git a/heimdall/config/www/icons/cups.svg b/heimdall/config/www/icons/cups.svg
new file mode 100755
index 0000000..a5290d0
--- /dev/null
+++ b/heimdall/config/www/icons/cups.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/heimdall/config/www/icons/dVC48RMlRSJERmUmbvlvHiKvBDGWq5jrVXaLWLGk.jpeg b/heimdall/config/www/icons/dVC48RMlRSJERmUmbvlvHiKvBDGWq5jrVXaLWLGk.jpeg
new file mode 100755
index 0000000..0f01023
Binary files /dev/null and b/heimdall/config/www/icons/dVC48RMlRSJERmUmbvlvHiKvBDGWq5jrVXaLWLGk.jpeg differ
diff --git a/heimdall/config/www/icons/ddd03d45efd8cc28b059701317747e6f.png b/heimdall/config/www/icons/ddd03d45efd8cc28b059701317747e6f.png
new file mode 100755
index 0000000..1afeb19
Binary files /dev/null and b/heimdall/config/www/icons/ddd03d45efd8cc28b059701317747e6f.png differ
diff --git a/heimdall/config/www/icons/deluge.png b/heimdall/config/www/icons/deluge.png
new file mode 100755
index 0000000..8b288c7
Binary files /dev/null and b/heimdall/config/www/icons/deluge.png differ
diff --git a/heimdall/config/www/icons/dillinger.png b/heimdall/config/www/icons/dillinger.png
new file mode 100755
index 0000000..b22042e
Binary files /dev/null and b/heimdall/config/www/icons/dillinger.png differ
diff --git a/heimdall/config/www/icons/directus.png b/heimdall/config/www/icons/directus.png
new file mode 100755
index 0000000..981dedb
Binary files /dev/null and b/heimdall/config/www/icons/directus.png differ
diff --git a/heimdall/config/www/icons/dokuwiki.png b/heimdall/config/www/icons/dokuwiki.png
new file mode 100755
index 0000000..9691b09
Binary files /dev/null and b/heimdall/config/www/icons/dokuwiki.png differ
diff --git a/heimdall/config/www/icons/domoticz.png b/heimdall/config/www/icons/domoticz.png
new file mode 100755
index 0000000..35090c8
Binary files /dev/null and b/heimdall/config/www/icons/domoticz.png differ
diff --git a/heimdall/config/www/icons/dozzle.png b/heimdall/config/www/icons/dozzle.png
new file mode 100755
index 0000000..dcbf073
Binary files /dev/null and b/heimdall/config/www/icons/dozzle.png differ
diff --git a/heimdall/config/www/icons/drone.png b/heimdall/config/www/icons/drone.png
new file mode 100755
index 0000000..b60aacf
Binary files /dev/null and b/heimdall/config/www/icons/drone.png differ
diff --git a/heimdall/config/www/icons/droppy.png b/heimdall/config/www/icons/droppy.png
new file mode 100755
index 0000000..6bbccea
Binary files /dev/null and b/heimdall/config/www/icons/droppy.png differ
diff --git a/heimdall/config/www/icons/duplicacy.png b/heimdall/config/www/icons/duplicacy.png
new file mode 100755
index 0000000..ead9fe7
Binary files /dev/null and b/heimdall/config/www/icons/duplicacy.png differ
diff --git a/heimdall/config/www/icons/duplicati.png b/heimdall/config/www/icons/duplicati.png
new file mode 100755
index 0000000..caa094d
Binary files /dev/null and b/heimdall/config/www/icons/duplicati.png differ
diff --git a/heimdall/config/www/icons/element.png b/heimdall/config/www/icons/element.png
new file mode 100755
index 0000000..ae78138
Binary files /dev/null and b/heimdall/config/www/icons/element.png differ
diff --git a/heimdall/config/www/icons/emby.png b/heimdall/config/www/icons/emby.png
new file mode 100755
index 0000000..aae9097
Binary files /dev/null and b/heimdall/config/www/icons/emby.png differ
diff --git a/heimdall/config/www/icons/embystat.png b/heimdall/config/www/icons/embystat.png
new file mode 100755
index 0000000..96565ed
Binary files /dev/null and b/heimdall/config/www/icons/embystat.png differ
diff --git a/heimdall/config/www/icons/eqK0F9W3wIy8ArTxr9SsB3mO603vuPP6hYw4Ds0x.png b/heimdall/config/www/icons/eqK0F9W3wIy8ArTxr9SsB3mO603vuPP6hYw4Ds0x.png
new file mode 100755
index 0000000..133eea3
Binary files /dev/null and b/heimdall/config/www/icons/eqK0F9W3wIy8ArTxr9SsB3mO603vuPP6hYw4Ds0x.png differ
diff --git a/heimdall/config/www/icons/esphome.png b/heimdall/config/www/icons/esphome.png
new file mode 100755
index 0000000..0609f8e
Binary files /dev/null and b/heimdall/config/www/icons/esphome.png differ
diff --git a/heimdall/config/www/icons/f2c15a6cf3ab3827df42a7d20e223a32.png b/heimdall/config/www/icons/f2c15a6cf3ab3827df42a7d20e223a32.png
new file mode 100755
index 0000000..16dd7e7
Binary files /dev/null and b/heimdall/config/www/icons/f2c15a6cf3ab3827df42a7d20e223a32.png differ
diff --git a/heimdall/config/www/icons/fgl9h4JqH7xmM6vAOVBtZsNIGJqVNxiDp0DrMd7u.png b/heimdall/config/www/icons/fgl9h4JqH7xmM6vAOVBtZsNIGJqVNxiDp0DrMd7u.png
new file mode 100755
index 0000000..38182d2
Binary files /dev/null and b/heimdall/config/www/icons/fgl9h4JqH7xmM6vAOVBtZsNIGJqVNxiDp0DrMd7u.png differ
diff --git a/heimdall/config/www/icons/filebrowser.png b/heimdall/config/www/icons/filebrowser.png
new file mode 100755
index 0000000..a182f22
Binary files /dev/null and b/heimdall/config/www/icons/filebrowser.png differ
diff --git a/heimdall/config/www/icons/filerun.png b/heimdall/config/www/icons/filerun.png
new file mode 100755
index 0000000..ea391a1
Binary files /dev/null and b/heimdall/config/www/icons/filerun.png differ
diff --git a/heimdall/config/www/icons/firefly.png b/heimdall/config/www/icons/firefly.png
new file mode 100755
index 0000000..fa4ee0e
Binary files /dev/null and b/heimdall/config/www/icons/firefly.png differ
diff --git a/heimdall/config/www/icons/firefoxsend.png b/heimdall/config/www/icons/firefoxsend.png
new file mode 100755
index 0000000..99b0a9f
Binary files /dev/null and b/heimdall/config/www/icons/firefoxsend.png differ
diff --git a/heimdall/config/www/icons/flexget.png b/heimdall/config/www/icons/flexget.png
new file mode 100755
index 0000000..9130453
Binary files /dev/null and b/heimdall/config/www/icons/flexget.png differ
diff --git a/heimdall/config/www/icons/flood.png b/heimdall/config/www/icons/flood.png
new file mode 100755
index 0000000..f340805
Binary files /dev/null and b/heimdall/config/www/icons/flood.png differ
diff --git a/heimdall/config/www/icons/focalboard.svg b/heimdall/config/www/icons/focalboard.svg
new file mode 100755
index 0000000..0f624ce
--- /dev/null
+++ b/heimdall/config/www/icons/focalboard.svg
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/heimdall/config/www/icons/foldingathome.png b/heimdall/config/www/icons/foldingathome.png
new file mode 100755
index 0000000..576ad69
Binary files /dev/null and b/heimdall/config/www/icons/foldingathome.png differ
diff --git a/heimdall/config/www/icons/freenas.png b/heimdall/config/www/icons/freenas.png
new file mode 100755
index 0000000..8fb6608
Binary files /dev/null and b/heimdall/config/www/icons/freenas.png differ
diff --git a/heimdall/config/www/icons/freshrss.png b/heimdall/config/www/icons/freshrss.png
new file mode 100755
index 0000000..7ced43f
Binary files /dev/null and b/heimdall/config/www/icons/freshrss.png differ
diff --git a/heimdall/config/www/icons/freshrss.svg b/heimdall/config/www/icons/freshrss.svg
new file mode 100755
index 0000000..eb5b689
--- /dev/null
+++ b/heimdall/config/www/icons/freshrss.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/heimdall/config/www/icons/frigate.svg b/heimdall/config/www/icons/frigate.svg
new file mode 100755
index 0000000..0f315fa
--- /dev/null
+++ b/heimdall/config/www/icons/frigate.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/heimdall/config/www/icons/fronius.png b/heimdall/config/www/icons/fronius.png
new file mode 100755
index 0000000..f1f399c
Binary files /dev/null and b/heimdall/config/www/icons/fronius.png differ
diff --git a/heimdall/config/www/icons/funkwhale.svg b/heimdall/config/www/icons/funkwhale.svg
new file mode 100755
index 0000000..fe3141b
--- /dev/null
+++ b/heimdall/config/www/icons/funkwhale.svg
@@ -0,0 +1,91 @@
+
+
+
+image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/icons/ghost.png b/heimdall/config/www/icons/ghost.png
new file mode 100755
index 0000000..27748f7
Binary files /dev/null and b/heimdall/config/www/icons/ghost.png differ
diff --git a/heimdall/config/www/icons/gitea.png b/heimdall/config/www/icons/gitea.png
new file mode 100755
index 0000000..33b7223
Binary files /dev/null and b/heimdall/config/www/icons/gitea.png differ
diff --git a/heimdall/config/www/icons/gitea.svg b/heimdall/config/www/icons/gitea.svg
new file mode 100755
index 0000000..a61f7ac
--- /dev/null
+++ b/heimdall/config/www/icons/gitea.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/heimdall/config/www/icons/github.png b/heimdall/config/www/icons/github.png
new file mode 100755
index 0000000..136b02f
Binary files /dev/null and b/heimdall/config/www/icons/github.png differ
diff --git a/heimdall/config/www/icons/gitlab.png b/heimdall/config/www/icons/gitlab.png
new file mode 100755
index 0000000..d8b8fef
Binary files /dev/null and b/heimdall/config/www/icons/gitlab.png differ
diff --git a/heimdall/config/www/icons/gitlab.svg b/heimdall/config/www/icons/gitlab.svg
new file mode 100755
index 0000000..10b8b51
--- /dev/null
+++ b/heimdall/config/www/icons/gitlab.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/heimdall/config/www/icons/glances.png b/heimdall/config/www/icons/glances.png
new file mode 100755
index 0000000..6eb45d4
Binary files /dev/null and b/heimdall/config/www/icons/glances.png differ
diff --git a/heimdall/config/www/icons/gogs.png b/heimdall/config/www/icons/gogs.png
new file mode 100755
index 0000000..3438553
Binary files /dev/null and b/heimdall/config/www/icons/gogs.png differ
diff --git a/heimdall/config/www/icons/gotify.png b/heimdall/config/www/icons/gotify.png
new file mode 100755
index 0000000..cb74a8f
Binary files /dev/null and b/heimdall/config/www/icons/gotify.png differ
diff --git a/heimdall/config/www/icons/grafana.png b/heimdall/config/www/icons/grafana.png
new file mode 100755
index 0000000..3ae0302
Binary files /dev/null and b/heimdall/config/www/icons/grafana.png differ
diff --git a/heimdall/config/www/icons/grav.png b/heimdall/config/www/icons/grav.png
new file mode 100755
index 0000000..e92fbd9
Binary files /dev/null and b/heimdall/config/www/icons/grav.png differ
diff --git a/heimdall/config/www/icons/graylog.png b/heimdall/config/www/icons/graylog.png
new file mode 100755
index 0000000..4a8031c
Binary files /dev/null and b/heimdall/config/www/icons/graylog.png differ
diff --git a/heimdall/config/www/icons/grocy.png b/heimdall/config/www/icons/grocy.png
new file mode 100755
index 0000000..d60f846
Binary files /dev/null and b/heimdall/config/www/icons/grocy.png differ
diff --git a/heimdall/config/www/icons/grocy.svg b/heimdall/config/www/icons/grocy.svg
new file mode 100755
index 0000000..a4855b1
--- /dev/null
+++ b/heimdall/config/www/icons/grocy.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/heimdall/config/www/icons/guacamole.png b/heimdall/config/www/icons/guacamole.png
new file mode 100755
index 0000000..5946fb7
Binary files /dev/null and b/heimdall/config/www/icons/guacamole.png differ
diff --git a/heimdall/config/www/icons/handbrake.png b/heimdall/config/www/icons/handbrake.png
new file mode 100755
index 0000000..ea7f65a
Binary files /dev/null and b/heimdall/config/www/icons/handbrake.png differ
diff --git a/heimdall/config/www/icons/haproxy.png b/heimdall/config/www/icons/haproxy.png
new file mode 100755
index 0000000..04c63ae
Binary files /dev/null and b/heimdall/config/www/icons/haproxy.png differ
diff --git a/heimdall/config/www/icons/hasura.png b/heimdall/config/www/icons/hasura.png
new file mode 100755
index 0000000..b438d0f
Binary files /dev/null and b/heimdall/config/www/icons/hasura.png differ
diff --git a/heimdall/config/www/icons/hdhomerun.png b/heimdall/config/www/icons/hdhomerun.png
new file mode 100755
index 0000000..d09e40a
Binary files /dev/null and b/heimdall/config/www/icons/hdhomerun.png differ
diff --git a/heimdall/config/www/icons/headphones.png b/heimdall/config/www/icons/headphones.png
new file mode 100755
index 0000000..f4b48b2
Binary files /dev/null and b/heimdall/config/www/icons/headphones.png differ
diff --git a/heimdall/config/www/icons/healthchecks.png b/heimdall/config/www/icons/healthchecks.png
new file mode 100755
index 0000000..f0c2d4e
Binary files /dev/null and b/heimdall/config/www/icons/healthchecks.png differ
diff --git a/heimdall/config/www/icons/heimdall.png b/heimdall/config/www/icons/heimdall.png
new file mode 100755
index 0000000..cff916c
Binary files /dev/null and b/heimdall/config/www/icons/heimdall.png differ
diff --git a/heimdall/config/www/icons/homeassistant.png b/heimdall/config/www/icons/homeassistant.png
new file mode 100755
index 0000000..6f77c74
Binary files /dev/null and b/heimdall/config/www/icons/homeassistant.png differ
diff --git a/heimdall/config/www/icons/homebridge.png b/heimdall/config/www/icons/homebridge.png
new file mode 100755
index 0000000..81a0533
Binary files /dev/null and b/heimdall/config/www/icons/homebridge.png differ
diff --git a/heimdall/config/www/icons/hubitat.png b/heimdall/config/www/icons/hubitat.png
new file mode 100755
index 0000000..c043c44
Binary files /dev/null and b/heimdall/config/www/icons/hubitat.png differ
diff --git a/heimdall/config/www/icons/huginn.png b/heimdall/config/www/icons/huginn.png
new file mode 100755
index 0000000..82a50a8
Binary files /dev/null and b/heimdall/config/www/icons/huginn.png differ
diff --git a/heimdall/config/www/icons/iDbaTFHn0GWqs9aS4qRSVi8sMjFy7DzTrNZiQXNB.png b/heimdall/config/www/icons/iDbaTFHn0GWqs9aS4qRSVi8sMjFy7DzTrNZiQXNB.png
new file mode 100755
index 0000000..39890b2
Binary files /dev/null and b/heimdall/config/www/icons/iDbaTFHn0GWqs9aS4qRSVi8sMjFy7DzTrNZiQXNB.png differ
diff --git a/heimdall/config/www/icons/icecast.png b/heimdall/config/www/icons/icecast.png
new file mode 100755
index 0000000..b8eaa7a
Binary files /dev/null and b/heimdall/config/www/icons/icecast.png differ
diff --git a/heimdall/config/www/icons/icingaweb.svg b/heimdall/config/www/icons/icingaweb.svg
new file mode 100755
index 0000000..8cdb3ba
--- /dev/null
+++ b/heimdall/config/www/icons/icingaweb.svg
@@ -0,0 +1,81 @@
+
+image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/icons/idrac.png b/heimdall/config/www/icons/idrac.png
new file mode 100755
index 0000000..74b0533
Binary files /dev/null and b/heimdall/config/www/icons/idrac.png differ
diff --git a/heimdall/config/www/icons/ilo.png b/heimdall/config/www/icons/ilo.png
new file mode 100755
index 0000000..09ff14d
Binary files /dev/null and b/heimdall/config/www/icons/ilo.png differ
diff --git a/heimdall/config/www/icons/influxdb.svg b/heimdall/config/www/icons/influxdb.svg
new file mode 100755
index 0000000..f2ac1bf
--- /dev/null
+++ b/heimdall/config/www/icons/influxdb.svg
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/heimdall/config/www/icons/infoblox.png b/heimdall/config/www/icons/infoblox.png
new file mode 100755
index 0000000..af1e518
Binary files /dev/null and b/heimdall/config/www/icons/infoblox.png differ
diff --git a/heimdall/config/www/icons/invidious.png b/heimdall/config/www/icons/invidious.png
new file mode 100755
index 0000000..453bf72
Binary files /dev/null and b/heimdall/config/www/icons/invidious.png differ
diff --git a/heimdall/config/www/icons/invoiceninja.png b/heimdall/config/www/icons/invoiceninja.png
new file mode 100755
index 0000000..11b85b8
Binary files /dev/null and b/heimdall/config/www/icons/invoiceninja.png differ
diff --git a/heimdall/config/www/icons/iobroker.png b/heimdall/config/www/icons/iobroker.png
new file mode 100755
index 0000000..4356aea
Binary files /dev/null and b/heimdall/config/www/icons/iobroker.png differ
diff --git a/heimdall/config/www/icons/jackett.png b/heimdall/config/www/icons/jackett.png
new file mode 100755
index 0000000..fe687a4
Binary files /dev/null and b/heimdall/config/www/icons/jackett.png differ
diff --git a/heimdall/config/www/icons/jackett.svg b/heimdall/config/www/icons/jackett.svg
new file mode 100755
index 0000000..1ad3f4f
--- /dev/null
+++ b/heimdall/config/www/icons/jackett.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/heimdall/config/www/icons/jaeger.png b/heimdall/config/www/icons/jaeger.png
new file mode 100755
index 0000000..1e17e50
Binary files /dev/null and b/heimdall/config/www/icons/jaeger.png differ
diff --git a/heimdall/config/www/icons/jdownloader.png b/heimdall/config/www/icons/jdownloader.png
new file mode 100755
index 0000000..4022c97
Binary files /dev/null and b/heimdall/config/www/icons/jdownloader.png differ
diff --git a/heimdall/config/www/icons/jeedom.png b/heimdall/config/www/icons/jeedom.png
new file mode 100755
index 0000000..358afc0
Binary files /dev/null and b/heimdall/config/www/icons/jeedom.png differ
diff --git a/heimdall/config/www/icons/jellyfin.png b/heimdall/config/www/icons/jellyfin.png
new file mode 100755
index 0000000..4335d48
Binary files /dev/null and b/heimdall/config/www/icons/jellyfin.png differ
diff --git a/heimdall/config/www/icons/jellyfin.svg b/heimdall/config/www/icons/jellyfin.svg
new file mode 100755
index 0000000..cf875b2
--- /dev/null
+++ b/heimdall/config/www/icons/jellyfin.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/heimdall/config/www/icons/jellyseerr.png b/heimdall/config/www/icons/jellyseerr.png
new file mode 100755
index 0000000..31a66b3
Binary files /dev/null and b/heimdall/config/www/icons/jellyseerr.png differ
diff --git a/heimdall/config/www/icons/jenkins.png b/heimdall/config/www/icons/jenkins.png
new file mode 100755
index 0000000..53155f5
Binary files /dev/null and b/heimdall/config/www/icons/jenkins.png differ
diff --git a/heimdall/config/www/icons/jira.svg b/heimdall/config/www/icons/jira.svg
new file mode 100755
index 0000000..a837bd3
--- /dev/null
+++ b/heimdall/config/www/icons/jira.svg
@@ -0,0 +1 @@
+jira software-icon-gradient-blue
\ No newline at end of file
diff --git a/heimdall/config/www/icons/jitsi.png b/heimdall/config/www/icons/jitsi.png
new file mode 100755
index 0000000..45724fd
Binary files /dev/null and b/heimdall/config/www/icons/jitsi.png differ
diff --git a/heimdall/config/www/icons/joomla.png b/heimdall/config/www/icons/joomla.png
new file mode 100755
index 0000000..88c743f
Binary files /dev/null and b/heimdall/config/www/icons/joomla.png differ
diff --git a/heimdall/config/www/icons/jupyter.svg b/heimdall/config/www/icons/jupyter.svg
new file mode 100755
index 0000000..f7f0281
--- /dev/null
+++ b/heimdall/config/www/icons/jupyter.svg
@@ -0,0 +1,226 @@
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Jupyter
+
+
diff --git a/heimdall/config/www/icons/kanboard.png b/heimdall/config/www/icons/kanboard.png
new file mode 100755
index 0000000..cc3ca95
Binary files /dev/null and b/heimdall/config/www/icons/kanboard.png differ
diff --git a/heimdall/config/www/icons/keycloak.svg b/heimdall/config/www/icons/keycloak.svg
new file mode 100755
index 0000000..570bcc1
--- /dev/null
+++ b/heimdall/config/www/icons/keycloak.svg
@@ -0,0 +1 @@
+keycloak_deliverables
\ No newline at end of file
diff --git a/heimdall/config/www/icons/kibana.png b/heimdall/config/www/icons/kibana.png
new file mode 100755
index 0000000..7732f99
Binary files /dev/null and b/heimdall/config/www/icons/kibana.png differ
diff --git a/heimdall/config/www/icons/kimai.png b/heimdall/config/www/icons/kimai.png
new file mode 100755
index 0000000..2d80508
Binary files /dev/null and b/heimdall/config/www/icons/kimai.png differ
diff --git a/heimdall/config/www/icons/kitana.png b/heimdall/config/www/icons/kitana.png
new file mode 100755
index 0000000..12ec88a
Binary files /dev/null and b/heimdall/config/www/icons/kitana.png differ
diff --git a/heimdall/config/www/icons/kodi.png b/heimdall/config/www/icons/kodi.png
new file mode 100755
index 0000000..c88b069
Binary files /dev/null and b/heimdall/config/www/icons/kodi.png differ
diff --git a/heimdall/config/www/icons/komga.png b/heimdall/config/www/icons/komga.png
new file mode 100755
index 0000000..9b404e7
Binary files /dev/null and b/heimdall/config/www/icons/komga.png differ
diff --git a/heimdall/config/www/icons/kopia.png b/heimdall/config/www/icons/kopia.png
new file mode 100755
index 0000000..f023f34
Binary files /dev/null and b/heimdall/config/www/icons/kopia.png differ
diff --git a/heimdall/config/www/icons/krusader.png b/heimdall/config/www/icons/krusader.png
new file mode 100755
index 0000000..66e13c7
Binary files /dev/null and b/heimdall/config/www/icons/krusader.png differ
diff --git a/heimdall/config/www/icons/kubernetesdashboard.svg b/heimdall/config/www/icons/kubernetesdashboard.svg
new file mode 100755
index 0000000..bedd3b8
--- /dev/null
+++ b/heimdall/config/www/icons/kubernetesdashboard.svg
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/heimdall/config/www/icons/lazylibrarian.png b/heimdall/config/www/icons/lazylibrarian.png
new file mode 100755
index 0000000..77ff7aa
Binary files /dev/null and b/heimdall/config/www/icons/lazylibrarian.png differ
diff --git a/heimdall/config/www/icons/lemonldapng.png b/heimdall/config/www/icons/lemonldapng.png
new file mode 100755
index 0000000..3d4fd6b
Binary files /dev/null and b/heimdall/config/www/icons/lemonldapng.png differ
diff --git a/heimdall/config/www/icons/librenms.png b/heimdall/config/www/icons/librenms.png
new file mode 100755
index 0000000..6911273
Binary files /dev/null and b/heimdall/config/www/icons/librenms.png differ
diff --git a/heimdall/config/www/icons/librespeed.png b/heimdall/config/www/icons/librespeed.png
new file mode 100755
index 0000000..814f81c
Binary files /dev/null and b/heimdall/config/www/icons/librespeed.png differ
diff --git a/heimdall/config/www/icons/lidarr.png b/heimdall/config/www/icons/lidarr.png
new file mode 100755
index 0000000..199ca63
Binary files /dev/null and b/heimdall/config/www/icons/lidarr.png differ
diff --git a/heimdall/config/www/icons/linkace.png b/heimdall/config/www/icons/linkace.png
new file mode 100755
index 0000000..63439a7
Binary files /dev/null and b/heimdall/config/www/icons/linkace.png differ
diff --git a/heimdall/config/www/icons/linkace.svg b/heimdall/config/www/icons/linkace.svg
new file mode 100755
index 0000000..01d2243
--- /dev/null
+++ b/heimdall/config/www/icons/linkace.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/heimdall/config/www/icons/lychee.png b/heimdall/config/www/icons/lychee.png
new file mode 100755
index 0000000..121d08e
Binary files /dev/null and b/heimdall/config/www/icons/lychee.png differ
diff --git a/heimdall/config/www/icons/mailcow.svg b/heimdall/config/www/icons/mailcow.svg
new file mode 100755
index 0000000..6ba98e4
--- /dev/null
+++ b/heimdall/config/www/icons/mailcow.svg
@@ -0,0 +1,182 @@
+
+
+
+image/svg+xml
\ No newline at end of file
diff --git a/heimdall/config/www/icons/mailcowsogo.svg b/heimdall/config/www/icons/mailcowsogo.svg
new file mode 100755
index 0000000..2be4dec
--- /dev/null
+++ b/heimdall/config/www/icons/mailcowsogo.svg
@@ -0,0 +1,3 @@
+
+
+image/svg+xml
\ No newline at end of file
diff --git a/heimdall/config/www/icons/mailhog.png b/heimdall/config/www/icons/mailhog.png
new file mode 100755
index 0000000..c846729
Binary files /dev/null and b/heimdall/config/www/icons/mailhog.png differ
diff --git a/heimdall/config/www/icons/mainsail.png b/heimdall/config/www/icons/mainsail.png
new file mode 100755
index 0000000..970ac9d
Binary files /dev/null and b/heimdall/config/www/icons/mainsail.png differ
diff --git a/heimdall/config/www/icons/mastodon.svg b/heimdall/config/www/icons/mastodon.svg
new file mode 100755
index 0000000..3b8451d
--- /dev/null
+++ b/heimdall/config/www/icons/mastodon.svg
@@ -0,0 +1,66 @@
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/heimdall/config/www/icons/mattermost.png b/heimdall/config/www/icons/mattermost.png
new file mode 100755
index 0000000..69078b3
Binary files /dev/null and b/heimdall/config/www/icons/mattermost.png differ
diff --git a/heimdall/config/www/icons/mayanedms.png b/heimdall/config/www/icons/mayanedms.png
new file mode 100755
index 0000000..1677941
Binary files /dev/null and b/heimdall/config/www/icons/mayanedms.png differ
diff --git a/heimdall/config/www/icons/mcmyadmin.png b/heimdall/config/www/icons/mcmyadmin.png
new file mode 100755
index 0000000..6693339
Binary files /dev/null and b/heimdall/config/www/icons/mcmyadmin.png differ
diff --git a/heimdall/config/www/icons/mealie.png b/heimdall/config/www/icons/mealie.png
new file mode 100755
index 0000000..fdfa471
Binary files /dev/null and b/heimdall/config/www/icons/mealie.png differ
diff --git a/heimdall/config/www/icons/mediawiki.png b/heimdall/config/www/icons/mediawiki.png
new file mode 100755
index 0000000..6172671
Binary files /dev/null and b/heimdall/config/www/icons/mediawiki.png differ
diff --git a/heimdall/config/www/icons/medusa.png b/heimdall/config/www/icons/medusa.png
new file mode 100755
index 0000000..0dfde2c
Binary files /dev/null and b/heimdall/config/www/icons/medusa.png differ
diff --git a/heimdall/config/www/icons/meraki.png b/heimdall/config/www/icons/meraki.png
new file mode 100755
index 0000000..31008c3
Binary files /dev/null and b/heimdall/config/www/icons/meraki.png differ
diff --git a/heimdall/config/www/icons/mineos.png b/heimdall/config/www/icons/mineos.png
new file mode 100755
index 0000000..687da5b
Binary files /dev/null and b/heimdall/config/www/icons/mineos.png differ
diff --git a/heimdall/config/www/icons/miniflux.png b/heimdall/config/www/icons/miniflux.png
new file mode 100755
index 0000000..8915982
Binary files /dev/null and b/heimdall/config/www/icons/miniflux.png differ
diff --git a/heimdall/config/www/icons/minio.png b/heimdall/config/www/icons/minio.png
new file mode 100755
index 0000000..4ac41fc
Binary files /dev/null and b/heimdall/config/www/icons/minio.png differ
diff --git a/heimdall/config/www/icons/monica.png b/heimdall/config/www/icons/monica.png
new file mode 100755
index 0000000..5d3d551
Binary files /dev/null and b/heimdall/config/www/icons/monica.png differ
diff --git a/heimdall/config/www/icons/monit.png b/heimdall/config/www/icons/monit.png
new file mode 100755
index 0000000..3b04ae8
Binary files /dev/null and b/heimdall/config/www/icons/monit.png differ
diff --git a/heimdall/config/www/icons/motioneye.png b/heimdall/config/www/icons/motioneye.png
new file mode 100755
index 0000000..b420472
Binary files /dev/null and b/heimdall/config/www/icons/motioneye.png differ
diff --git a/heimdall/config/www/icons/musicbrainz.svg b/heimdall/config/www/icons/musicbrainz.svg
new file mode 100755
index 0000000..7b6a85b
--- /dev/null
+++ b/heimdall/config/www/icons/musicbrainz.svg
@@ -0,0 +1,146 @@
+
+
+
+image/svg+xml
\ No newline at end of file
diff --git a/heimdall/config/www/icons/mylar.png b/heimdall/config/www/icons/mylar.png
new file mode 100755
index 0000000..96ce51e
Binary files /dev/null and b/heimdall/config/www/icons/mylar.png differ
diff --git a/heimdall/config/www/icons/n8n.png b/heimdall/config/www/icons/n8n.png
new file mode 100755
index 0000000..b9dad93
Binary files /dev/null and b/heimdall/config/www/icons/n8n.png differ
diff --git a/heimdall/config/www/icons/navidrome.png b/heimdall/config/www/icons/navidrome.png
new file mode 100755
index 0000000..1b8b1a2
Binary files /dev/null and b/heimdall/config/www/icons/navidrome.png differ
diff --git a/heimdall/config/www/icons/nessus.png b/heimdall/config/www/icons/nessus.png
new file mode 100755
index 0000000..84cb81a
Binary files /dev/null and b/heimdall/config/www/icons/nessus.png differ
diff --git a/heimdall/config/www/icons/netatmo.png b/heimdall/config/www/icons/netatmo.png
new file mode 100755
index 0000000..e8b3ea0
Binary files /dev/null and b/heimdall/config/www/icons/netatmo.png differ
diff --git a/heimdall/config/www/icons/netboot.png b/heimdall/config/www/icons/netboot.png
new file mode 100755
index 0000000..e818e46
Binary files /dev/null and b/heimdall/config/www/icons/netboot.png differ
diff --git a/heimdall/config/www/icons/netbox.png b/heimdall/config/www/icons/netbox.png
new file mode 100755
index 0000000..9682d13
Binary files /dev/null and b/heimdall/config/www/icons/netbox.png differ
diff --git a/heimdall/config/www/icons/netdata.png b/heimdall/config/www/icons/netdata.png
new file mode 100755
index 0000000..297cee5
Binary files /dev/null and b/heimdall/config/www/icons/netdata.png differ
diff --git a/heimdall/config/www/icons/netdata.svg b/heimdall/config/www/icons/netdata.svg
new file mode 100755
index 0000000..c1d2c8a
--- /dev/null
+++ b/heimdall/config/www/icons/netdata.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/heimdall/config/www/icons/nextcloud.png b/heimdall/config/www/icons/nextcloud.png
new file mode 100755
index 0000000..4c84a3c
Binary files /dev/null and b/heimdall/config/www/icons/nextcloud.png differ
diff --git a/heimdall/config/www/icons/nextcloud.svg b/heimdall/config/www/icons/nextcloud.svg
new file mode 100755
index 0000000..95cf68c
--- /dev/null
+++ b/heimdall/config/www/icons/nextcloud.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/heimdall/config/www/icons/nginxproxymanager.png b/heimdall/config/www/icons/nginxproxymanager.png
new file mode 100755
index 0000000..7c5b28a
Binary files /dev/null and b/heimdall/config/www/icons/nginxproxymanager.png differ
diff --git a/heimdall/config/www/icons/nitter.svg b/heimdall/config/www/icons/nitter.svg
new file mode 100755
index 0000000..cd9a061
--- /dev/null
+++ b/heimdall/config/www/icons/nitter.svg
@@ -0,0 +1,56 @@
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
diff --git a/heimdall/config/www/icons/nodered.png b/heimdall/config/www/icons/nodered.png
new file mode 100755
index 0000000..4dad86e
Binary files /dev/null and b/heimdall/config/www/icons/nodered.png differ
diff --git a/heimdall/config/www/icons/nowshowing.png b/heimdall/config/www/icons/nowshowing.png
new file mode 100755
index 0000000..06d5c74
Binary files /dev/null and b/heimdall/config/www/icons/nowshowing.png differ
diff --git a/heimdall/config/www/icons/nxfilter.png b/heimdall/config/www/icons/nxfilter.png
new file mode 100755
index 0000000..eaa26e7
Binary files /dev/null and b/heimdall/config/www/icons/nxfilter.png differ
diff --git a/heimdall/config/www/icons/nzbget.png b/heimdall/config/www/icons/nzbget.png
new file mode 100755
index 0000000..a44c575
Binary files /dev/null and b/heimdall/config/www/icons/nzbget.png differ
diff --git a/heimdall/config/www/icons/nzbhydra.png b/heimdall/config/www/icons/nzbhydra.png
new file mode 100755
index 0000000..1a3cd8e
Binary files /dev/null and b/heimdall/config/www/icons/nzbhydra.png differ
diff --git a/heimdall/config/www/icons/octoprint.png b/heimdall/config/www/icons/octoprint.png
new file mode 100755
index 0000000..41f1093
Binary files /dev/null and b/heimdall/config/www/icons/octoprint.png differ
diff --git a/heimdall/config/www/icons/ombi.png b/heimdall/config/www/icons/ombi.png
new file mode 100755
index 0000000..f0d733c
Binary files /dev/null and b/heimdall/config/www/icons/ombi.png differ
diff --git a/heimdall/config/www/icons/omnidb.png b/heimdall/config/www/icons/omnidb.png
new file mode 100755
index 0000000..2456312
Binary files /dev/null and b/heimdall/config/www/icons/omnidb.png differ
diff --git a/heimdall/config/www/icons/onlyoffice.png b/heimdall/config/www/icons/onlyoffice.png
new file mode 100755
index 0000000..9d7f463
Binary files /dev/null and b/heimdall/config/www/icons/onlyoffice.png differ
diff --git a/heimdall/config/www/icons/openhab.png b/heimdall/config/www/icons/openhab.png
new file mode 100755
index 0000000..12031bf
Binary files /dev/null and b/heimdall/config/www/icons/openhab.png differ
diff --git a/heimdall/config/www/icons/openmaptiler.png b/heimdall/config/www/icons/openmaptiler.png
new file mode 100755
index 0000000..ce5d615
Binary files /dev/null and b/heimdall/config/www/icons/openmaptiler.png differ
diff --git a/heimdall/config/www/icons/openmediavault.png b/heimdall/config/www/icons/openmediavault.png
new file mode 100755
index 0000000..29fa840
Binary files /dev/null and b/heimdall/config/www/icons/openmediavault.png differ
diff --git a/heimdall/config/www/icons/openspeedtest.png b/heimdall/config/www/icons/openspeedtest.png
new file mode 100755
index 0000000..633c486
Binary files /dev/null and b/heimdall/config/www/icons/openspeedtest.png differ
diff --git a/heimdall/config/www/icons/opensprinkler.png b/heimdall/config/www/icons/opensprinkler.png
new file mode 100755
index 0000000..555a135
Binary files /dev/null and b/heimdall/config/www/icons/opensprinkler.png differ
diff --git a/heimdall/config/www/icons/openwrt.png b/heimdall/config/www/icons/openwrt.png
new file mode 100755
index 0000000..5b3bc89
Binary files /dev/null and b/heimdall/config/www/icons/openwrt.png differ
diff --git a/heimdall/config/www/icons/opnsense.png b/heimdall/config/www/icons/opnsense.png
new file mode 100755
index 0000000..887280e
Binary files /dev/null and b/heimdall/config/www/icons/opnsense.png differ
diff --git a/heimdall/config/www/icons/oscarr.svg b/heimdall/config/www/icons/oscarr.svg
new file mode 100755
index 0000000..ef1e32b
--- /dev/null
+++ b/heimdall/config/www/icons/oscarr.svg
@@ -0,0 +1,38 @@
+
+
+
+
+Created by potrace 1.11, written by Peter Selinger 2001-2013
+
+
+
+
+
+
+
diff --git a/heimdall/config/www/icons/osticket.png b/heimdall/config/www/icons/osticket.png
new file mode 100755
index 0000000..cc9f77b
Binary files /dev/null and b/heimdall/config/www/icons/osticket.png differ
diff --git a/heimdall/config/www/icons/overseerr.png b/heimdall/config/www/icons/overseerr.png
new file mode 100755
index 0000000..e0f5ed6
Binary files /dev/null and b/heimdall/config/www/icons/overseerr.png differ
diff --git a/heimdall/config/www/icons/owncloud.png b/heimdall/config/www/icons/owncloud.png
new file mode 100755
index 0000000..a780061
Binary files /dev/null and b/heimdall/config/www/icons/owncloud.png differ
diff --git a/heimdall/config/www/icons/ownphotos.png b/heimdall/config/www/icons/ownphotos.png
new file mode 100755
index 0000000..1877a78
Binary files /dev/null and b/heimdall/config/www/icons/ownphotos.png differ
diff --git a/heimdall/config/www/icons/paloaltonetworks.png b/heimdall/config/www/icons/paloaltonetworks.png
new file mode 100755
index 0000000..84c9c77
Binary files /dev/null and b/heimdall/config/www/icons/paloaltonetworks.png differ
diff --git a/heimdall/config/www/icons/paperless.png b/heimdall/config/www/icons/paperless.png
new file mode 100755
index 0000000..f952800
Binary files /dev/null and b/heimdall/config/www/icons/paperless.png differ
diff --git a/heimdall/config/www/icons/paperlessngx.svg b/heimdall/config/www/icons/paperlessngx.svg
new file mode 100755
index 0000000..70e711e
--- /dev/null
+++ b/heimdall/config/www/icons/paperlessngx.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/heimdall/config/www/icons/partkeepr.png b/heimdall/config/www/icons/partkeepr.png
new file mode 100755
index 0000000..d59dd45
Binary files /dev/null and b/heimdall/config/www/icons/partkeepr.png differ
diff --git a/heimdall/config/www/icons/peertube.png b/heimdall/config/www/icons/peertube.png
new file mode 100755
index 0000000..4c201d2
Binary files /dev/null and b/heimdall/config/www/icons/peertube.png differ
diff --git a/heimdall/config/www/icons/pfsense.svg b/heimdall/config/www/icons/pfsense.svg
new file mode 100755
index 0000000..f6d4b47
--- /dev/null
+++ b/heimdall/config/www/icons/pfsense.svg
@@ -0,0 +1,7 @@
+
+
+pfSense Logo
+
+
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/icons/pgadmin.png b/heimdall/config/www/icons/pgadmin.png
new file mode 100755
index 0000000..da334fe
Binary files /dev/null and b/heimdall/config/www/icons/pgadmin.png differ
diff --git a/heimdall/config/www/icons/photonix.png b/heimdall/config/www/icons/photonix.png
new file mode 100755
index 0000000..1eff863
Binary files /dev/null and b/heimdall/config/www/icons/photonix.png differ
diff --git a/heimdall/config/www/icons/photoprism.png b/heimdall/config/www/icons/photoprism.png
new file mode 100755
index 0000000..b832557
Binary files /dev/null and b/heimdall/config/www/icons/photoprism.png differ
diff --git a/heimdall/config/www/icons/phpipam.jpeg b/heimdall/config/www/icons/phpipam.jpeg
new file mode 100755
index 0000000..26f644d
Binary files /dev/null and b/heimdall/config/www/icons/phpipam.jpeg differ
diff --git a/heimdall/config/www/icons/phpipam.png b/heimdall/config/www/icons/phpipam.png
new file mode 100755
index 0000000..9c01fdf
Binary files /dev/null and b/heimdall/config/www/icons/phpipam.png differ
diff --git a/heimdall/config/www/icons/phpldapadmin.png b/heimdall/config/www/icons/phpldapadmin.png
new file mode 100755
index 0000000..a95539e
Binary files /dev/null and b/heimdall/config/www/icons/phpldapadmin.png differ
diff --git a/heimdall/config/www/icons/phpmyadmin.png b/heimdall/config/www/icons/phpmyadmin.png
new file mode 100755
index 0000000..e8672ae
Binary files /dev/null and b/heimdall/config/www/icons/phpmyadmin.png differ
diff --git a/heimdall/config/www/icons/piaware.png b/heimdall/config/www/icons/piaware.png
new file mode 100755
index 0000000..7cfc49e
Binary files /dev/null and b/heimdall/config/www/icons/piaware.png differ
diff --git a/heimdall/config/www/icons/pihole.png b/heimdall/config/www/icons/pihole.png
new file mode 100755
index 0000000..93b6b3c
Binary files /dev/null and b/heimdall/config/www/icons/pihole.png differ
diff --git a/heimdall/config/www/icons/pivpn.png b/heimdall/config/www/icons/pivpn.png
new file mode 100755
index 0000000..af9d396
Binary files /dev/null and b/heimdall/config/www/icons/pivpn.png differ
diff --git a/heimdall/config/www/icons/piwigo.png b/heimdall/config/www/icons/piwigo.png
new file mode 100755
index 0000000..fe7b4fe
Binary files /dev/null and b/heimdall/config/www/icons/piwigo.png differ
diff --git a/heimdall/config/www/icons/pleroma.png b/heimdall/config/www/icons/pleroma.png
new file mode 100755
index 0000000..1c1db0e
Binary files /dev/null and b/heimdall/config/www/icons/pleroma.png differ
diff --git a/heimdall/config/www/icons/plesk.png b/heimdall/config/www/icons/plesk.png
new file mode 100755
index 0000000..b432186
Binary files /dev/null and b/heimdall/config/www/icons/plesk.png differ
diff --git a/heimdall/config/www/icons/plex.png b/heimdall/config/www/icons/plex.png
new file mode 100755
index 0000000..08eb2c6
Binary files /dev/null and b/heimdall/config/www/icons/plex.png differ
diff --git a/heimdall/config/www/icons/plexrequests.png b/heimdall/config/www/icons/plexrequests.png
new file mode 100755
index 0000000..fd431e7
Binary files /dev/null and b/heimdall/config/www/icons/plexrequests.png differ
diff --git a/heimdall/config/www/icons/plume.png b/heimdall/config/www/icons/plume.png
new file mode 100755
index 0000000..d8946ac
Binary files /dev/null and b/heimdall/config/www/icons/plume.png differ
diff --git a/heimdall/config/www/icons/portainer.png b/heimdall/config/www/icons/portainer.png
new file mode 100755
index 0000000..77eca35
Binary files /dev/null and b/heimdall/config/www/icons/portainer.png differ
diff --git a/heimdall/config/www/icons/portainer.svg b/heimdall/config/www/icons/portainer.svg
new file mode 100755
index 0000000..b488eb2
--- /dev/null
+++ b/heimdall/config/www/icons/portainer.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/heimdall/config/www/icons/printer.png b/heimdall/config/www/icons/printer.png
new file mode 100755
index 0000000..9cbfba4
Binary files /dev/null and b/heimdall/config/www/icons/printer.png differ
diff --git a/heimdall/config/www/icons/privatebin.png b/heimdall/config/www/icons/privatebin.png
new file mode 100755
index 0000000..cd4f186
Binary files /dev/null and b/heimdall/config/www/icons/privatebin.png differ
diff --git a/heimdall/config/www/icons/projectsend.png b/heimdall/config/www/icons/projectsend.png
new file mode 100755
index 0000000..81f4004
Binary files /dev/null and b/heimdall/config/www/icons/projectsend.png differ
diff --git a/heimdall/config/www/icons/prometheus.png b/heimdall/config/www/icons/prometheus.png
new file mode 100755
index 0000000..2f902cc
Binary files /dev/null and b/heimdall/config/www/icons/prometheus.png differ
diff --git a/heimdall/config/www/icons/prowlarr.png b/heimdall/config/www/icons/prowlarr.png
new file mode 100755
index 0000000..1045c03
Binary files /dev/null and b/heimdall/config/www/icons/prowlarr.png differ
diff --git a/heimdall/config/www/icons/proxmox.png b/heimdall/config/www/icons/proxmox.png
new file mode 100755
index 0000000..3310ce0
Binary files /dev/null and b/heimdall/config/www/icons/proxmox.png differ
diff --git a/heimdall/config/www/icons/proxmox.svg b/heimdall/config/www/icons/proxmox.svg
new file mode 100755
index 0000000..a7a9feb
--- /dev/null
+++ b/heimdall/config/www/icons/proxmox.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/heimdall/config/www/icons/prtg.png b/heimdall/config/www/icons/prtg.png
new file mode 100755
index 0000000..3dc1690
Binary files /dev/null and b/heimdall/config/www/icons/prtg.png differ
diff --git a/heimdall/config/www/icons/psitransfer.png b/heimdall/config/www/icons/psitransfer.png
new file mode 100755
index 0000000..3b58b49
Binary files /dev/null and b/heimdall/config/www/icons/psitransfer.png differ
diff --git a/heimdall/config/www/icons/pterodactyl.png b/heimdall/config/www/icons/pterodactyl.png
new file mode 100755
index 0000000..47c1ba6
Binary files /dev/null and b/heimdall/config/www/icons/pterodactyl.png differ
diff --git a/heimdall/config/www/icons/pyload.png b/heimdall/config/www/icons/pyload.png
new file mode 100755
index 0000000..33712cc
Binary files /dev/null and b/heimdall/config/www/icons/pyload.png differ
diff --git a/heimdall/config/www/icons/q65MV7QJQcTwzXvX7wjh8LQOToASxFdSEbWdGUVp.png b/heimdall/config/www/icons/q65MV7QJQcTwzXvX7wjh8LQOToASxFdSEbWdGUVp.png
new file mode 100755
index 0000000..1902009
Binary files /dev/null and b/heimdall/config/www/icons/q65MV7QJQcTwzXvX7wjh8LQOToASxFdSEbWdGUVp.png differ
diff --git a/heimdall/config/www/icons/qbittorrent.png b/heimdall/config/www/icons/qbittorrent.png
new file mode 100755
index 0000000..d85cb60
Binary files /dev/null and b/heimdall/config/www/icons/qbittorrent.png differ
diff --git a/heimdall/config/www/icons/qbittorrent.svg b/heimdall/config/www/icons/qbittorrent.svg
new file mode 100755
index 0000000..b56bffb
--- /dev/null
+++ b/heimdall/config/www/icons/qbittorrent.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/heimdall/config/www/icons/qnap.png b/heimdall/config/www/icons/qnap.png
new file mode 100755
index 0000000..c7aefdb
Binary files /dev/null and b/heimdall/config/www/icons/qnap.png differ
diff --git a/heimdall/config/www/icons/r8X1ikRc6hsUsGoY7GeLL7oBb1pqMgau5GKHFy71.png b/heimdall/config/www/icons/r8X1ikRc6hsUsGoY7GeLL7oBb1pqMgau5GKHFy71.png
new file mode 100755
index 0000000..38182d2
Binary files /dev/null and b/heimdall/config/www/icons/r8X1ikRc6hsUsGoY7GeLL7oBb1pqMgau5GKHFy71.png differ
diff --git a/heimdall/config/www/icons/radarr.png b/heimdall/config/www/icons/radarr.png
new file mode 100755
index 0000000..5603d63
Binary files /dev/null and b/heimdall/config/www/icons/radarr.png differ
diff --git a/heimdall/config/www/icons/radarr.svg b/heimdall/config/www/icons/radarr.svg
new file mode 100755
index 0000000..6d7a2f5
--- /dev/null
+++ b/heimdall/config/www/icons/radarr.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/heimdall/config/www/icons/rainloop.png b/heimdall/config/www/icons/rainloop.png
new file mode 100755
index 0000000..1cb320c
Binary files /dev/null and b/heimdall/config/www/icons/rainloop.png differ
diff --git a/heimdall/config/www/icons/rancher.png b/heimdall/config/www/icons/rancher.png
new file mode 100755
index 0000000..1455e83
Binary files /dev/null and b/heimdall/config/www/icons/rancher.png differ
diff --git a/heimdall/config/www/icons/raneto.png b/heimdall/config/www/icons/raneto.png
new file mode 100755
index 0000000..2cb676b
Binary files /dev/null and b/heimdall/config/www/icons/raneto.png differ
diff --git a/heimdall/config/www/icons/rclone.png b/heimdall/config/www/icons/rclone.png
new file mode 100755
index 0000000..2060f5c
Binary files /dev/null and b/heimdall/config/www/icons/rclone.png differ
diff --git a/heimdall/config/www/icons/readarr.png b/heimdall/config/www/icons/readarr.png
new file mode 100755
index 0000000..5cfce49
Binary files /dev/null and b/heimdall/config/www/icons/readarr.png differ
diff --git a/heimdall/config/www/icons/recalbox.png b/heimdall/config/www/icons/recalbox.png
new file mode 100755
index 0000000..9e3e111
Binary files /dev/null and b/heimdall/config/www/icons/recalbox.png differ
diff --git a/heimdall/config/www/icons/requestrr.png b/heimdall/config/www/icons/requestrr.png
new file mode 100755
index 0000000..5bc1d3a
Binary files /dev/null and b/heimdall/config/www/icons/requestrr.png differ
diff --git a/heimdall/config/www/icons/resiliosync.png b/heimdall/config/www/icons/resiliosync.png
new file mode 100755
index 0000000..1a1c56a
Binary files /dev/null and b/heimdall/config/www/icons/resiliosync.png differ
diff --git a/heimdall/config/www/icons/riotweb.svg b/heimdall/config/www/icons/riotweb.svg
new file mode 100755
index 0000000..d0e0ddd
--- /dev/null
+++ b/heimdall/config/www/icons/riotweb.svg
@@ -0,0 +1,26 @@
+
+
+
+
+
+
+
diff --git a/heimdall/config/www/icons/rocketchat.png b/heimdall/config/www/icons/rocketchat.png
new file mode 100755
index 0000000..11b8122
Binary files /dev/null and b/heimdall/config/www/icons/rocketchat.png differ
diff --git a/heimdall/config/www/icons/rompya.png b/heimdall/config/www/icons/rompya.png
new file mode 100755
index 0000000..4e774b6
Binary files /dev/null and b/heimdall/config/www/icons/rompya.png differ
diff --git a/heimdall/config/www/icons/roundcube.png b/heimdall/config/www/icons/roundcube.png
new file mode 100755
index 0000000..e1ad5a6
Binary files /dev/null and b/heimdall/config/www/icons/roundcube.png differ
diff --git a/heimdall/config/www/icons/router.png b/heimdall/config/www/icons/router.png
new file mode 100755
index 0000000..4478b5f
Binary files /dev/null and b/heimdall/config/www/icons/router.png differ
diff --git a/heimdall/config/www/icons/rspamd.png b/heimdall/config/www/icons/rspamd.png
new file mode 100755
index 0000000..fcbc8b7
Binary files /dev/null and b/heimdall/config/www/icons/rspamd.png differ
diff --git a/heimdall/config/www/icons/rstudioserver.png b/heimdall/config/www/icons/rstudioserver.png
new file mode 100755
index 0000000..65b6080
Binary files /dev/null and b/heimdall/config/www/icons/rstudioserver.png differ
diff --git a/heimdall/config/www/icons/rundeck.png b/heimdall/config/www/icons/rundeck.png
new file mode 100755
index 0000000..739822e
Binary files /dev/null and b/heimdall/config/www/icons/rundeck.png differ
diff --git a/heimdall/config/www/icons/runeaudio.png b/heimdall/config/www/icons/runeaudio.png
new file mode 100755
index 0000000..e5e488e
Binary files /dev/null and b/heimdall/config/www/icons/runeaudio.png differ
diff --git a/heimdall/config/www/icons/rutorrent.png b/heimdall/config/www/icons/rutorrent.png
new file mode 100755
index 0000000..0b52230
Binary files /dev/null and b/heimdall/config/www/icons/rutorrent.png differ
diff --git a/heimdall/config/www/icons/sabnzbd.png b/heimdall/config/www/icons/sabnzbd.png
new file mode 100755
index 0000000..acf3d27
Binary files /dev/null and b/heimdall/config/www/icons/sabnzbd.png differ
diff --git a/heimdall/config/www/icons/seafile.png b/heimdall/config/www/icons/seafile.png
new file mode 100755
index 0000000..d491c6e
Binary files /dev/null and b/heimdall/config/www/icons/seafile.png differ
diff --git a/heimdall/config/www/icons/searxmetasearchengine.png b/heimdall/config/www/icons/searxmetasearchengine.png
new file mode 100755
index 0000000..9427900
Binary files /dev/null and b/heimdall/config/www/icons/searxmetasearchengine.png differ
diff --git a/heimdall/config/www/icons/serviio.png b/heimdall/config/www/icons/serviio.png
new file mode 100755
index 0000000..58e964c
Binary files /dev/null and b/heimdall/config/www/icons/serviio.png differ
diff --git a/heimdall/config/www/icons/shaarli.png b/heimdall/config/www/icons/shaarli.png
new file mode 100755
index 0000000..25e6d43
Binary files /dev/null and b/heimdall/config/www/icons/shaarli.png differ
diff --git a/heimdall/config/www/icons/shinobi.png b/heimdall/config/www/icons/shinobi.png
new file mode 100755
index 0000000..a1089d0
Binary files /dev/null and b/heimdall/config/www/icons/shinobi.png differ
diff --git a/heimdall/config/www/icons/sickbeard.png b/heimdall/config/www/icons/sickbeard.png
new file mode 100755
index 0000000..aca2249
Binary files /dev/null and b/heimdall/config/www/icons/sickbeard.png differ
diff --git a/heimdall/config/www/icons/sickchill.png b/heimdall/config/www/icons/sickchill.png
new file mode 100755
index 0000000..aaeb508
Binary files /dev/null and b/heimdall/config/www/icons/sickchill.png differ
diff --git a/heimdall/config/www/icons/sickgear.png b/heimdall/config/www/icons/sickgear.png
new file mode 100755
index 0000000..1c2393f
Binary files /dev/null and b/heimdall/config/www/icons/sickgear.png differ
diff --git a/heimdall/config/www/icons/slack.png b/heimdall/config/www/icons/slack.png
new file mode 100755
index 0000000..f0d1af7
Binary files /dev/null and b/heimdall/config/www/icons/slack.png differ
diff --git a/heimdall/config/www/icons/snibox.png b/heimdall/config/www/icons/snibox.png
new file mode 100755
index 0000000..9844ee2
Binary files /dev/null and b/heimdall/config/www/icons/snibox.png differ
diff --git a/heimdall/config/www/icons/sogo.svg b/heimdall/config/www/icons/sogo.svg
new file mode 100755
index 0000000..8411e9c
--- /dev/null
+++ b/heimdall/config/www/icons/sogo.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/heimdall/config/www/icons/sonarqube.png b/heimdall/config/www/icons/sonarqube.png
new file mode 100755
index 0000000..ab0e40d
Binary files /dev/null and b/heimdall/config/www/icons/sonarqube.png differ
diff --git a/heimdall/config/www/icons/sonarr.png b/heimdall/config/www/icons/sonarr.png
new file mode 100755
index 0000000..33e3446
Binary files /dev/null and b/heimdall/config/www/icons/sonarr.png differ
diff --git a/heimdall/config/www/icons/sourcegraph.png b/heimdall/config/www/icons/sourcegraph.png
new file mode 100755
index 0000000..e5c68bf
Binary files /dev/null and b/heimdall/config/www/icons/sourcegraph.png differ
diff --git a/heimdall/config/www/icons/splunk.png b/heimdall/config/www/icons/splunk.png
new file mode 100755
index 0000000..33e09f5
Binary files /dev/null and b/heimdall/config/www/icons/splunk.png differ
diff --git a/heimdall/config/www/icons/spotweb.png b/heimdall/config/www/icons/spotweb.png
new file mode 100755
index 0000000..29d1957
Binary files /dev/null and b/heimdall/config/www/icons/spotweb.png differ
diff --git a/heimdall/config/www/icons/squidex.png b/heimdall/config/www/icons/squidex.png
new file mode 100755
index 0000000..55546e2
Binary files /dev/null and b/heimdall/config/www/icons/squidex.png differ
diff --git a/heimdall/config/www/icons/stash.png b/heimdall/config/www/icons/stash.png
new file mode 100755
index 0000000..6ff0465
Binary files /dev/null and b/heimdall/config/www/icons/stash.png differ
diff --git a/heimdall/config/www/icons/statping.png b/heimdall/config/www/icons/statping.png
new file mode 100755
index 0000000..6497a68
Binary files /dev/null and b/heimdall/config/www/icons/statping.png differ
diff --git a/heimdall/config/www/icons/stirlingpdf.svg b/heimdall/config/www/icons/stirlingpdf.svg
new file mode 100755
index 0000000..2de1840
--- /dev/null
+++ b/heimdall/config/www/icons/stirlingpdf.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/heimdall/config/www/icons/strapi.png b/heimdall/config/www/icons/strapi.png
new file mode 100755
index 0000000..0560716
Binary files /dev/null and b/heimdall/config/www/icons/strapi.png differ
diff --git a/heimdall/config/www/icons/streama.png b/heimdall/config/www/icons/streama.png
new file mode 100755
index 0000000..19a70a4
Binary files /dev/null and b/heimdall/config/www/icons/streama.png differ
diff --git a/heimdall/config/www/icons/sympa.svg b/heimdall/config/www/icons/sympa.svg
new file mode 100755
index 0000000..d11760a
--- /dev/null
+++ b/heimdall/config/www/icons/sympa.svg
@@ -0,0 +1,463 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/heimdall/config/www/icons/synclounge.png b/heimdall/config/www/icons/synclounge.png
new file mode 100755
index 0000000..e78c34f
Binary files /dev/null and b/heimdall/config/www/icons/synclounge.png differ
diff --git a/heimdall/config/www/icons/syncthing.png b/heimdall/config/www/icons/syncthing.png
new file mode 100755
index 0000000..0f0f9e9
Binary files /dev/null and b/heimdall/config/www/icons/syncthing.png differ
diff --git a/heimdall/config/www/icons/synology.png b/heimdall/config/www/icons/synology.png
new file mode 100755
index 0000000..53b23d3
Binary files /dev/null and b/heimdall/config/www/icons/synology.png differ
diff --git a/heimdall/config/www/icons/taiga.png b/heimdall/config/www/icons/taiga.png
new file mode 100755
index 0000000..c28e86a
Binary files /dev/null and b/heimdall/config/www/icons/taiga.png differ
diff --git a/heimdall/config/www/icons/tandoorrecipes.png b/heimdall/config/www/icons/tandoorrecipes.png
new file mode 100755
index 0000000..3208e45
Binary files /dev/null and b/heimdall/config/www/icons/tandoorrecipes.png differ
diff --git a/heimdall/config/www/icons/tar1090.png b/heimdall/config/www/icons/tar1090.png
new file mode 100755
index 0000000..bc06392
Binary files /dev/null and b/heimdall/config/www/icons/tar1090.png differ
diff --git a/heimdall/config/www/icons/tasmoadmin.png b/heimdall/config/www/icons/tasmoadmin.png
new file mode 100755
index 0000000..26db0c9
Binary files /dev/null and b/heimdall/config/www/icons/tasmoadmin.png differ
diff --git a/heimdall/config/www/icons/tasmota.png b/heimdall/config/www/icons/tasmota.png
new file mode 100755
index 0000000..49739fe
Binary files /dev/null and b/heimdall/config/www/icons/tasmota.png differ
diff --git a/heimdall/config/www/icons/tautulli.png b/heimdall/config/www/icons/tautulli.png
new file mode 100755
index 0000000..439704b
Binary files /dev/null and b/heimdall/config/www/icons/tautulli.png differ
diff --git a/heimdall/config/www/icons/tdarr.png b/heimdall/config/www/icons/tdarr.png
new file mode 100755
index 0000000..71e8804
Binary files /dev/null and b/heimdall/config/www/icons/tdarr.png differ
diff --git a/heimdall/config/www/icons/teedy.png b/heimdall/config/www/icons/teedy.png
new file mode 100755
index 0000000..c9a9ca3
Binary files /dev/null and b/heimdall/config/www/icons/teedy.png differ
diff --git a/heimdall/config/www/icons/thelounge.png b/heimdall/config/www/icons/thelounge.png
new file mode 100755
index 0000000..5c05d50
Binary files /dev/null and b/heimdall/config/www/icons/thelounge.png differ
diff --git a/heimdall/config/www/icons/tinytinyrss.png b/heimdall/config/www/icons/tinytinyrss.png
new file mode 100755
index 0000000..36fc8d6
Binary files /dev/null and b/heimdall/config/www/icons/tinytinyrss.png differ
diff --git a/heimdall/config/www/icons/traccar.png b/heimdall/config/www/icons/traccar.png
new file mode 100755
index 0000000..98b53dc
Binary files /dev/null and b/heimdall/config/www/icons/traccar.png differ
diff --git a/heimdall/config/www/icons/traefik.png b/heimdall/config/www/icons/traefik.png
new file mode 100755
index 0000000..45438b3
Binary files /dev/null and b/heimdall/config/www/icons/traefik.png differ
diff --git a/heimdall/config/www/icons/transmission.png b/heimdall/config/www/icons/transmission.png
new file mode 100755
index 0000000..f24d9e3
Binary files /dev/null and b/heimdall/config/www/icons/transmission.png differ
diff --git a/heimdall/config/www/icons/transmission.svg b/heimdall/config/www/icons/transmission.svg
new file mode 100755
index 0000000..955f3e3
--- /dev/null
+++ b/heimdall/config/www/icons/transmission.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/heimdall/config/www/icons/trilium.png b/heimdall/config/www/icons/trilium.png
new file mode 100755
index 0000000..927755f
Binary files /dev/null and b/heimdall/config/www/icons/trilium.png differ
diff --git a/heimdall/config/www/icons/truenas.png b/heimdall/config/www/icons/truenas.png
new file mode 100755
index 0000000..1ea9216
Binary files /dev/null and b/heimdall/config/www/icons/truenas.png differ
diff --git a/heimdall/config/www/icons/truenascore.png b/heimdall/config/www/icons/truenascore.png
new file mode 100755
index 0000000..6ead508
Binary files /dev/null and b/heimdall/config/www/icons/truenascore.png differ
diff --git a/heimdall/config/www/icons/tvheadend.png b/heimdall/config/www/icons/tvheadend.png
new file mode 100755
index 0000000..e118ff2
Binary files /dev/null and b/heimdall/config/www/icons/tvheadend.png differ
diff --git a/heimdall/config/www/icons/typo3.svg b/heimdall/config/www/icons/typo3.svg
new file mode 100755
index 0000000..8aa7472
--- /dev/null
+++ b/heimdall/config/www/icons/typo3.svg
@@ -0,0 +1,77 @@
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/heimdall/config/www/icons/ubooquity.png b/heimdall/config/www/icons/ubooquity.png
new file mode 100755
index 0000000..cf37a87
Binary files /dev/null and b/heimdall/config/www/icons/ubooquity.png differ
diff --git a/heimdall/config/www/icons/unifi.png b/heimdall/config/www/icons/unifi.png
new file mode 100755
index 0000000..7eaa608
Binary files /dev/null and b/heimdall/config/www/icons/unifi.png differ
diff --git a/heimdall/config/www/icons/unraid.png b/heimdall/config/www/icons/unraid.png
new file mode 100755
index 0000000..c9f2244
Binary files /dev/null and b/heimdall/config/www/icons/unraid.png differ
diff --git a/heimdall/config/www/icons/uptimekuma.svg b/heimdall/config/www/icons/uptimekuma.svg
new file mode 100755
index 0000000..9bfa082
--- /dev/null
+++ b/heimdall/config/www/icons/uptimekuma.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/heimdall/config/www/icons/urbackup.png b/heimdall/config/www/icons/urbackup.png
new file mode 100755
index 0000000..ffcbf5a
Binary files /dev/null and b/heimdall/config/www/icons/urbackup.png differ
diff --git a/heimdall/config/www/icons/vimbadmin.jpeg b/heimdall/config/www/icons/vimbadmin.jpeg
new file mode 100755
index 0000000..e3b5556
Binary files /dev/null and b/heimdall/config/www/icons/vimbadmin.jpeg differ
diff --git a/heimdall/config/www/icons/virtualmin.svg b/heimdall/config/www/icons/virtualmin.svg
new file mode 100755
index 0000000..6e9268e
--- /dev/null
+++ b/heimdall/config/www/icons/virtualmin.svg
@@ -0,0 +1,152 @@
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/heimdall/config/www/icons/virtualradarserver.png b/heimdall/config/www/icons/virtualradarserver.png
new file mode 100755
index 0000000..eb97eb7
Binary files /dev/null and b/heimdall/config/www/icons/virtualradarserver.png differ
diff --git a/heimdall/config/www/icons/vmwareesxi.png b/heimdall/config/www/icons/vmwareesxi.png
new file mode 100755
index 0000000..e424995
Binary files /dev/null and b/heimdall/config/www/icons/vmwareesxi.png differ
diff --git a/heimdall/config/www/icons/vmwarehorizon.png b/heimdall/config/www/icons/vmwarehorizon.png
new file mode 100755
index 0000000..a0548b6
Binary files /dev/null and b/heimdall/config/www/icons/vmwarehorizon.png differ
diff --git a/heimdall/config/www/icons/vmwarevcenter.png b/heimdall/config/www/icons/vmwarevcenter.png
new file mode 100755
index 0000000..583642a
Binary files /dev/null and b/heimdall/config/www/icons/vmwarevcenter.png differ
diff --git a/heimdall/config/www/icons/volumio.png b/heimdall/config/www/icons/volumio.png
new file mode 100755
index 0000000..4710107
Binary files /dev/null and b/heimdall/config/www/icons/volumio.png differ
diff --git a/heimdall/config/www/icons/vpUvMvc5QsrMultnGxAX5mAPJ5mH7oZpD7RIKF3V.png b/heimdall/config/www/icons/vpUvMvc5QsrMultnGxAX5mAPJ5mH7oZpD7RIKF3V.png
new file mode 100755
index 0000000..10150bc
Binary files /dev/null and b/heimdall/config/www/icons/vpUvMvc5QsrMultnGxAX5mAPJ5mH7oZpD7RIKF3V.png differ
diff --git a/heimdall/config/www/icons/vuplus.png b/heimdall/config/www/icons/vuplus.png
new file mode 100755
index 0000000..0a9906a
Binary files /dev/null and b/heimdall/config/www/icons/vuplus.png differ
diff --git a/heimdall/config/www/icons/wallabag.png b/heimdall/config/www/icons/wallabag.png
new file mode 100755
index 0000000..65dc607
Binary files /dev/null and b/heimdall/config/www/icons/wallabag.png differ
diff --git a/heimdall/config/www/icons/wanikani.png b/heimdall/config/www/icons/wanikani.png
new file mode 100755
index 0000000..46f6c13
Binary files /dev/null and b/heimdall/config/www/icons/wanikani.png differ
diff --git a/heimdall/config/www/icons/watcher.png b/heimdall/config/www/icons/watcher.png
new file mode 100755
index 0000000..a8956cc
Binary files /dev/null and b/heimdall/config/www/icons/watcher.png differ
diff --git a/heimdall/config/www/icons/watchyourlan.png b/heimdall/config/www/icons/watchyourlan.png
new file mode 100755
index 0000000..cf3e682
Binary files /dev/null and b/heimdall/config/www/icons/watchyourlan.png differ
diff --git a/heimdall/config/www/icons/webmin.svg b/heimdall/config/www/icons/webmin.svg
new file mode 100755
index 0000000..08dfc4e
--- /dev/null
+++ b/heimdall/config/www/icons/webmin.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/heimdall/config/www/icons/webtools.png b/heimdall/config/www/icons/webtools.png
new file mode 100755
index 0000000..25f6527
Binary files /dev/null and b/heimdall/config/www/icons/webtools.png differ
diff --git a/heimdall/config/www/icons/wekan.png b/heimdall/config/www/icons/wekan.png
new file mode 100755
index 0000000..ee96df0
Binary files /dev/null and b/heimdall/config/www/icons/wekan.png differ
diff --git a/heimdall/config/www/icons/wetty.png b/heimdall/config/www/icons/wetty.png
new file mode 100755
index 0000000..554aa49
Binary files /dev/null and b/heimdall/config/www/icons/wetty.png differ
diff --git a/heimdall/config/www/icons/wggenweb.png b/heimdall/config/www/icons/wggenweb.png
new file mode 100755
index 0000000..d23d0e7
Binary files /dev/null and b/heimdall/config/www/icons/wggenweb.png differ
diff --git a/heimdall/config/www/icons/wikijs.png b/heimdall/config/www/icons/wikijs.png
new file mode 100755
index 0000000..261c157
Binary files /dev/null and b/heimdall/config/www/icons/wikijs.png differ
diff --git a/heimdall/config/www/icons/wireguard.png b/heimdall/config/www/icons/wireguard.png
new file mode 100755
index 0000000..3ef3846
Binary files /dev/null and b/heimdall/config/www/icons/wireguard.png differ
diff --git a/heimdall/config/www/icons/wordpress.png b/heimdall/config/www/icons/wordpress.png
new file mode 100755
index 0000000..dc129ab
Binary files /dev/null and b/heimdall/config/www/icons/wordpress.png differ
diff --git a/heimdall/config/www/icons/wordpress.svg b/heimdall/config/www/icons/wordpress.svg
new file mode 100755
index 0000000..a162e31
--- /dev/null
+++ b/heimdall/config/www/icons/wordpress.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/heimdall/config/www/icons/xenorchestra.png b/heimdall/config/www/icons/xenorchestra.png
new file mode 100755
index 0000000..a3f5ce3
Binary files /dev/null and b/heimdall/config/www/icons/xenorchestra.png differ
diff --git a/heimdall/config/www/icons/xigmanas.png b/heimdall/config/www/icons/xigmanas.png
new file mode 100755
index 0000000..7874f03
Binary files /dev/null and b/heimdall/config/www/icons/xigmanas.png differ
diff --git a/heimdall/config/www/icons/xteve.png b/heimdall/config/www/icons/xteve.png
new file mode 100755
index 0000000..e8db599
Binary files /dev/null and b/heimdall/config/www/icons/xteve.png differ
diff --git a/heimdall/config/www/icons/xwiki.png b/heimdall/config/www/icons/xwiki.png
new file mode 100755
index 0000000..30786e5
Binary files /dev/null and b/heimdall/config/www/icons/xwiki.png differ
diff --git a/heimdall/config/www/icons/ynab.png b/heimdall/config/www/icons/ynab.png
new file mode 100755
index 0000000..6347b89
Binary files /dev/null and b/heimdall/config/www/icons/ynab.png differ
diff --git a/heimdall/config/www/icons/youtubedl.png b/heimdall/config/www/icons/youtubedl.png
new file mode 100755
index 0000000..96df033
Binary files /dev/null and b/heimdall/config/www/icons/youtubedl.png differ
diff --git a/heimdall/config/www/icons/zabbix.png b/heimdall/config/www/icons/zabbix.png
new file mode 100755
index 0000000..6378425
Binary files /dev/null and b/heimdall/config/www/icons/zabbix.png differ
diff --git a/heimdall/config/www/icons/zammad.svg b/heimdall/config/www/icons/zammad.svg
new file mode 100755
index 0000000..0685eb7
--- /dev/null
+++ b/heimdall/config/www/icons/zammad.svg
@@ -0,0 +1,30 @@
+
+
+
+ logo
+ Created with Sketch.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/heimdall/config/www/icons/znc.png b/heimdall/config/www/icons/znc.png
new file mode 100755
index 0000000..ae06f47
Binary files /dev/null and b/heimdall/config/www/icons/znc.png differ
diff --git a/heimdall/config/www/icons/zoneminder.png b/heimdall/config/www/icons/zoneminder.png
new file mode 100755
index 0000000..0524140
Binary files /dev/null and b/heimdall/config/www/icons/zoneminder.png differ
diff --git a/heimdall/config/www/icons/zulip.png b/heimdall/config/www/icons/zulip.png
new file mode 100755
index 0000000..09835b8
Binary files /dev/null and b/heimdall/config/www/icons/zulip.png differ
diff --git a/heimdall/config/www/index.html b/heimdall/config/www/index.html
new file mode 100755
index 0000000..8351def
--- /dev/null
+++ b/heimdall/config/www/index.html
@@ -0,0 +1,34 @@
+
+
+ Welcome to our server
+
+
+
+
+
Welcome to our server
+
The website is currently being setup under this address.
+
For help and support, please contact: me@example.com
+
+
+
diff --git a/heimdall/config/www/searchproviders.yaml b/heimdall/config/www/searchproviders.yaml
new file mode 100755
index 0000000..bbb13d6
--- /dev/null
+++ b/heimdall/config/www/searchproviders.yaml
@@ -0,0 +1,44 @@
+tiles:
+ id: tiles
+ name: Tiles
+ target: _blank
+
+baidu:
+ id: baidu
+ url: https://www.baidu.com/s
+ name: Baidu
+ method: get
+ target: _blank
+ query: wd
+
+bing:
+ id: bing
+ url: https://www.bing.com/search
+ name: Bing
+ method: get
+ target: _blank
+ query: q
+
+ddg:
+ id: ddg
+ url: https://duckduckgo.com/
+ name: DuckDuckGo
+ method: get
+ target: _blank
+ query: q
+
+google:
+ id: google
+ url: https://www.google.com/search
+ name: Google
+ method: get
+ target: _blank
+ query: q
+
+startpage:
+ id: startpage
+ url: https://www.startpage.com/do/dsearch
+ name: Startpage
+ method: get
+ target: _blank
+ query: query
diff --git a/heimdall/docker-compose.yaml b/heimdall/docker-compose.yaml
new file mode 100644
index 0000000..a72bbe8
--- /dev/null
+++ b/heimdall/docker-compose.yaml
@@ -0,0 +1,16 @@
+---
+#version: "2.1"
+services:
+ heimdall:
+ image: lscr.io/linuxserver/heimdall:latest
+ container_name: heimdall
+ environment:
+ - PUID=1000
+ - PGID=1000
+ - TZ=Europe/Paris
+ volumes:
+ - ./config:/config
+ ports:
+ - 8002:80
+ - 7843:443
+ restart: unless-stopped